文档:unittest单元测试框架
源代码:Lib/unittest/init.py
安装: pip install unittest
一.unittest概念
unittest 单元测试框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。
二.属性导图
三.核心组件
- test fixture:测试装置(执行测试用例前后的环境准备工作;例如:创建临时或代理的数据库、目录,再或者启动一个服务器进程。)
- testcase:测试用例(新建测试用例。)
- testsuit:测试套件(归档需要一起执行的测试;组合一系列测试用例。)
- test runner:测试运行器(执行和输出测试结果的组件;使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。)
四.属性方法
-
创建测试用例:
写一个类继承 unittest.TestCase 就创建了一个测试样例。类方法的命名都以 test 开头。 这个命名约定告诉测试运行者类的哪些方法表示测试。
-
断言:
[1] 官方文档:断言方法
[2] 常用断言序号 断言方法 断言描述 1 assertEqual(arg1, arg2, msg=None) 验证arg1==arg2,不等则fail 2 assertNotEqual(arg1, arg2, msg=None) 验证arg1 != arg2, 相等则fail 3 assertTrue(expr, msg=None) 验证expr是true,如果为false,则fail 4 assertFalse(expr,msg=None) 验证expr是false,如果为true,则fail 5 assertIs(arg1, arg2, msg=None) 验证arg1、arg2是同一个对象,不是则fail 6 assertIsNot(arg1, arg2, msg=None) 验证arg1、arg2不是同一个对象,是则fail 7 assertIsNone(expr, msg=None) 验证expr是None,不是则fail 8 assertIsNotNone(expr, msg=None)) 验证expr不是None,是则fail 9 assertIn(arg1, arg2, msg=None)) 验证arg1是arg2的子串,不是则fail 10 assertNotIn(arg1, arg2, msg=None) 验证arg1不是arg2的子串,是则fail 11 assertIsInstance(obj, cls, msg=None) 验证obj是cls的实例,不是则fail 12 assertNotIsInstance(obj, cls, msg=None) 验证obj不是cls的实例,是则fail -
setUp() / tearDown() :
可以设置测试方法开始前与完成后需要执行的指令;若 setUp() 方法引发异常,测试框架会认为测试发生了错误,因此测试方法不会被运行。若 setUp() 成功运行,无论测试方法是否成功,都会运行 tearDown() 。这样的一个测试代码运行的环境被称为 test fixture 。
-
setUpClass()/tearDownClass():
在运行单个类中的测试前后调用的类方法。 setUpClass/tearDownClass以类作为唯一参数调用,并且必须修饰为classmethod():
-
unittest.main() :
提供了一个测试脚本的命令行接口。当在命令行运行该测试脚本,上文的脚本格式的输出。
-
跳过测试:
[1] @unittest.skip(reason):跳过被此装饰器装饰的测试。 reason 为测试被跳过的原因。
[2] @unittest.skipIf(condition, reason):当 condition 为真时,跳过被装饰的测试。
[3] @unittest.skipUnless(condition, reason):跳过被装饰的测试,除非 condition 为真。
[4] @unittest.expectedFailure:将测试标记为预期的失败或错误。如果测试失败或出错,将被视为成功。如果测试通过,将被视为失败。
[5] exception unittest.SkipTest(reason):引发此异常以跳过一个测试。通常来说,你可以使用 TestCase.skipTest() 或其中一个跳过测试的装饰器实现跳过测试的功能,而不是直接引发此异常。
[注意]:被跳过的测试的 setUp() 和 tearDown() 不会被运行。被跳过的类的 setUpClass() 和 tearDownClass() 不会被运行。被跳过的模组的 setUpModule() 和 tearDownModule() 不会被运行。 -
检查异常、警告和日志消息的生成:
序号 方法 描述 1 assertRaises(exc, fun, *args, **kwds) fun(*args, **kwds)提高EXC 2 assertRaisesRegex(exc, r, fun, *args, **kwds) fun(*args, **kwds)提高EXC 3 assertWarns(warn, fun, *args, **kwds) fun(*args, **kwds)提出警告 4 assertWarnsRegex(warn, r, fun, *args, **kwds) fun(*args, **kwds)引发警告 ,并且消息匹配正则表达式r 5 assertLogs(logger, level) 该with块 以最低级别登录到记录器 注:详情请参考官方文档
-
测试框架可以使用以下方法来收集有关测试的信息
[1]countTestCases():返回此测试对象表示的测试数量。对于 TestCase情况下,这将永远是1。
[2]defaultTestResult():返回应用此测试用例类的测试结果类的实例,如果未向该run()方法提供其他结果实例 ;对于TestCase情况 下,这将永远是一个实例 TestResult; 的子类TestCase应在必要时覆盖此子类。
[3]id():返回标识特定测试用例的字符串。这通常是测试方法的全名,包括模块和类名。
[4]shortDescription():返回测试的描述;或者None没有提供描述。此方法的默认实现返回测试方法第一行。
[5] … -
分组测试:
[0]unittest.TestSuite(tests =()): 此类表示各个测试用例和测试套件的集合。该类提供测试运行程序所需的接口,以使其能够像其他任何测试用例一样运行。运行TestSuite实例与遍历套件(分别运行每个测试)相同。
[1]addTest(测试): 将TestCase或添加TestSuite到套件。
[2]addTests(测试): 将来自所有可迭代的TestCase和TestSuite 实例的测试添加到该测试套件中。
[3]run(结果): 运行与此套件相关的测试,将结果收集到作为result传递的测试结果对象中。请注意,不同于 TestCase.run(),TestSuite.run()需要传递结果对象。
[4]countTestCases(): 返回此测试对象表示的测试数量,包括所有单个测试和子套件。 -
协程,信号处理,加载运行等方法请参考官方文档。
五.基本实例
一. 测试方法
# Test_func_demo.py
def add(a, b):
return a + b
def minus(a, b):
return a - b
def multi(a, b):
return a * b
def divide(a, b):
return a / b
二.简单实例
# Test_unittest_demo.py
import unittest
from Test_func_demo import *
# 继承 unittest.TestCase 就创建了一个测试样例
class TestFun(unittest.TestCase):
def test_add(self):
"""验证加法"""
self.assertEqual(4, add(2, 2))
self.assertNotEqual(3, add(2, 2))
def test_minus(self):
"""验证减法"""
self.assertEqual(1, minus(2, 1))
def test_multi