zoukankan      html  css  js  c++  java
  • python利用unittest测试框架组织测试用例的5种方法

    利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法。

    在此之前,先了解几个概念

    • TestCase:所有测试用例的基本类,给一个测试方法的名字,就会返回一个测试用例实例;
    •  TestSuite:组织测试用例的实例,支持测试用例的添加和删除,最终将传递给  testRunner进行测试执行;
    •  TextTestRunner:进行测试用例执行的实例,其中Text的意思是以文本形式显示测试结果。测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息;
    •  TestLoader:用来加载TestCase到TestSuite中的,其中有几个  loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例;
    • defaultTestLoader.discover:将discover方法筛选出来的用例,循环添加到测试套件中,打印出的用例信息会递增

    方法一:通过unittest.main()来执行测试用例的方式

    import unittest
    
    class TestStringMethods(unittest.TestCase):
        
        def setUp(self):
            unittest.TestCase.setUp(self)
            
        def tearDown(self):
            unittest.TestCase.tearDown(self)
    
        def test_upper(self):
            self.assertEqual('foo'.upper(), 'FOO')
            
        def test_isupper(self):
            self.assertTrue('FOO'.isupper())
            self.assertFalse('Foo'.isupper())
            
        def test_split(self):
            s = 'hello world'
            self.assertEqual(s.split(), ['hello','world'])
            with self.assertRaises(TypeError):
                s.split(2)
    
    if __name__ == "__main__":
        #import sys;sys.argv = ['', 'Test.testName']
         unittest.main()

    unittest.main()会去查找所有以test开头的方法,并把它们当做一个个测试用例

    方法二:用测试套件

    import unittest
    
    class TestStringMethods(unittest.TestCase):
        
        def setUp(self):
            unittest.TestCase.setUp(self)
            
        def tearDown(self):
            unittest.TestCase.tearDown(self)
    
        def test_upper(self):
            self.assertEqual('foo'.upper(), 'FOO')
            
        def test_isupper(self):
            self.assertTrue('FOO'.isupper())
            self.assertFalse('Foo'.isupper())
            
        def test_split(self):
            s = 'hello world'
            self.assertEqual(s.split(), ['hello','world'])
            with self.assertRaises(TypeError):
                s.split(2)
        
    def suite():
        
        suite = unittest.TestSuite()
        suite.addTest(TestStringMethods('test_upper'))
        suite.addTest(TestStringMethods('test_isupper'))
        unittest.TextTestRunner(verbosity=2).run(suite)
        
    if __name__ == "__main__":
        
        suite()
        #import sys;sys.argv = ['', 'Test.testName']
    #     unittest.main()

    方法三:用TestLoader

    import unittest 
    class TestCase1(unittest.TestCase):
        #def setUp(self):
        #def tearDown(self):
        def testCase1(self):
            print 'aaa'      
        def testCase2(self):
            print 'bbb'
      
    class TestCase2(unittest.TestCase):
        #def setUp(self):
        #def tearDown(self):
        def testCase1(self):
            print 'aaa1'  
        def testCase2(self):
            print 'bbb1'
            
    if __name__ == "__main__":
        #此用法可以同时测试多个类
        suite1 = unittest.TestLoader().loadTestsFromTestCase(TestCase1) 
        suite2 = unittest.TestLoader().loadTestsFromTestCase(TestCase2) 
        suite = unittest.TestSuite([suite1, suite2]) 
        unittest.TextTestRunner(verbosity=2).run(suite)

    方法四:测试套件的一种变性,和方法二差不多

    import unittest
    
    class TestStringMethods(unittest.TestCase):
        
        def setUp(self):
            unittest.TestCase.setUp(self)
            
        def tearDown(self):
            unittest.TestCase.tearDown(self)
    
        def test_upper(self):
            self.assertEqual('foo'.upper(), 'FOO')
            
        def test_isupper(self):
            self.assertTrue('FOO'.isupper())
            self.assertFalse('Foo'.isupper())
            
        def test_split(self):
            s = 'hello world'
            self.assertEqual(s.split(), ['hello','world'])
            with self.assertRaises(TypeError):
                s.split(2)
        
    def suite():
      
         tests = ['test_upper','test_isupper']
         suite = unittest.TestSuite(map(TestStringMethods,tests))
         unittest.TextTestRunner(verbosity=2).run(suite)
        
    
    if __name__ == "__main__":
        
        suite()
        #import sys;sys.argv = ['', 'Test.testName']
    #     unittest.main()

    方法五:用discover

    import unittest
    
    class TestStringMethods(unittest.TestCase):
        
        def setUp(self):
            unittest.TestCase.setUp(self)
            
        def tearDown(self):
            unittest.TestCase.tearDown(self)
    
        def test_upper(self):
            self.assertEqual('foo'.upper(), 'FOO')
            
        def test_isupper(self):
            self.assertTrue('FOO'.isupper())
            self.assertFalse('Foo'.isupper())
            
        def test_split(self):
            s = 'hello world'
            self.assertEqual(s.split(), ['hello','world'])
            with self.assertRaises(TypeError):
                s.split(2)
        
    def suite():
    
         suite=unittest.TestSuite()
         discover=unittest.defaultTestLoader.discover(casepath, pattern='test_*.py', top_level_dir=None)
         #将discover方法筛选出来的用例,循环添加到测试套件中,打印出的用例信息会递增
         for test_case in discover:
                 suite.addTests(test_case)           
         print(suite)         
         return suite
    
    if __name__ == "__main__":
        
        all_test_cases = suite()
        unittest.TextTestRunner().run(all_test_cases)
        #import sys;sys.argv = ['', 'Test.testName']
    #     unittest.main()
  • 相关阅读:
    条件编译
    宏定义
    联合体,枚举类型
    结构体的概念
    C#程序报找不到时区错误
    C# ArrayList和List的区别
    C# 无法将类型为“__DynamicallyInvokableAttribute”的对象强制转换为类型...
    C# readonly与const区别
    C#特性
    Linux vsftpd 安装配置使用
  • 原文地址:https://www.cnblogs.com/mgzc-1508873480/p/8280451.html
Copyright © 2011-2022 走看看