zoukankan      html  css  js  c++  java
  • pytest框架中变量作用域

    最近项目组在用pytest框架做接口自动化测试,其中一个同事在测试时碰到了一些问题,在帮他解决这个问题的同时也加强了我对python中可变对象和不可变对象以及pytest框架中变量作用域的理解,故此记录下来。

    先上代码

    import pytest
    
    class Test_demo():
        def setup_class(self):
            self.testStr='111'
    
    
        def test_case1(self):
            self.testStr='222'
    
        def test_case2(self):
            print(self.testStr)
    
    if __name__ =='main':
        pytest.main()

    在最开始的期望中test_case2中的运行结果应该为222,但实际运行结果为111.

    这是因为python中的对象分为可变对象和不可变对象

    可变对象:字典,列表

    不可变对象:int str float 元祖

    所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变。

    这里定义的testStr字符串当被赋值为222时,因为对象内容是不可变的,所以不能在原地址上修改变量的值,而是开辟了一个新的地址空间来存放值222。

    所以此时test_case1中的变量testStr已经指向了222所在的地址,而并非原111所在的地址。

    而在pytest中,test_case2函数再次调用变量testStr时,读取的是setup_class中testStr所指向的地址而并非test_case1中testStr所指向的地址。(这里的具体原因还有待研究)

    所以如果要让一个不可变对象可以在Pytest的任何方法中都可以使用,有一个最讨巧的办法是定义一个非test开头的方法,并在这个方法中改变这个变量。

    上代码:

    import pytest
    
    class Test_demo():
        def setup_class(self):
            self.testStr='111'
            print(id(self.testStr))
    
    
        def case1(self):
            self.testStr='222'
            print(id(self.testStr))
    
        def test_case2(self):
            self.case1()
            print(self.testStr)
            print(id(self.testStr))
            
    
    if __name__ =='main':
        pytest.main()

     

     

  • 相关阅读:
    我是如何学习和工作的(1)
    SQL server事物复制报错:要复制的 LOB 数据的长度(xxxxx)超出了配置的最大值 65536
    SQL Server2012高可用之事物复制(发布订阅)测试
    MySQL参数学习(一)
    Oracle间隔(interval)分区
    oracle异机恢复测试
    使用awrsqrpt.sql查看执行计划demo
    使用10046追踪执行计划demo
    js中call、apply和bind到底有什么区别?
    为什么0.1+0.2=0.30000000000000004
  • 原文地址:https://www.cnblogs.com/qiurp/p/14258740.html
Copyright © 2011-2022 走看看