1.Test Suite()
if __name__ == '__main__': #unittest.main() print '111' #构造测试集 suite = unittest.TestSuite() suite.addTest(TestCount("test_count2")) #执行测试 runner = unittest.TextTestRunner() runner.run(suite)
2.MyPublic Test
如果每个类中的SetUp()和tearDown()所做的事情是一样的,可以封装一个自己的测试类
class MyPublicTest(unittest.TestCase): #测试前准备环境的搭建 def setUp(self): print 'test start!' #测试后环境的还原 def tearDown(self): print 'test end!' class TestCount(MyPublicTest): #测试过程代码可将注意力放在具体用例的编写上
3.拆分到不同的py文件/目录/类中
将用例按所测试的功能拆分到不同的py文件/目录
将不同的小功能划分为不同的测试类,在类下编写测试用例
待测py
测试功能点1py
测试功能点2py
runtest.py
4.让unittest单元测试框架自动识别测试用例
TestLoader 类中的 discover()方法:
自动根据测试目录递归匹配查找当前目录及子目录下测试用例文件(每个子目录下放一个__init__.py文件),并将查找到的测试用例组装到测试套件中;如果启动的不是顶层目录,则顶层目录必须单独指定
TestLoader 类:负责根据各种标准加载测试用例,并返回给测试套件;不需要创建这个类的实例
unittest提供了可以共享的defaultTestLoader类,可使用其子类和方法创建实例
#coding: utf-8 __author__ = 'KK' import unittest #定义测试用例的目录为当前目录 test_dir ='./' discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py') #方便的将一个单元测试模块变成可以直接运行的测试脚本,main()使用TestLoader类来搜索所有包含在该模块中以test命名开头的测试方法并执行 if __name__ == '__main__': #执行测试 runner = unittest.TextTestRunner() runner.run(discover)
5.用例执行的顺序
6.跳过测试和预期失败
装饰器,也可作用于测试类,只需将他们定义在测试类上面即可
#coding: utf-8 __author__ = 'KK' import unittest from guopy05_test import j class MyPublicTest(unittest.TestCase): #测试前准备环境的搭建 def setUp(self): print 'test start!' #测试后环境的还原 def tearDown(self): print 'test end!' class TestCount(MyPublicTest): #测试过程代码 @unittest.skip("直接跳过测试") def test_count1(self): sumData = j(2,3) self.assertEqual(sumData.add(),5) @unittest.skipIf(1>2,"当条件为True则跳过") def test_count2(self): sumData = j(-2,7) self.assertEqual(sumData.add(),5,msg = 'Failed guojunqi2!') @unittest.skipUnless(1>2,"当条件为True则执行") def test_count3(self): sumData = j(-2,9) self.assertEqual(sumData.add(),7,msg = 'Failed guojunqi3!') @unittest.expectedFailure #不管执行结果是否失败,均标记为失败,但不会抛出错误信息 def test_count4(self): sumData = j(-2,9) self.assertEqual(sumData.add(),5,msg = 'Failed guojunqi4') #方便的将一个单元测试模块变成可以直接运行的测试脚本,main()使用TestLoader类来搜索所有包含在该模块中以test命名开头的测试方法并执行 if __name__ == '__main__': unittest.main()执行结果:
7.fixtures
对于测试模块、类、用例的fixtures
#coding: utf-8 __author__ = 'KK' import unittest def setUpModule(): print ("test module start>>>>>>>>>>>>>>>>") def tearDownModule(): print ("test module end>>>>>>>>>>>>>>>>>>>") class Test(unittest.TestCase): @classmethod def setUpClass(cls): print ("test class start ==============>") @classmethod def tearDownClass(cls): print ("test class end ==============>") def setUp(self): print ("test case start ----------->") def tearDown(self): print ("test case end ------------->") def test_a(self): print ("test case1") def test_b(self): print ("test case2") #方便的将一个单元测试模块变成可以直接运行的测试脚本,main()使用TestLoader类来搜索所有包含在该模块中以test命名开头的测试方法并执行 if __name__ == '__main__': unittest.main()执行结果: