测试功能拆分
随着测试功能的增加,测试用例也会跟着增加,如果把所有的测试用都写在一个 test.py文件里面,文件不易维护,所以需要将功能进行拆分
拆分后目录如下:
testpro/
runtest.py
test_lower.py
test_upper.py
#test_upper.py import unittest class TestStringMethods(unittest.TestCase): # 继承unittest.TestCase # 每个测试用例执行之前做操作 def setUp(self): print ('test start') def test_upper(self): # 测试用例 self.assertEqual('foo'.upper(), 'FOO','1111') def test_isupper(self): # 测试用例 self.assertTrue('FOO'.isupper(),'333') self.assertFalse('FOo'.isupper(),'4444') # 每个测试用例执行之后做操作 def tearDown(self): print ('test end')
#test_lower.py import unittest class mytest(unittest.TestCase): # 每个测试用例执行之前做操作 def setUp(self): print ('test start') # 每个测试用例执行之后做操作 def tearDown(self): print ('test end') class testlower(mytest): # 继承mytest def test_lower1(self): # 测试用例 self.assertEqual('foo'.lower(), 'foo','1111') def test_lower2(self): # 测试用例 self.assertEqual('abb'.lower(), 'aBB', '222')
#runtest.py import unittest import test_upper import test_lower #构造测试集 suite=unittest.TestSuite() suite.addTest(test_upper.TestStringMethods("test_upper")) suite.addTest(test_lower.testlower("test_lower1")) if __name__=="__main__": # 执行测试 runner = unittest.TextTestRunner() runner.run(suite)
这样的拆分,可以根据不同的功能创建不同的测试文件,甚至是不同的测试目录,测试文件还可以把不同的小功能划分为不同的测试类,在类下编写测试用例,整体结构更加清晰
runtest.py文件通过 addTest()添加、删除测试用例。 但是如果测试用例 很多 ,添加比较麻烦 ,可以通过 TestLoader类中提供的discover()方法自动识别测试用
discover() 方法
TestLoader
unitetest提供了可以共享的dafaultTestLoader类,可以使用其子类和方法创建实例,discover()就是其中之一
discover
discover(start_dir,pattern='test*.py',top_level_dir=None)
找到指定目录下所有测试模块,并递归查到子目录下的测是木块,只有匹配到文件名才能被加载,如果启动的不是顶层目录,那么顶层目录必须单独指定
- start_dir :要测试的模块名或测试用例目录
- pattern='test*.py' :匹配以‘test’开头的.py类型的文件
- top_level_dir=None :测试模块的顶层目录,如果没有顶层目录,默认None
import unittest test_dir='./' discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*.py') if __name__=="__main__": # 执行测试 runner = unittest.TextTestRunner() runner.run(discover)
discover() 方法会自动根据测试目录(test_dir)匹配测试文件(test*.py),并将找到的测试用例组装到测试套件中,因此可以直接通过run()方法执行discover
测试用例的执行顺序
默认 main() 方法执行测试列的顺序:
unitest框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为 :0-9,A-Z,a-z,所以不管是测试目录 测试文件 测试类 还是测试方法,都是按照这个默认顺序
如果需要指定顺序 ,那么就使用 TestSuite类的addTest()方法 来加载
跳过测试和与预期失败
class MyTestCase(unittest.TestCase): @unittest.skip("直接跳过测试") def test_nothing(self): self.fail("shouldn't happen") @unittest.skipIf(mylib.__version__ < (1, 3),"当条件为True时跳过") def test_format(self): # Tests that work for only a certain version of the library. pass @unittest.skipUnless(sys.platform.startswith("win"), "当条件为True时执行测试") def test_windows_support(self): # windows specific testing code pass
跳过测试类:
@unittest.skip("直接跳过该测试类") class MyTest(unittest.TestCase): ......
测试类和测试模块的fixtures
def setUpMoudle(): print ("test moudle start") def tearDownMoudle(): print ("test moudle end") class Test(unittest.TestCase): @classmethod def setUpClass(cls): print ("test class start") @classmethod def tearDownClass(cls): print ("test class end")