unittest-discover 发现更多用例-learn note 3 测试功能拆分 测试用例的执行顺序 跳过测试和与预期失败 测试类和测试模块的fixtures

随着测试功能的增加,测试用例也会跟着增加,如果把所有的测试用都写在一个 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")