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()

 

 

原文地址:https://www.cnblogs.com/qiurp/p/14258740.html