(1)test fixture 测试固件:执行前的准备、执行后的清理
(2)test case 测试用例:完整的测试流程,通过继承unittest的TestCase类,创建新的测试用例
(3)test suite 测试套件:测试用例的集合,将测试用例集合在一起,然后一次性执行集合中的所有测试用例
(4)test runner 测试运行器:执行测试用例,生成测试结果
TestCase 作为基类,自定义的子类中实现测试用例的方法,方法名需要以 testxxx 命名
setUp() 每个测试方法运行前执行,测试前的初始化工作
tearDown() 每个测试方法运行结束后执行,测试后的清理工作
@classMethod
setUpClass() 单元测试的前期准备,在setUp之前执行,并且整个测试只运行一次
@classMethod
tearDownClass() 所有测试方法运行结束后执行,只运行一次
def testxxx1():
.......
def testxxx2():
.......
可以用装饰器忽略某些测试方法
构建测试集,有多种方法
方法1:suite = unittest.TestSuite(列表)
if __name__ == '__main__':
suite1 = unittest.TestLoader().loadTestsFromTestCase(AClass)
suite2 = unittest.TestLoader().loadTestsFromTestCase(BClass)
suite = unittest.TestSuite([suite1,suite2])
方法2:suite.addTest(类(‘方法’))
TestSuite 实例调用 suite.addTest(…)
优点:通过这种方式,可以指定测试用例的执行顺序
缺点:需要手动指定的太多
suite.addTest(…) 传入的参数是方法
if __name__ == "__main__":
suite = unittest.TestSuite()
suite.addTest(MyTest('test_mul'))
suite.addTest(MyTest('test_add'))
#.....
方法3:suite.addTest(unittest.makeSuite(类,‘方法开头字符串’))
用到 makeSuite 来筛选方法,筛选什么类、以什么开头的方法,然后将筛选出来的方法,传入suite.addTest(…)中
if __name__ == '__main__':
suite = unittest.TestSuite()
for n in range(1,6):
suite.addTest(unittest.makeSuite(AClass,'aaa'))
# 这样增加了AClass中,5个以aaa开头的方法
# 而且,不需要以 test 开头
方法4:批量执行测试模块(称为“测试发现”)
要求:其他定义了测试用例的 .py 文件,以test开头命名
#加载当前目录下所有有效的测试模块,"."表示当前目录
suite = unittest.TestLoader().discover(".")
这个文件继承了TestCase,写了很多 testxxx() 方法,并且想要执行其中的全部 testxxx() 方法
if __name__ == '__main__':
unittest.main()
suite = .....
runner = ...
runner.run(suite)
runner = unittest.TextTestRunner(verbosity=2)
filename = "C:\\Test.html"
fp = file(filename,"wb")
runner = HTMLTestRunner.HTMLTestRunner(
stream = fp,
title = "Report_title",
description = "Report_description")
runner.run(suite)
fp.close()
或者,指定到当前目录下
fp = file("./result.html",'w')
runner = HTMLTestRunner(fp,title=u'自动化测试报告')
runner.run(suite)
fp.close()