咱们能够直接在测试用例里面添加unittest框架自带的断言(也就至关于判断),断言方法提供了测试结果是True仍是False,全部的断言方法都有一个msg参数,若是指定msg参数的值,则将该信息做为失败的错误信息返回;html
若是断言失败则抛出一个AssertionError,并标识该测试为失败状态;若是成功,则标识该测试为成功状态;若是异常,则当作错误来处理;框架
先来看一个实例,在一个测试类MyTestCase中添加多个测试方法和断言less
from unittest import TestCase, main, skip class MyTestCase(TestCase): def setUp(self): print('setUp') def tearDown(self): print('tearDown') def test_print1(self): print('第一个测试用例') # unittest框架自带的断言,若是不相等,直接抛出异常,相等什么都不作 self.assertEqual(200, 200, '测试失败') def test_print2(self): print('第二个测试用例') def test_print3(self): print('第三个测试用例') if __name__ == '__main__': main() ========输出========: setUp 第一个测试用例 tearDown setUp 第二个测试用例 tearDown setUp 第三个测试用例 tearDown
这里有三个测试用例,每一个测试用例开始以前都先执行了setUp方法,每一个测试用例以后都执行了tearDown方法。若是咱们想要忽略某个测试用例不执行,要怎么作?好比忽略第三个测试用例,只须要在第三个测试用例以前加上skip装饰器:函数
@skip('do not need test_print3') def test_print3(self): print('第三个测试用例')
咱们可使用unitest.skip装饰器跳过不须要的测试用例,@unittest.skip(reason)
表示无条件跳过测试用例,reason是用来讲明缘由的;学习
@unittest.skipIf(conditition,reason)
:condititon为true时跳过测试用例;测试
@unittest.skipunless(condition,reason)
:condition为False时跳过测试用例;ui
以前咱们学习了setup方法和setUpClass方法,会在每一个测试用例的先后都执行一遍,那若是咱们只想要在全部测试用例的先后执行一遍,也就是在整个类中只执行一遍要怎么办呢,咱们可使用setUpClass方法和tearDownClass方法:code
from unittest import TestCase, main, skip class MyTestCase(TestCase): @classmethod def setUpClass(cls): print('setUpClass') @classmethod def tearDownClass(cls): print('tearDownClass') def test_print1(self): print('第一个测试用例') # unittest框架自带的断言,若是不相等,直接抛出异常,相等什么都不作 self.assertEqual(200, 200, '测试失败') def test_print2(self): print('第二个测试用例') @skip('do not need test_print3') def test_print3(self): print('第三个测试用例') if __name__ == '__main__': main() ==========输出=========== setUpClass 第一个测试用例 第二个测试用例 tearDownClass
setup方法和teardown方法在每次执行一个测试用例时都会从新执行一遍,因此要想在整个类中只执行一遍能够用setUpClass和tearDownClass方法;htm
setUpClass
:须要添加@classmethod 装饰器,在一个类中只会在全部测试用例运行前调用一次;ip
tearDownClass
:须要添加@classmethod 装饰器,在全部测试用例运行后调用一次;
unittest.TestSuite类
建立测试套件,而后使用这个类的addTest() 方法将须要被测试的测试用例添加到测试套件中,最后使用unittest.TextTestRunner类
中的run()方法来运行suite所组装的测试用例;from unittest import TestCase from unittest import skip from unittest import main as main_method class MyTestCase(TestCase): @classmethod def setUpClass(cls): print('setUpClass') @classmethod def tearDownClass(cls): print('tearDownClass') def test_print1(self): print('第一个测试用例') self.assertEqual(200, 200, '测试失败') def test_print2(self): print('第一个测试用例') @skip('do not need test_print3') def test_print3(self): print('第一个测试用例') if __name__ == '__main__': main_method()
from test1 import MyTestCase from unittest import TestSuite, TextTestRunner suite = TestSuite() # 在测试用例集中添加测试用例, 只添加两个测试的方法 suite.addTest(MyTestCase('test_print1')) suite.addTest(MyTestCase('test_print3')) if __name__ == '__main__': # 建立测试runner,执行测试用例集 runner = TextTestRunner() runner.run(suite) =========输出============= setUpClass 第一个测试用例 tearDownClass
咱们运行这段代码,只有第一个测试用例输出,由于咱们只将第一个和第三个测试用例加入到测试集中,全部第二个测试用例不会执行,而咱们在第三个测试用例前面机上了skip装饰器会跳过此测试用例,全部第三个也不会执行啦。
def add(x, y): return x + y def sub(x, y): return x - y
from unittest import TestCase from unittest import skip from unittest import main as main_method from add_sub import add, sub class MyTestCase(TestCase): @classmethod def setUpClass(cls): print('setUpClass') @classmethod def tearDownClass(cls): print('tearDownClass') def test_print1(self): ret = 1 + 2 result = add(1, 2) self.assertEqual(result, ret, 'test_print1测试失败') def test_print2(self): print('第二个测试用例') @skip('do not need test_print3') def test_print3(self): print('第三个测试用例') if __name__ == '__main__': main_method()
from test import MyTestCase from unittest import TestSuite, TextTestRunner suite = TestSuite() # 在测试用例集中添加测试用例 suite.addTest(MyTestCase('test_print1')) suite.addTest(MyTestCase('test_print2')) suite.addTest(MyTestCase('test_print3')) if __name__ == '__main__': # 建立测试runner,执行测试用例集 runner = TextTestRunner() runner.run(suite) ========输出========= setUpClass 第一个测试用例 第二个测试用例 tearDownClass