unitest单元测试框架最初是有JUnit的启发,它支持测试自动化,共享测试的设置和关闭代码,将测试聚合到集合中,以及测试与报告框架的独立性。html
TestFixture:表示测试一个或多个测试的时候,须要的一些相关动做,好比,建立临时或代理数据库,目录或启动服务器进程。测试代码的这种工做环境称为夹具。
TestCase(测试用例):就是测试的各个单元,他检查对特定输入集的特定响应,unitest提供了一个基类,TestCase用于建立新的测试用例。
TestSuite(测试套件):多个测试用例集合在一块儿。测试用例实例根据他们测试的功能组合在一块儿,unittest为此提供了一个机制:测试套件。
TestRunner:执行测试用例的,测试的结果会保存至TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
TestLoader():可用于自动建立测试套件并使用单个测试填充它的过程。
运行各类测试用例的顺序是经过根据字符串的内置顺序对测试函数名称进行排序调用。
检查并报告故障 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
检查异常、警告、日志消息生成 assertRaises(exc, fun, *args, **kwds) fun(*args, **kwds)提升EXC assertRaisesRegex(exc, r, fun, *args, **kwds) fun(*args, **kwds)提出exc 而且消息匹配正则表达式r 3.1 assertWarns(warn, fun, *args, **kwds) fun(*args, **kwds)提出警告 3.2 assertWarnsRegex(warn, r, fun, *args, **kwds) fun(*args, **kwds)提出警告 和消息的正则表达式匹配ř 3.2 assertLogs(logger, level) 该with块 以最低级别登陆记录器 3.4
import unittest class TestStringMethods(unittest.TestCase): def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) self.assertFalse('FOO'.islower()) def test_split(self): s = "Hello World" self.assertEqual(s.split(), ['Hello', 'World']) with self.assertRaises(TypeError): s.split(2) if __name__ == '__main__': unittest.main()
首先经过unittest.TestCase子类建立测试用例
经过以test开头的三个方法
assertEqual()检查预期结果
assertTrue()或assertFalse()核实状况
assertRaises()验证是否引起了特定异常
使用这些方法代替assert语句,以便测试运行器能够累积全部测试结果并生成报告
setUp():在每一个测试用例执行以前执行
tearDown():在每一个测试用例执行以后执行
unittest.main()提供了测试脚本的命令行界面
python BaseExample.py -v 传入-v标志来运行具备更多详细信息的测试用例
python -m unittest test_module1 test_module2
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method
# coding=utf-8 import unittest import HtmlTestRunner class TestSuiteExample(unittest.TestCase): def test_equal(self): s = "Hello" self.assertEqual(s, "Hello") def test_upper(self): s = "FOO" self.assertEqual('FOO', s) def test_lower(self): s = "foo" self.assertTrue(s.islower()) if __name__ == '__main__': # 建立一个测试集合 f = open('./test_suite_example.html') test_suite = unittest.TestSuite() loader = unittest.TestLoader() # 向测试套件中添加测试用例 # test_suite.addTest(test=TestSuiteExample("test_equal")) # 使用loader添加全部的测试方法 tests = loader.loadTestsFromTestCase(TestSuiteExample) test_suite.addTests(tests=tests) # 打开文件,用于生成html runner = HtmlTestRunner.HTMLTestRunner(output="D:/python/") runner.run(test_suite)
HtmlTestRunner 须要单独安装python
pip install html-testRunner==1.0.3
向套件中添加测试用例使用addTest()和addTests()正则表达式
addTest(test) Add a TestCase or TestSuite to the suite. addTests(tests) Add all the tests from an iterable of TestCase and TestSuite instances to this test suite. This is equivalent to iterating over tests, calling addTest() for each element.
unittest支持跳过单个测试甚至整个测试类,它支持将测试标记为"预期失败",但不该该视为TestResult失败数据库
import sys import unittest class MyTestCase(unittest.TestCase): @unittest.skip("跳过测试") def test_nothing(self): self.fail("没有发生") @unittest.skipIf(1 > 0, "若是真,则跳过") def test_format(self): self.assertTrue(1 < 0) @unittest.skipUnless(sys.platform.startswith("win"),"requires Windows") def test_upper(self): s = "hh" self.assertEqual('HH',s.upper()) if __name__ == '__main__': unittest.main()
TestCase类的实例表示unittest中最小的测试单元,此类旨在用做基类,具体的测试有气子类实现,此类实现测试运行期所需的接口以容许其驱动测试服务器
此类表示各个测试用例和测试套件的集合,该类提供了测试运行器所需的接口,以容许他像其余任何测试用例同样运行框架
TestLoader类被用于建立TestSuite从模块或类中。一般,不须要建立此类的实例,unittest模块提供了一个能够共享的实例unittest.defaultTestLoader()less
此类用于编译有关哪些测试成功以及哪些测试失败的信息函数
一个TestResult对象存储一组测试结果,有如下属性:单元测试
TestCase
实例和包含格式化回溯的字符串的列表。每一个元组表明一个引起意外异常的测试。TestCase
实例和包含格式化回溯的字符串的列表TestCase
实例和字符串的列表,其中包含跳过测试的缘由。
要共享的类的实例。若是不须要自定义,unittest.
defaultTestLoader:
TestLoaderTestLoader
则可使用此实例而不是重复建立新实例。测试
unittest.
main:一个命令行程序,它从模块加载一组测试并运行它们; 这主要是为了使测试模块能够方便地执行