• Python unittest 之二: 测试类的执行


    大家看一段下面的代码

    我们写的程序中有如下的一个 类 Widget, 代表了界面的一个控件,这是我们要测试的类

    class Widget:
     def __init__(self,msg):
     # print(msg)
     self._size = 50,50
    
     def size(self):
     return self._size
    
     def resize(self,w,h):
     self._size = w, h
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    为了方便理解,这个类做的很简单,

    初始化方法里面定义了控件的大小是50像素宽,50像素高。

    记录在属性 _size 中

    size方法返回该控件的长和宽。

    resize改变控件的长和宽。

    现在,我们使用unittest来测试它,测试代码如下所示

    import unittest
    
    class Widget:
        def __init__(self,msg):
            # print(msg)
            self._size = 50,50
    
        def size(self):
            return self._size
    
        def resize(self,w,h):
            self._size = w, h
    
    class WidgetTestCase(unittest.TestCase):
    
        def setUp(self):
            print('in setUp')
            self.widget = Widget('The widget')
    
        def tearDown(self):
            print('in tearDown')
    
        def test_1(self):
            print('in test_1')
            self.assertEqual(self.widget.size(), (50,50),
                             'incorrect default size')
    
        def test_2(self):
            print('in test_2')
            self.widget.resize(100,150)
            self.assertEqual(self.widget.size(), (100,150),
                             'wrong size after resize')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    现在来分析一下代码,我们导入unittest库

    import unittest
    
    • 1

    定义了一个继承自unittest.TestCase 的测试类WidgetTestCase

    class WidgetTestCase(unittest.TestCase)
    
    • 1

    注意,这个类名是可以随便起的,只要继承自WidgetTestCase即可。

    里面有setup, teardown 两个方法,和两个测试方法test_1 , test_2

    注意代表测试方法一定要以test开头,不然不会被认为是测试方法。

    测试需要检查某个结果是否符合预期, 这个检查点 就是通过 TestCase方法的assert系列的函数实现的。

    这里就是assertEqual, 判断前两个参数是否相等,如果相等测试通过,

    如果不相等,测试不通过。显示的错误信息就是第3个参数。

    这些assert系列的函数哪里来的?对了,是父类WidgetTestCase里面的。

    而 setup, teardown 这两个方法就是前面说过的 初始化环境和清除环境的方法,

    这 setup 方法会在该类的每个测试方法执行前先执行

    这 teardown 方法会在该类的每个测试方法执行后执行

    注意是每个测试方法执行前后, 都会 执行一下 setup 和teardown

    我们可以在终端里面执行该测试,执行命令如下

    python -m unittest test1.py
    
    • 1

    执行结果如下

    D:\ut>python -m unittest test1.py
    in setUp
    in test_1
    in tearDown
    .in setUp
    in test_2
    in tearDown
    .
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    OK
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结果是OK 表示全部通过

    看看上面的输出,发现执行次序是:

    先setup
    执行测试方法
    最后 teardown

    如果想看到更详细一些的输出信息,我们可以加上参数 -v

    python -m unittest test1.py -v

    这样会显示当前正在执行的是哪个测试方法,和每个测试方法的执行结果

    D:\ut>python -m unittest test1.py -v
    test_1 (test1.WidgetTestCase) ... in setUp
    in test_1
    in tearDown
    ok
    test_2 (test1.WidgetTestCase) ... in setUp
    in test_2
    in tearDown
    ok
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    OK
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    如果我们修改一下,故意让一个验证出错,比如

    def resize(self,w,h):
     self._size = w, h+6
    
    • 1
    • 2

    执行测试结果就会报错

    D:\gsync\workspace\sq\python\samples\ut>python -m unittest test1.py -v
    
    test_1 (test1.WidgetTestCase) ... in setUp
    in test_1
    in tearDown
    ok
    test_2 (test1.WidgetTestCase) ... in setUp
    in test_2
    in tearDown
    FAIL
    
    ======================================================================
    FAIL: test_2 (test1.WidgetTestCase)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\gsync\workspace\sq\python\samples\ut\test1.py", line 33, in test_2
        'wrong size after resize')
    AssertionError: Tuples differ: (100, 156) != (100, 150)
    
    First differing element 1:
    156
    150
    
    - (100, 156)
    ?         ^
    
    + (100, 150)
    ?         ^
     : wrong size after resize
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    FAILED (failures=1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    注意:只有setup成功,才会执行测试,如果setup失败,就不会执行测试方法了。

    因为unittest框架会认为初识化失败了。

    什么就被认为 setup失败?就是setup里面抛出了异常。

    但是要注意的是: 执行一个测试方法前初始化失败了,

    只是这个测试方法不执行了。

    但是还是会执行下一个测试方法,当然也包括再次执行初始化方法。

    再强调一遍,测试方法必须以test开头,如果不是, 比如tes,就不会被执行

    执行次序

    测试方法的执行次序是由方法名称的 字符串排序决定的,通常是ascii顺序

    本例中就是:test_1 先执行,test_2 后执行

    如果test_1 改为test_case3 ,

    就会test_2 先执行

    最后感谢每一个认真阅读我文章的人,下面这个网盘链接也是我费了几天时间整理的非常全面的,希望也能帮助到有需要的你!

    在这里插入图片描述

    这些资料,对于想转行做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……

    如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以点击下方小卡片加入我们群,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。

    敲字不易,如果此文章对你有帮助的话,点个赞收个藏来个关注,给作者一个鼓励。也方便你下次能够快速查找。

    自学推荐B站视频:

    零基础转行软件测试:38天自学完软件测试,拿到了字节的测试岗offer,堪称B站最好的视频!

    自动化测试进阶:已上岸华为,涨薪20K,2022最适合自学的python自动化测试教程,自己花16800买的,无偿分享

    在这里插入图片描述

  • 相关阅读:
    【尚庭公寓SpringBoot + Vue 项目实战】租约管理(十四)
    运动戴什么耳机好呢、值得信赖的运动耳机推荐
    【C++风云录】开源金融与科技库探索:优化计算与高效分析
    RocketMQ安装部署
    基于java+ssm教学质量评价系统(学生评教)-计算机毕业设计
    【2023年11月第四版教材】专题3 - 10大管理49过程输入、输出、工具和技术总结
    三、python Django模板[jinja2模板]
    k8s-实战——redis集群部署
    java通过socket实现https get 请求网页
    【Java】java | CacheManager | redisCacheManager
  • 原文地址:https://blog.csdn.net/weixin_57805858/article/details/126365747