Unittest核心API(二)
TestCase类中提供了丰富的断言去检查和报告错误,下面的表格中列出了最常用的一些方法。第一列代表使用方式,第二列代表检查项,第三列代表开始引入的版本号。前面的例子已经介绍过assertEqual(a,b)的用法,作用是对比参数a和b,相等则通过,反之测试不通过。
注:本节教材内容,与上期推送的《教材连载:Unittest核心API(一)》为一个章节。
回顾上节内容,请点击:教材连载:Unittest核心API(一)
2.断言
TestCase类中提供了丰富的断言去检查和报告错误,下面的表格中列出了最常用的一些方法。第一列代表使用方式,第二列代表检查项,第三列代表开始引入的版本号。前面的例子已经介绍过assertEqual(a,b)的用法,作用是对比参数a和b,相等则通过,反之测试不通过。
Method | Checks that | New in |
assertEqual(a, b) | a == b | |
assertNotEqual(a, b) | a != b | |
assertTrue(x) | bool(x) is True | |
assertFalse(x) | bool(x) is False | |
assertIs(a, b) | a is b | 3.1 |
assertIsNot(a, b) | a is not b | 3.1 |
assertIsNone(x) | x is None | 3.1 |
assertIsNotNone(x) | x is not None | 3.1 |
assertIn(a, b) | a in b | 3.1 |
assertNotIn(a, b) | a not in b | 3.1 |
assertIsInstance(a, b) | isinstance(a, b) | 3.2 |
assertNotIsInstance(a, b) | not isinstance(a, b) | 3.2 |
下面展示了assertTrue方法的源码,可以看到有两个参数,expr为表达式,当表达式结果为True时,测试通过,反之不通过,第二个参数msg为断言失败后用户自定义输出的信息,默认值为None,即默认无输出。
def assertTrue(self, expr, msg=None): """Check that the expression is true.""" if not expr: msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr)) raise self.failureException(msg) |
下面是使用assertTrue的简单实例。“1==10”是一个表达式,结果为False,会导致断言失败。
import unittest class TestDemo(unittest.TestCase): def test01(self): self.assertTrue(1==10,msg='This is a test msg.') if __name__ == '__main__': unittest.main() |
运行结果如下。可以看到断言失败的情况下,输出了“This is a test msg.”。事实上每个断言的方法都有msg参数,灵活的使用此参数可以在测试失败时向团队提供更多的信息和线索。
F ===================================================================== FAIL: test01 (__main__.TestDemo) --------------------------------------------------------------------- Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/python364/C03_Unittest/Ex02_RunTest/Test03.py", line 22, in test01 self.assertTrue(1==10,msg='running msg.') AssertionError: False is not true : This is a test msg.
--------------------------------------------------------------------- Ran 1 test in 0.001s FAILED (failures=1) |
再比如assertIsInstance(a,b)。从字面意思理解为判断实例,即a如果为b实例出来的对象,则结果为True,否则为False。下面的例子中定义了三个类,TestDemo为测试类,继承于unittest.TestCase,内部有两个测试方法,每个方法均先实例化一个对象,再判断该对象和某个类的关系。
import unittest class Demo1: pass class Demo2: pass class TestDemo(unittest.TestCase): def test01(self): d = Demo1() self.assertIsInstance(d,Demo1,msg='## This is test01. ##') def test02(self): d = Demo2() self.assertIsInstance(d,Demo1,msg='## This is test02. ##') if __name__ == '__main__': unittest.main() |
很容易看出,由于对象d不是Demo1实例化出来的,所以test02测试不通过。
.F ===================================================================== FAIL: test02 (__main__.TestDemo) --------------------------------------------------------------------- Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/python364/C03_Unittest/Ex02_RunTest/Test04.py", line 16, in test02 self.assertIsInstance(d,Demo1,msg='## This is test02. ##') AssertionError: <__main__.Demo2 object at 0x01B27570> is not an instance of <class '__main__.Demo1'> : ## This is test02. ## --------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1) |
在unittest框架中,assert断言的方法远远不止以上所述,但核心的原理和用法都是相通的,所以我们不必记住每一个方法,在充分理解的基础上,多查找相关资料并运用到实践中。
3.其他
最后一类API提供了错误上报、用例查询等功能,这里先做简单的介绍,后面我们会结合项目来实际运用这些方法。
(1)fail(msg=None):无条件声明一个测试用例失败,msg是失败信息。
(2)failureException(msg):是unittest.TestCase的属性,用来表示失败的异常,默认被赋值为AssertionError。
(3)longMessage:默认被赋值为False,如果赋值为True,可以在结果中包含更详细的diff信息。
(4)maxDiff:默认长度80*8,用来控制diff显示的长度。
(5)countTestCases():返回测试用例的个数,对于TestCase实例来说,这个返回值一直是1.
(6)defaultTestResult():如果在run()方法中未提供result参数,该函数返回一个包含本用例测试结果的TestResult对象。
(7)id():返回测试用例的编号,通常是如下格式:模块名.类名.函数名。可以用于测试结果的输出。
(8)shortDescription():返回测试用例的描述,即函数的docstring,如果没有,返回None。可以用于测试结果输出中描述测试内容。
(9)addCleanup(function, *args, **kwargs):添加针对每个测试用例执行完tearDown()方法之后的清理方法,添加进去的函数按照后进先出(LIFO)的顺序执行,当然,如果setUp()方法执行失败,那么不会执行tearDown()方法,自然也不会执行addCleanup()里添加的函数。
(10)doCleanups():无条件强制调用addCleanup()添加的函数,适用于setUp()方法执行失败但是需要执行清理函数的场景,或者希望在tearDown()方法之前执行这些清理函数。
下周推送:Unittest高级应用