Unittest 框架

  • 首先要知道这个框架是Python自带的, 不需要安装
  • 这个框架最重要的4 个核心
  1. TestCase
  2. TestSuite
  3. TextTestRunner
  4. Fixture

TestCase

  • 个人总结一下, 这个就是用测试用例继承的, 直接往下看吧

学测试先了解断言把

断言

概念:让程序代替人为判断测试程序执行结果是否符合预期结果的过程

断言分类

布尔型断言 比较断言 复杂断言

  • 看完概念再看一下代码吧好了解一点
  • 先写一个简单测试用例,
import unittest


class TestAdd(unittest.TestCase):

    def test_add(self):
        a = 12
        print("-------- test_add 测试用例-------")
        b = 5
        # assertEqual 这个方法验证arg1=arg2,不相等则fail(报错)
        self.assertEqual(a+b, 17, msg="两个数相加,如果不相同会报错")

    def test_sub(self):
        print("-------- test_sub 测试用例-------")
        a = 12
        b = 5
        # assertNotEqual  这个方法验证arg1=arg2,相等则fail(报错)
        self.assertNotEqual(a+b, 17, msg="两个数相加, 如果等于17会报错")

"""
如果执行的时候,没有写main函数, 直接右键执行的时候记得把,鼠标的光标放到函数的外面,
如果是放到某个函数里只会执行光标所在的那个测试函数
"""

注意点: 必须继承unittest.TestCase类, 测试用例的方法必须以 test 开头, 这点很重要

还有一点就是执行的时候注意:如果执行的时候,没有写main函数, 直接右键执行的时候记得把,鼠标的光标放到函数的外面, 如果是放到某个函数里只会执行光标所在的那个测试函数

  • 这个测试用例只使用了两个布尔型断言,下面列出其他的布尔型断言,使用方法大致一样

断言方法

断言描述

assertEqual(arg1, arg2, msg=None)

验证arg1=arg2,不等则fail

assertNotEqual(arg1, arg2, msg=None)

验证arg1 != arg2, 相等则fail

assertTrue(expr, msg=None)

验证expr是true,如果为false,则fail

assertFalse(expr,msg=None)

验证expr是false,如果为true,则fail

assertIsNone(expr, msg=None)

验证expr是None,不是则fail

assertIsNotNone(expr, msg=None)

验证expr不是None,是则fail

assertIn(arg1, arg2, msg=None)

验证arg1是arg2的子串,不是则fail

mag: 就是显示报错的描述


Fixture

  • 这就是一个概述,对一个测试用例环境的搭建和销毁就是一个Fixture
  • 不是很理解是吧, 直接看代码(个人觉得没必要理解这个名词,知道是干什么的就行)
  • 把下面代码写入到 test_unittest.py文件下
import unittest


class TestAdd(unittest.TestCase):

    def setUp(self):
        """
        方法名固定,在每个测试函数执行前,执行一次,多个测试函数,执行多次
        一般做初始化工作, 比如: 实例化一个浏览器、浏览器最大化、隐式等待设置等需要提前的操作
        :return:
        """
        print("测试函数前执行")

    def tearDown(self):
        """
        方法名固定,在每个测试函数执行后,执行一次
        一般做结束工作: 比如: 推出浏览器、关闭浏览器
        :return:
        """
        print("测试函数执行后 teardown")

    def test_add(self):
        a = 12
        print("-------- test_add 测试用例-------")
        b = 5
        self.assertEqual(a+b, 17, msg="两个数相加,如果不相同会报错")

    def test_sub(self):
        print("-------- test_sub 测试用例-------")
        a = 12
        b = 5
        self.assertNotEqual(a+b, 17, msg="两个数相加, 如果等于17会报错")

"""
使用主函数,调用unittest.main()方法直接执行改文件下的所有测试用例
"""
if __name__ == '__main__':
    unittest.main()

看到代码, 是不是多啦两个方法setUp(self) ,tearDown(self) setUp、tearDown就是一个Fixture

下面讲述第三种执行的方法: 使用run文件执行 创建一个run_unittest.py 文件, 这个文件用来执行其它文件的测试用例 看代码:

import unittest
# 直接导入刚才写好的测试类
from test_unittest import TestAdd

"""
使用run文件执行unittest 文件时, 可以直接导入
这时 unittest 会自动查找导入问价中类去执行
但是文件的开头以test 文件的类和函数也必须以test开头
"""


if __name__ == '__main__':
    unittest.main()


TestSuite 和 TextTestRunner

  • 我是使用run 文件 写的, 创建一个执行文件, 话不多说, 直接看代码, 注释就是解释
import unittest
from test_unittest import TestAdd

"""
使用run文件执行unittest 文件时, 可以直接导入
这时 unittest 会自动查找导入问价中类去执行
但是文件的开头以test 文件的类和函数也必须以test开头
"""

if __name__ == '__main__':
    """
    TestSuite   可以把这个方法看成一个测试集合
    """
    # 先创建一个 TestSuite 的实例化对象
    suite = unittest.TestSuite()
    # 然后在使用 addTest方法把写好的测试用例放到这个对象里
    # suite.addTest(测试类名("方法名")) # 单个添加
    # suite.addTests([测试类名("方法名"),测试类名("方法名"),...])  # 批量添加
    suite.addTest(TestAdd("test_add"))

    """
    TextTestRunner  有创建测试集合的方法,肯定就有执行测试集合的方法
    TextTestRunner 就是用来执行测试集合的
    """
    # 先实例化一个执行集合的 TextTestRunner对象
    runner = unittest.TextTestRunner()
    # 然后执行:  执行对象.run(测试集对象)
    runner.run(suite)

defaultTestLoader 使用

  • 先说一下, 我的测试用例 和 执行文件是在一个目录下的, 直接看代码
import unittest

"""
使用run文件执行unittest 文件时, 可以直接导入
这时 unittest 会自动查找导入问价中类去执行
但是文件的开头以test 文件的类和函数也必须以test开头
"""

if __name__ == '__main__':
    """
    defaultTestLoader
    使用unittest.defaultTestLoader()类, 这个类的作用就是,调用这个类的discover()方法, 搜索指定目录下指定开头的.py文件,
    并将搜索到的测试用例组装成一个测试集合, 听上去是不是和 TestSuite 的作用差不多
    """
    # 先确定一个要搜索的路径
    test_dir = "./"
    # 然后创建集合对象
    dis = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

    # 然后使用 TextTestRunner 运行这个测试集合
    runner = unittest.TextTestRunner()
    runner.run(dis)