zoukankan      html  css  js  c++  java
  • unittest-discover 发现更多用例-learn note 3

    测试功能拆分

    随着测试功能的增加,测试用例也会跟着增加,如果把所有的测试用都写在一个 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")
        
  • 相关阅读:
    [Linked List]Convert Sorted List to Binary Search Tree
    [Linked List]Reorder List
    [Linked List]Insertion Sort List
    解剖Nginx·模块开发篇(4)模块开发中的命名规则和模块加载与运行流程
    解剖Nginx·模块开发篇(3)ngx_http_hello_world_module 模块的基本函数实现
    解剖Nginx·模块开发篇(2)ngx_http_hello_world_module 模块基本结构定义
    解剖Nginx·模块开发篇(1)跑起你的 Hello World 模块!
    Nginx 源码完全注释(11)ngx_spinlock
    Nginx 源码完全注释(10)ngx_radix_tree
    Nginx源码完全注释(9)nginx.c: ngx_get_options
  • 原文地址:https://www.cnblogs.com/yan-2010/p/14247715.html
Copyright © 2011-2022 走看看