Python单元测试框架unittest使用全解析(文末赠书)

2021-11-16 11:17:31 浏览数 (1)

unittest是Python语言自带的单元测试框架,不仅适用于单元测试,还可以适用于web自动化测试,提供了很多断言方法,可以组织执行测试用例,生成测试结果等。

unittest基础概念

  1. TestCase测试用例,一个TestCase就是一条测试用例。
  2. TestSuite测试套件,多条测试用例集合在一起。TestSuite可以嵌套TestSuite。
  3. TestRunner测试执行,用来执行测试用例套件。
  4. TestFixture对一个测试环境的搭建和销毁,被称为一个Fixture,比如数据库连接关闭、测试环境数据清理、启动关闭服务进程。
  5. TestLoaderTestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

测试方法:setUp、tearDown执行每个测试方法都会执行一次setUp、tearDown

类级别:setUpClass、tearDownClass所有测试方法运行前运行后执行,使用@classmethod装饰器,整个测试过程只执行一次。

unittest断言

断言,就是让程序自己判断执行结果是否符合预期。

  • 测试模块引入 import unittest
  • 测试类必须继承 unittest.TestCase
  • 测试方法必须以“test开头”,执行顺序按照开头字符串ASCII码升序执行。
一个简单的unittest使用示例
代码语言:javascript复制
import unittest
class Test(unittest.TestCase):
    def setUp(self) -> None:
        # 每个测试方法前执行
        print("setUp方法")
    def tearDown(self) -> None:
        # 每个测试方法后执行
        print("tearDown方法")
    @classmethod
    def setUpClass(cls) -> None:
        print("setUpClass每个类执行一次")
    @classmethod
    def tearDownClass(cls) -> None:
        print("tearDownClass每个类执行一次")
    def test_01(self):
        a = 1
        b = 2
        c = a   b
        self.assertEqual(c,3)
    def test_02(self):
        a = 2
        b = 3
        c = a*b
        self.assertEqual(c,6)

if __name__ == '__main__':
    # 调用main方法执行unittest内所有test开头的方法
    unittest.main()

加载执行用例的几种方法

main方法
代码语言:javascript复制
if __name__ == '__main__':
    unittest.main()
testsuit方式
代码语言:javascript复制
    suit = unittest.TestSuite()  # 创建suit实例并构造测试用例集
    suit.addTest(Test('test_01'))  # Test为class名;test_01是class中的方法
    suit.addTest(Test('test_02')) # 用例执行顺序,按照加载的顺序执行
    runner = unittest.TextTestRunner()
    # 使用run方法运行测试套件
    runner.run(suit)
testloader方式

加载器TestLoader提供了以下几个方法来查找用例并批量加入测试套件:

  • loadTestsFromTestCase:根据传入的测试类查找用例
  • loadTestsFromName:根据传入的名称查找用例
  • loadTestsFromModule:通过模块名添加该模块内所有的测试用例
代码语言:javascript复制
    suit = unittest.TestSuite()
    loader = unittest.TestLoader() # 创建加载器对象
    suit.addTest(loader.loadTestsFromTestCase(Test)) # 通过测试类加载测试
    runner = unittest.TextTestRunner()
    # # 使用run方法运行测试套件
    runner.run(suit)
discover 路径加载

使用unittest.defaultTestLoader()类,通过该类下面的discover()方法自动搜索指定目录下指定开头 的.py文件,并将查找到的测试用例组装到测试套件。

代码语言:javascript复制
    test_dir='./'
    # test_dir为要指定的目录 ./为当前目录;pattern:为查找的.py文件的格式
    discover = unittest.defaultTestLoader.discover(test_dir,pattern='test_*.py')
    runner = unittest.TextTestRunner()
    runner.run(discover)

unittest的执行结果

  • “.” 表示测试用例执行通过
  • “F” 表示执行失败
  • “E” 表示执行错误
  • "s“ 表示运行跳过

测试报告

单元测试完成后,可以将结果生成HTML测试报告。HTMLTestRunner是Python标准库的unittest模块的一个扩展。它生成易于使用的HTML测试报告。

HTMLTestRunner使用准备

1.下载HTMLTestRunner.py 链接: https://pan.baidu.com/s/1-iLHuHHbpuL1qdV3AMj6bA 提取码: w8og 也可以在github上搜索功能更强大的模板。

2.复制HTMLTestRunner.py文件到项目文件夹或者Python 安装路径下的lib文件夹。

示例

代码语言:javascript复制
import unittest
from HTMLTestRunner import HTMLTestRunner
import time


class Test(unittest.TestCase):
    def setUp(self) -> None:
        # 每个测试方法前执行
        print("setUp方法")

    def tearDown(self) -> None:
        # 每个测试方法后执行
        print("tearDown方法")

    @classmethod
    def setUpClass(cls) -> None:
        print("setUpClass每个类执行一次")

    @classmethod
    def tearDownClass(cls) -> None:
        print("tearDownClass每个类执行一次")

    def test_01(self):
        a = 1
        b = 2
        c = a   b
        self.assertEqual(c, 3)

    def test_02(self):
        a = 2
        b = 3
        c = a * b
        self.assertEqual(c, 5, "不相等")


if __name__ == '__main__':

    test_dir = './'
    # test_dir为要指定的目录 ./为当前目录;pattern:为查找的.py文件的格式
    discover = unittest.defaultTestLoader.discover(test_dir,pattern='test_*.py')
    # 定义报告目录
    file_dir = "./report/"
    # 定义报告名称格式
    now_time = time.strftime("%Y-%m-%d %H_%M_%S")
    # 报告完整路径和名称
    file_name = file_dir   now_time   "Report.html"
    with open(file_name, "wb") as fp:
        # 创建执行对象  是一个HTMLTestRunner的对象  生成测试结果报告内容
        runner = HTMLTestRunner(stream=fp,
                                title="测试报告",
                                description="用例执行情况:",
                                verbosity=2
                                )
        # 执行测试流程
        runner.run(discover)

0 人点赞