官网文档地址如下:
https://docs.python.org/2.7/library/unittest.html?highlight=unittest#test-cases
unittest, 又叫PyUnit, 支持测试自动化,共享测试setup(setUp()方法)和shutdown(tearDown()方法)代码,可以组合测试用例为测试组件(suite)。
一些重要的概念:
test fixture:主要是setUp和cleanup, setUp用于一些初始化操作,cleanup主要用于用例执行完以后,将环境恢复到初始状态。比如我们可以将测试用例分组,相似的可以在同一个类下,共享一样的setup和cleanup,比如说执行前打开页面,创建用户,创建临时数据库等;执行用例后删除用户,关闭页面,等等。
只要setUp()执行了,不管test case是否执行,执行是否沟通,tearDown()都会执行。
test case: 最小测试单元。unittest提供类:TestCase
test suite:是测试用例或者test suite的组合。unittest提供类:TestSuite
test runner: 测试执行和输出。该对象提供一个方法:run(),可以接受TestCase或者TestSuite作为参数,返回测试结果。类:TestResult提供给用户作为结果对象。unittest提供类TextTestRunner。
举例练习如下:
import unittest
class TestPY(unittest.TestCase): #def setUp(self): #def tearDown(self): def test_upper(self): self.assertEqual('foo'.upper(),'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) if __name__=="__main__": unittest.main()
结果:
Ran 2 tests in 0.000s OK
代码最后两行替换为:
suite = unittest.TestLoader().loadTestsFromTestCase(TestPY)
unittest.TextTestRunner(verbosity=2).run(suite)
结果:
test_isupper (__main__.TestPY) ... ok test_upper (__main__.TestPY) ... ok ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK
只执行第一条case,最后两行代码更新如下:
注意:TestCase类有一个参数,MethodName=runTest;所以参数里要给出method name。
testcase = TestPY('test_upper') runner = unittest.TextTestRunner(verbosity=2) runner.run(testcase)
结果:
est_upper (__main__.TestPY) ... ok ---------------------------------------------------------------------- Ran 1 test in 0.000s OK
Command-Line interface:
格式如下:
python -m unittest test_module1 test_module2 python -m unittest test_module.TestClass python -m unittest test_module.TestClass.test_method
帮助:
python -m unittest -h
Test Discovery:
TestLoader.discover()
-v: verbose
-s: start directory(. default)
-p: pattern,常用(test*.py by default)
python -m unittest discover -s project_directory -p '*_test.py' python -m unittest discover project_directory '*_test.py'
Test Suite练习:
原始练习代码最后两行可更新为:
suite = unittest.TestSuite() suite.addTest(TestPY('test_upper')) suite.addTest(TestPY('test_isupper')) unittest.TextTestRunner().run(suite)
Skipping tests and expected failures:
Skipping tests: 用于skip某个test方法或者类。
使用方法如下:
class MyTestCase(unittest.TestCase): @unittest.skip("demonstrating skipping") def test_nothing(self): self.fail("shouldn't happen") @unittest.skipIf(mylib.__version__ < (1, 3), "not supported in this library version") def test_format(self): # Tests that work for only a certain version of the library. pass @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows") def test_windows_support(self): # windows specific testing code pass
@unittest.skip("showing class skipping") class MySkippedTestCase(unittest.TestCase): def test_not_run(self): pass