51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

测试开发精英班,通向高级软件测试工程师【好消息】企业内训服务上线啦!项目为王,自动化测试提升加速器 !横扫BAT,Python全栈测试开发技能大全
【第122期】:如何入门接口自动化测试!参与调查问卷 缔造行业趋势 月薪15K+的测试开发必备技能? 【活动】为视频UP主打CALL,互动领福利!
查看: 1643|回复: 0

python unittest 上下文使用

[复制链接]
  • TA的每日心情

    2019-12-27 13:32
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]测试营长

    发表于 2021-3-27 14:04:22 | 显示全部楼层 |阅读模式
    unittest核心是通过文件夹等模式把一个个测试对象给添加到测试套件里面,然后进行驱动。

    unittest框架性提供了一些便利,会导致平时写代码根据函数和函数调用顺序,触发的对象在其他测试对象(成员函数内)是不可识别的。

    context是上下文,这里先不考虑使用db例如Redis做缓存和全局对象这种方式,先看看普通类的实现。

    # 加了类名Test,除非用命令行执行,ide里面会判断是一个测试类对象
    class Demo():
       def test_login(self):
          self.user = "maomao"

       def test_start_task(self):
          print(f"{self.user}开始任务")

    if __name__ == '__main__':
       t = Demo()
       t.test_login()
       t.test_start_task()
    可见,只要先调用了test_login(),等于激活了self.user,下面的test_start_task里面的self.user就等于maomao。

    把上面的Demo改成TestDemo,支持unittest来测试下。

    import unittest

    class Demo(unittest.TestCase):
       def test_login(self):
          self.user = "maomao"
       def test_start_task(self):
          print(f"{self.user}开始任务")

    if __name__ == '__main__':
       unittest.main()
    这个会输出 AttributeError: 'Demo' object has no attribute 'user'

    熟悉unittest的都知道他有每个模块,每个类,每个方法(最小测试对象)的前后置函数,每个方法之间的对象是隔离的。

    只要是语言在计算机原理没有变化的情况下,白话来说,往上访问对于当前来说都是共享内存的区域,在方法层面往上访问就是类,共享区域就是类变量,类变量是晚于classmethod需要注意。

    类层面往上访问就是模块,模块共享区域就是模块的__init__.py。

    unittest的函数对象访问顺序是遵循ascii码规则,函数对象名称前面test_a_xxx,test_b_xxx...依次往下就行。

    使用unittest.main()方式去驱动。

    ===================================================

    如果想让test_start_task可以识别到user,就需要把user添加到类变量区域。

    class Demo(unittest.TestCase):
        temp = []
        def test_a_login(self):
           self.user = "maomao"
           self.temp.append(self.user)
        def test_b_start_task(self):
          # 不推荐使用print(f"{self.temp[0]}开始任务1")
           self.user = self.temp.pop()
           print(f"{self.user}开始任务1")
           print(self.temp) #长度为0
    不推荐的原因是[0]毕竟是魔术,可读性低,是不是觉得pop()返回并且清除列表内部的,更像一锤子买卖。

    pop的源码描述,remove and return item at index (default last) 默认是删除最后一个并且返回

    # 上面代码下添加这个
    def test_c_replay_start_task(self):
          print(f"{self.temp[0]}开始任务2")
    结果会发现依然可以识别,由此可见temp在经过test_login()被添加后,temp里面就有了user。

    下标[0]是不符合可读性的,那么Python的字典具备可读性,查询是O(1)的行为,是最合适的,这里完成修改下代码。

    以后包含上下文的都可以用以下代码使用。

    class Demo(unittest.TestCase):
       # 如果上下文需要用到的
       temp = {}

       def test_a_login(self):
          self.user = "maomao"
          self.temp["user"] = self.user

       def test_b_start_task(self):
          print(f'{self.temp["user"]}开始任务1')

       def test_c_replay_start_task(self):
          print(f'{self.temp["user"]}开始任务2')

    if __name__ == '__main__':
       unittest.main()
    PS:unittest也是支持命令行的,-m代表import导入,后面跟着unittest就是导入ut。

    py -3 -m unittest xxx.py
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2021-10-25 05:32 , Processed in 0.053728 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2021 Comsenz Inc.

    快速回复 返回顶部 返回列表