zoukankan      html  css  js  c++  java
  • (四十)Unittest单元测试框架之认识unittest-discover更多测试用例

    随笔记录方便自己和同路人查阅。

    #------------------------------------------------我是可耻的分割线-------------------------------------------

      学习selenium自动化之前,最好先学习HTML、CSS、JavaScript等知识,有助于理解定位及操作元素的原理。关于python和selenium安装请自行搜索别的资料,这里就不多做介绍了,所有例子均使用python3.6+selenium执行的。

    #------------------------------------------------我是可耻的分割线-------------------------------------------

    discover更多测试用例

    随着软件功能的不断增加,对应的测试用例也会呈指数级增长。一个实现几十个功能的项目,对应的单元测试用例可能达到上百个。如果把所有的测试用例都写在一个test.py文件中,那么这个文件会越来越臃肿,后期委会起来也比较麻烦。需要将这些用例按照所测试的功能进行拆分,分散到不同的测试文件中。

    对上例中test.py文件的测试用例进行差分,拆分后的目录结构如下:

    文件拆分后的实现代码如下:

    Testadd.py

    import unittest
    from calculator import Count
    
    class TestAdd(unittest.TestCase):
        def setUp(self):
            print('test case start')
    
        def tearDown(self):
            print('test case end')
    
        def test_add(self):
            j = Count(2,3)
            self.assertEqual(j.add(),5)
    
        def test_add2(self):
            j = Count(10,5)
            self.assertEqual(j.add(),15)
    
    #执行测试类的测试方法
    if __name__ == '__main__':
        unittest.main()

    Testsub.py文件

    import unittest
    from calculator import Count
    
    class TestSub(unittest.TestCase):
        def setUp(self):
            print('test sub start')
    
        def test_sub(self):
            j = Count(3, 2)
            self.assertEqual(j.sub(), 1)
    
        def test_sub2(self):
            j = Count(10,5)
            self.assertEqual(j.sub(), 5)
    
        def tearDown(self):
            print('test sub end')
            
    #执行测试类的测试方法
    if __name__ == '__main__':
        unittest.main()

    接着创建用于执行所有用例的runtest.py文件

    __author__ = 'Mr.Li'
    
    import unittest
    #加载测试文件
    import testadd
    import testsub
    
    #构建测试集
    suite = unittest.TestSuite()
    
    suite.addTest(testadd.TestAdd("test_add"))
    suite.addTest(testadd.TestAdd("test_add2"))
    
    suite.addTest(testsub.TestSub("test_sub"))
    suite.addTest(testsub.TestSub("test_sub2"))
    
    #执行测试类的测试方法
    if __name__ == '__main__':
        runner = unittest.TextTestRunner()
        runner.run(suite)

    这样的拆分带来了好处,可以根据不同的功能创建不同的测试文件,甚至是不同的测试目录,测试文件中还可以将不同的小功能划分为不同的测试类,在类下编写测试用例,整体结构更加清晰。

    这样的设计看上去很完美,但依然没有解决添加用例的问题,当用例达到成百上千条时,在runtest.py文件中通过addTest()添加/删除测试用例就变的非常麻烦,那么有没有方法让unittest单元测试框架自动识别测试用例呢?答案是可定的,TestLoader类中提供的discover()方法可以解决这个问题。

    TestLoader

    该类负责根据各种标准加载测试用例,并将它们返回给测试套件。正常情况下,不需要创建这个类的实例。Unittest提供了可以共享的defaultTestLoader类,可以使用其子类和方法创建实例,discover()方法就是其中之一。

    discover(start_dir,pattern=test*.py,top_level_dir=None)

    找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名才能被加载。如果启动的不是顶层目录,那么顶层目录必须单独指定。

    start_dir: 要测试的模块名或测试用例目录。

    pattern=’test*.py’:表示用例文件名的匹配原则。此处匹配文件名以“test”开头的”.py”类型文件,星号“*”表示任意多个字符。

    top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None。

    现在通过discover()方法重新实现runtest.py文件的功能。

    import unittest
    
    #定义测试用例的目录为当前目录
    test_dir = './'
    dicscover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')
    #执行测试类的测试方法
    if __name__ == '__main__':
        runner = unittest.TextTestRunner()
        runner.run(dicscover)

    discover()方法会自动根据测试目录(test_dir)匹配查找测试用例文件(test*.py),并将查到的测试用例组装到测试套件中,因此,可以直接通过run()方法执行discover,大大简化了测试用例的查找与执行。

  • 相关阅读:
    【hdu2825-Wireless Password】AC自动机+DP
    kuangbin专题十二 HDU1029 Ignatius and the Princess IV (水题)
    Codeforces Round #501 (Div. 3) 1015D Walking Between Houses
    Codeforces Round #501 (Div. 3) 1015A Points in Segments (前缀和)
    POJ2503 Babelfish
    POJ2531 Network Saboteur
    POJ3278 Catch That Cow
    POJ2488 A Knight's Journey
    POJ2456 Aggressive cows
    HDU1425 A Chess Game
  • 原文地址:https://www.cnblogs.com/lirongyang/p/11505065.html
Copyright © 2011-2022 走看看