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

     

     

  • 相关阅读:
    visual C sharp express from 360 free download
    Druid 在小米公司部分技术实践-博客-云栖社区-阿里云
    公司业务-猫眼知健康
    Sculptor
    可译网 —— 翻译可以更简单
    牛客网-专业IT笔试面试备考平台,最全C++JAVA前端求职题库,全面提升IT编程能力
    设置Redis的LRU策略
    springboot中使用aop技术
    elasticSearch的部署和使用
    jvm原理和代码运行的过程
  • 原文地址:https://www.cnblogs.com/qiurp/p/14258740.html
Copyright © 2011-2022 走看看