TestCase类
class unittest.TestCase(methodName='runTest')
TestCase
类的实例代表unittest
体系中最小的可测试单元。此类旨在用作基类,具体测试由具体的子类实现。该类实现了测试运行器所需的接口,以允许它驱动测试,以及测试代码可用于检查和报告各种故障的方法。
每个实例都TestCase
将运行一个测试方法:名为methodName
的方法。如果你还记得,我们有一个更早的例子:
def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase('test_default_size'))
suite.addTest(WidgetTestCase('test_resize'))
return suite
在这里,我们创建两个实例WidgetTestCase
,每个实例运行一次测试。
methodName
默认为runTest()
。
TestCase
实例提供了三组方法:一组用于运行测试,另一组用于由测试实现检查条件和报告失败,还有一些查询方法允许收集有关测试本身的信息。
第一组中的方法(运行测试)是:
-
setUp()
调用方法来准备测试夹具。这在调用测试方法之前立即调用; 除AssertionError或SkipTest,通过该方法产生的任何异常都将被认为是错误的,而不是一个检测失败。默认实现什么都不做。
-
tearDown()
在调用测试方法后立即调用方法并记录结果。即使测试方法引发异常,也会调用此方法,因此在子类中的实现可能需要特别小心检查内部状态。任何异常,比其他AssertionError或SkipTest,通过该方法提出将被视为附加的错误,而不是一个测试失败(从而增加报告的错误的总数)。setUp()不管测试方法的结果如何,只有成功时才会调用此方法。默认实现什么都不做。
-
setUpClass()
在单个类中的测试之前调用的类方法运行。setUpClass被称为类作为唯一的参数,并且必须被修饰为classmethod():
@classmethod
def setUpClass(cls):
...
有关更多详细信息,请参阅Class和Module Fixtures。
2.7版本的新功能。
-
tearDownClass()
在单个类中的测试之后调用的类方法已经运行。tearDownClass被称为类作为唯一的参数,并且必须被修饰为classmethod():
@classmethod
def tearDownClass(cls):
...
有关更多详细信息,请参阅Class和Module Fixtures。
2.7版本的新功能。
-
run(result=None)
运行测试,将结果收集到作为结果传递的测试结果对象中。如果省略结果或None创建临时结果对象(通过调用defaultTestResult()方法)并使用。结果对象不会返回给run()调用者。
简单地调用TestCase实例可能会产生同样的效果。
-
skipTest(reason)
在测试方法中调用它或setUp()跳过当前测试。有关更多信息,请参阅跳过测试和预期故障。
2.7版本的新功能。
-
debug()
运行测试而不收集结果。这允许将测试引发的异常传播给调用者,并且可以用来支持在调试器下运行测试。
本TestCase类提供了一些断言方法来检查并报告故障。下表列出了最常用的方法(有关更多断言方法,请参阅下表):
方法 |
检查 |
新加入的 |
---|---|---|
assertEqual(a,b) |
a == b |
|
assertNotEqual(a,b) |
a!= b |
|
assertTrue(x) |
bool(x)为True |
|
assertFalse(x) |
bool(x)是False |
|
assertIs(a,b) |
a是b |
2.7 |
assertIsNot(a,b) |
a不是b |
2.7 |
assertIsNone(x) |
x是None |
2.7 |
assertIsNotNone(x) |
x不是None |
2.7 |
assertIn(a,b) |
a在b内 |
2.7 |
assertNotIn(a,b) |
a不在b内 |
2.7 |
assertIsInstance(a,b) |
判断两个类型是否相同 |
2.7 |
assertNotIsInstance(a,b) |
判断两个类型是否不相同 |
2.7 |
所有的 assert 方法都接受一个 msg
参数,如果指定,则用作失败时的错误消息(另请参见 longMessage)。请注意,只有当它们用作上下文管理器时,才能将 msg
关键字参数传递给 assertRaises()
、assertRaisesRegex()
、assertWarns()
、assertWarnsRegex()
。
-
assertEqual(first, second, msg=None)
测试第一个参数和第二个参数是否相等。如果两个参数值不相等,则测试将失败。
另外,如果第一个和第二个类型完全相同,并且列表,元组,dict,set,frozenset或unicode中的一个是完全相同的类型,或者addTypeEqualityFunc()将调用子类与类型特定的相等函数一起注册的任何类型,以便生成更有用的默认错误信息(另请参阅特定于类型的方法列表)。
在版本2.7中更改:添加了特定于类型的相等函数的自动调用。
-
assertNotEqual(first, second, msg=None)
测试第一和第二不相等。如果这些值确实相等,则测试将失败。
-
assertTrue(expr, msg=None)
-
assertFalse(expr, msg=None)
测试expr是否为真(或false)。
请注意,这相当于bool(expr) is True而不是expr is True(assertIs(expr, True)用于后者)。当更具体的方法可用时(例如,assertEqual(a, b)而不是assertTrue(a == b)),这种方法也应该避免,因为它们在失败的情况下提供更好的错误消息。
-
assertIs(first, second, msg=None)
-
assertIsNot(first, second, msg=None)
测试第一个和第二个评估(或不评估)到同一个对象。
2.7版本的新功能。
-
assertIsNone(expr, msg=None)
-
assertIsNotNone(expr, msg=None)
测试expr是否(或不)None。
2.7版本的新功能。
-
assertIn(first, second, msg=None)
-
assertNotIn(first, second, msg=None)
首先测试(或不)在第二。
2.7版本的新功能。
-
assertIsInstance(obj, cls, msg=None)
-
assertNotIsInstance(obj, cls, msg=None)
测试obj是(或不是)cls的一个实例(可以是一个类或一个类的元组,可以支持isinstance())。要检查确切的类型,请使用assertIs(type(obj), cls)
。
2.7版本的新功能。
还可以使用以下方法检查是否引发异常和警告:
方法 |
检查 |
新加入的 |
---|---|---|
assertRaises(exc,fun,* args,** kwds) |
有趣(* args,** kwds)引发了exc |
|
assertRaisesRegexp(exc,r,fun,* args,** kwds) |
fun(* args,** kwds)引发exc,并且消息匹配正则表达式r |
2.7 |
-
assertRaises(exception, callable, *args, **kwds)
-
assertRaises(exception)
测试在调用callable时使用传递给它的任何位置或关键字参数时会引发异常assertRaises()。如果发生异常,则测试通过;如果发生另一个异常,则为错误;如果未发生异常,则发生错误。要捕获任何一组异常,包含异常类的元组可以作为例外传递。
如果只给出异常参数,则返回一个上下文管理器,以便测试下的代码可以内联写入,而不是作为函数写入:
with self.assertRaises(SomeException):
do_something()
上下文管理器将把捕获到的异常对象存储在它的exception属性中。如果打算对引发的异常执行附加检查,这可能很有用:
with self.assertRaises(SomeException) as cm:
do_something()
the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
在版本2.7中进行了更改:添加了assertRaises()用作上下文管理器的功能。
-
assertRaisesRegexp(exception, regexp, callable, *args, **kwds)
-
assertRaisesRegexp(exception, regexp)
像assertRaises()但也测试正则表达式在引发异常的字符串表示匹配。regexp可能是一个正则表达式对象或者是一个包含适合使用的正则表达式的字符串re.search()。例子:
self.assertRaisesRegexp(ValueError, "invalid literal for.*XYZ'$",
int, 'XYZ')
要么:
with self.assertRaisesRegexp(ValueError, 'literal'):
int('XYZ')
2.7版本的新功能。
还有其他方法用于执行更具体的检查,例如:
方法 |
检查 |
新加入的 |
---|---|---|
assertAlmostEqual(a,b) |
round(ab,7)== 0 |
|
assertNotAlmostEqual(a,b) |
round(ab,7)!= 0 |
|
assertGreater(a,b) |
a> b |
2.7 |
assertGreaterEqual(a,b) |
a> = b |
2.7 |
assertLess(a,b) |
a <b |
2.7 |
assertLessEqual(a,b) |
a <= b |
2.7 |
assertRegexpMatches(s,r) |
r.search(S) |
2.7 |
assertNotRegexpMatches(s,r) |
不是r.search(s) |
2.7 |
assertItemsEqual(a,b) |
排序(a)==排序(b)并使用不可取的objs |
2.7 |
assertDictContainsSubset(a,b) |
b中存在的所有键/值对 |
2.7 |
-
assertAlmostEqual(first, second, places=7, msg=None, delta=None)
-
assertNotAlmostEqual(first, second, places=7, msg=None, delta=None)
测试第一和第二近似(或不近似)通过计算差,四舍五入到小数点的给定数目相等的地方(默认7),并与零进行比较。请注意,这些方法将数值四舍五入到给定的小数位数(即round()函数)而不是有效数字。
如果提供增量而不是位置,则第一个和第二个之间的差值必须小于或等于(或大于)delta。
提供三角洲和地方提出了一个TypeError。
在版本2.7中更改:assertAlmostEqual()自动考虑比较相等的几乎相等的对象。assertNotAlmostEqual()如果对象相等则自动失败。添加了delta关键字参数。
-
assertGreater(first, second, msg=None)
-
assertGreater(first, second, msg=None)
-
assertGreater(first, second, msg=None)
-
assertGreater(first, second, msg=None)
根据方法名称测试第一个分别是>,> =,<或<= 第二个。如果不是,测试将失败:
>>> self.assertGreaterEqual(3, 4)
AssertionError: "3" unexpectedly not greater than or equal to "4"
2.7版本的新功能。
-
assertRegexpMatches(text, regexp, msg=None)
测试正则表达式搜索与文本匹配。如果失败,错误消息将包括模式和文本(或模式和意外匹配的文本部分)。regexp可能是一个正则表达式对象或者是一个包含适合使用的正则表达式的字符串re.search()。
2.7版本的新功能。
-
assertNotRegexpMatches(text, regexp, msg=None)
验证正则表达式搜索与文本不匹配。包含模式和匹配文本部分的错误消息失败。regexp可能是一个正则表达式对象或者是一个包含适合使用的正则表达式的字符串re.search()。
2.7版本的新功能。
-
assertItemsEqual(actual, expected, msg=None)
测试期望的序列包含与实际相同的元素,而不管它们的顺序如何。如果没有,则会生成列出序列之间差异的错误消息。
比较实际值和预期值时,不会忽略重复元素。它验证两个序列中每个元素是否具有相同的计数。它等同于它,但它也可以处理不可对象序列。
-
assertEqual(sorted(expected), sorted(actual))
在Python 3中,这个方法被命名assertCountEqual。
2.7版本的新功能。
-
assertDictContainsSubset(expected, actual, msg=None)
测试实际字典中的键/值对是否是预期字符集的超集。如果不是,则会生成列出缺失键和不匹配值的错误消息。
2.7版本的新功能。
自3.2版以来已弃用。
该assertEqual()方法将相同类型的对象的相等性检查分派给不同类型特定的方法。这些方法已经用于大多数内置类型,但也可以使用addTypeEqualityFunc()以下方法注册新方法:
-
addTypeEqualityFunc(typeobj, function)
注册一个名为by的类型特定方法assertEqual()来检查两个完全相同的typeobj(而不是子类)对象是否相等。函数必须像两个位置参数一样,第三个msg = None关键字参数assertEqual()。self.failureException(msg)当检测到前两个参数之间的不平等时,它必须提高- 可能提供有用的信息并解释错误消息中的细节不等式。
2.7版本的新功能。
assertEqual()下表中汇总了自动使用的特定于类型的方法列表。请注意,通常不需要直接调用这些方法。
方法 |
用于比较 |
新加入的 |
---|---|---|
assertMultiLineEqual(a,b) |
字符串 |
2.7 |
assertSequenceEqual(a,b) |
序列 |
2.7 |
assertListEqual(a,b) |
名单 |
2.7 |
assertTupleEqual(a,b) |
元组 |
2.7 |
assertSetEqual(a,b) |
设置或frozensets |
2.7 |
assertDictEqual(a,b) |
http://stardict.sourceforge.net/Dictionaries.php下载 |
2.7 |
-
assertMultiLineEqual(first, second, msg=None)
测试了多串首先是等于字符串第二。如果不等于两个字符串的差异,则突出显示差异将包含在错误消息中。比较字符串时默认使用此方法assertEqual()。
2.7版本的新功能。
-
assertSequenceEqual(seq1, seq2, msg=None, seq_type=None)
测试两个序列是否相等。如果提供了seq_type,则seq1和seq2必须是seq_type的实例,否则将引发故障。如果序列不同,则会构造一个错误消息,显示两者之间的差异。
这个方法不是直接被调用assertEqual(),而是用来实现assertListEqual()和assertTupleEqual()。
2.7版本的新功能。
-
assertListEqual(list1, list2, msg=None)
-
assertListEqual(list1, list2, msg=None)
测试两个列表或元组是否相等。如果不是,则会构建一条仅显示两者之间差异的错误消息。如果两个参数中的任何一个参数都属于错误类型,也会引发错误。在比较列表或元组时,默认使用这些方法assertEqual()。
2.7版本的新功能。
-
assertSetEqual(set1, set2, msg=None)
测试两组相等。如果不是,则会构造一个错误消息,列出各组之间的差异。比较设置或frozensets时默认使用此方法assertEqual()。
如果set1或set2中没有一个set.difference()方法,则失败。
2.7版本的新功能。
-
assertDictEqual(expected, actual, msg=None)
测试两个字典是否相同。如果不是,则会构造一个错误消息,显示字典中的差异。默认情况下会使用此方法比较调用中的字典assertEqual()。
2.7版本的新功能。
最后TestCase提供以下方法和属性:
-
fail(msg=None)
用msg或None错误信息无条件地表示测试失败。
-
failureException
这个类属性给出了测试方法引发的异常。如果一个测试框架需要使用一个专门的异常,可能需要携带更多的信息,那么它必须将这个异常小类化,以便与框架“公平”。这个属性的初始值是AssertionError。
-
longMessage
如果设置为,True那么传递给断言方法的任何显式失败消息都将追加到正常失败消息的末尾。正常消息包含有关所涉及对象的有用信息,例如来自assertEqual的消息显示了两个不等对象的repr。通过设置此属性,True可以让您除了正常的错误信息之外还有自定义的错误信息。
此属性默认为False,意味着传递给断言方法的自定义消息将会使常规消息无效。
通过在调用assert方法之前True或False之前分配实例属性,可以在单个测试中重写类设置。
2.7版本的新功能。
-
maxDiff
该属性通过assert方法控制差异输出的最大长度,该方法报告差异的差异。它默认为80 * 8个字符。受此属性影响的Assert方法assertSequenceEqual()(包括委托给它的所有序列比较方法)assertDictEqual()和assertMultiLineEqual()。
设置maxDiff为None意味着没有最大长度的差异。
2.7版本的新功能。
测试框架可以使用以下方法收集测试信息:
-
countTestCases()
返回此测试对象表示的测试数量。对于TestCase情况下,这将永远是1。
-
defaultTestResult()
返回应该用于此测试用例类的测试结果类的实例(如果没有其他结果实例提供给该run()方法)。
对于TestCase情况下,这将永远是一个实例TestResult; 子类TestCase应该根据需要覆盖它。
-
id()
返回一个标识特定测试用例的字符串。这通常是测试方法的全名,包括模块和类名。
-
shortDescription()
返回测试的描述,或者None没有提供描述。此方法的默认实现返回测试方法的文档字符串的第一行(如果可用)或None。
-
addCleanup(function, *args, **kwargs)
添加一个函数来tearDown()清理测试过程中使用的资源。函数将按照它们添加的顺序(LIFO)以相反的顺序调用。它们被调用时添加了任何参数和关键字参数addCleanup()。
如果setUp()失败,意味着tearDown()没有被调用,那么添加的任何清理函数仍将被调用。
2.7版本的新功能。
-
doCleanups()
此方法在之后tearDown()或之后被无条件地调用,setUp()如果setUp()引发异常。
它负责调用所添加的所有清理函数addCleanup()。如果你需要清除函数被调用之前到tearDown(),那么你可以调用doCleanups()。
doCleanups() 一次只能抛出一堆清理函数,因此可以随时调用。
2.7版本的新功能。
class unittest.FunctionTestCase(testFunc, setUp=None, tearDown=None, description=None)
该类实现了TestCase允许测试运行器驱动测试的接口部分,但不提供测试代码可用于检查和报告错误的方法。这用于使用旧版测试代码创建测试用例,从而将其集成到unittest基于测试框架的测试中。
已弃用的别名
由于历史原因,其中一些TestCase方法有一个或多个现在已被弃用的别名。下表列出了正确的名称及其弃用的别名:
方法名称 |
已弃用的别名(es) |
---|---|
assertEqual() |
failUnlessEqual,assertEquals |
assertNotEqual() |
failIfEqual |
assertTrue() |
failUnless,assert_ |
assertFalse() |
failIf |
assertRaises() |
failUnlessRaises |
assertAlmostEqual() |
failUnlessAlmostEqual |
assertNotAlmostEqual() |
failIfAlmostEqual |
自2.7版弃用:第二列中列出的别名
更多建议: