学习python也好,selenium自动化也好,对于测试来说unittest有着举足轻重的地位,unittest中最核心的四个概念是:test case, test suite, test runner, test fixture
1.TestCase就是测试用例,在python中以类的形式存在,包括setUp,run,tearDown,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证,一个class继承了unittest.TestCase,便是一个测试用例,但如果其中有多个以 test
开头的方法,那么每有一个这样的方法,在load的时候便会生成一个TestCase实例,如:一个class中有四个test_xxx方法,最后在load到suite中时也有四个测试用例。
2.也就是说,多个测试用例集合在一起就是TestSuite,而且TestSuite也可以嵌套TestSuite。
所以流程是:
写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,我们通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run来执行,或者我们可以直接通过TextTestRunner来执行用例。这里加个说明,在Runner执行时,默认将执行结果输出到控制台,我们可以设置其输出到文件,在文件中查看结果(你可能听说过HTMLTestRunner,是的,通过它可以将结果输出到HTML中,生成漂亮的报告,它跟TextTestRunner是一样的)。
需要注意的是:1.用例(class)中的测试方法名均以test开头,2.测试方法的执行顺序和排列顺序无关,3.在unittest.main()中加 verbosity
参数可以控制输出的错误报告的详细程度,默认是 1
,如果设为 0
,则不输出每一用例的执行结果;如果设为 2
,则输出详细的执行结果
TestSuite可以控制测试方法的执行顺序,如果有多个测试文件也可以进行组织
参考代码:
import unittest from 测试文件名 import 测试用例class if __name__ == '__main__': suite = unittest.TestSuite() tests = [用例class("方法1名"), 用例class("方法2名"), 用例class("方法3名")] suite.addTests(tests) runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)
测试完成后可以将结果输出到文件:
import unittest from test_mathfunc import TestMathFunc if __name__ == '__main__': suite = unittest.TestSuite() suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestMathFunc)) with open('UnittestTextReport.txt', 'a') as f: runner = unittest.TextTestRunner(stream=f, verbosity=2) runner.run(suite)
注意:执行suite时应该在用例文件中关闭执行入口,否则无法执行
test fixture:
setUp()在每个测试方法执行之前执行一次,tearDown()在每个测试方法执行之后执行一次
setUpclass()在所有case执行之前执行一次,tearDownclass()在所有case执行之后执行一次
跳过某个case不执行:
使用skip装饰器,如在方法头上@unittest.skip()
skip装饰器一共有三个 unittest.skip(reason)
、unittest.skipIf(condition, reason)
、unittest.skipUnless(condition, reason)
,skip无条件跳过,skipIf当condition为True时跳过,skipUnless当condition为False时跳过。
TestCase.skipTest()方法,如直接在方法内加入self.skipTest()
以上内容大部分来自于csdn@灰蓝
HTMLTestRunner:
也很简单,萌新直接用大神的原版(原版不适用与python3.x)或者修改过的版本,这里还是用的灰蓝大神的修改版
自己的代码:
import unittest from loginCase import LoginCase from HTMLTestRunner_PY3 import HTMLTestRunner if __name__ == '__main__': suite = unittest.TestSuite() tests = [LoginCase("test_error_user"),LoginCase("test_login_success")] suite.addTests(tests) with open('HTMLReport.html','wb+') as f: runner = HTMLTestRunner(stream=f,title='login test report', description='generated by HTMLTestRunner.', verbosity=2 ) runner.run(suite)
HTMLReport结果:
代码这里有个坑!!!
因为之前照着大神的代码写是这样的:
with open('HTMLReport.html','w') as f:
这里参数w直接是写入模式,但是运行的时候报错了,提示TypeError: write() argument must be str, not bytes,萌新是一脸懵逼的,查了半天原来是存储方式默认是二进制,于是把w改为wb终于成功输出了报告!所以这里的文件读写这方面还得加强学习