最近项目组在用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()