zoukankan      html  css  js  c++  java
  • 细说unittest

    一、unittest模块官方文档:

    https://docs.python.org/3/library/unittest.html

    二、一张图看懂unittest:

    三、Unittest主要方法属性:

    1.unittest.TestCase:TestCase类,所有测试用例继承的基本类:

       class myfunTest(unittest.TestCase):

           def setUp(self):

           print('每个用例执行前都会调用setUp准备环境')

    2.unittest.main():使用它可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行它们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z.所以以A开头的测试用例方法会优先执行,以a开头会执行:

       if __name=="__main__()":

          unittest.main()

    3.unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的:

        tests=myfunTest("test_is_prime")

        suite=unittest.TestSuite()

        suite.addTest(tests)

    4.unittest.TextRunner():unittest框架的TextTextRunner()类,通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件:

        runner=unittest.TextTestRunner()

        runner.run(suite)

    5.unittest.defaultTestLoader():defaultTestLoader()类,通过该类下面的discover()方法可自动跟据测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。用法如下:

        discover=unittest.defaultTestLoader.discover(test_dir,pattern=’test*.py’):

        test_dir = r'D:CollectionOverviewwebzidonghu'

        discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py')

    6.unittest.skip():装饰器,当运行用例时,有效用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。

    @unittest.skip(reason):无条件跳过装饰的测试,并说明跳过测试的原因。

    @unittst.skipif(condition,reason):条件为真时,跳过装饰的测试,并说明跳过测试的原因。

    @unittest.skipUnless(condition,reason):条件为假是,跳过装饰的测试,并说明跳过测试的原因。

    @unittet.expectedFailure():测试标记为失败。

    @unittest.skipUnless(sys.platform.startswith('linux'),'requires Linux') #跳过该测试用例

        def test_divide(self):

            ''' test method divide '''

          print('divide')

    7.setUp():用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登陆web,可以先实例化浏览器:

        def setUp(self):

            url='https://mail.yeah.net/'

          self.browser=webdriver.Firefox()

          self.browser.got(url)

          time.sleep(5)

    8.tearDown():用于测试用例执行之后的善后工作。如关闭数据库链接。关闭浏览器:

        def tearDown(self):

            self.browser.closet()

    9.assert*():一些断言方法,在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否想等决定的:

        self.assertTrue(is_prime(5))

        self.assertFalse(is_prime(-3))

    10.addTest():将测试用例添加到测试套件中,如下方,是将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件:

        suite=unittest.TestSuite()

        suite.addTest(test_baidu.BaiduTest(‘test_baidu’))

    11.run():运行测试套件的测试用例,入参为suite测试套件:

        runner=unittest.Text.Text.Runner()

        runner.run(suite)

    四、框架如何解决自动化需求的4个问题:

    1.如何控制用例执行顺序?

    在unittest中,用例是以test开头的方法定义的,默认执行顺序是根据用例名称的ASCII码升序进行如上面的用例,实际执行顺序为:test_add->test_divide->test_is_prime,而不是用例定义的先后顺序。在unittest中解决用例执行顺序的问题是使用TestSuite,代码如下:

    #使用TestSuite控制用例顺序,用例的执行顺序是由添加到TestSuite的顺序决定的
    tests=[myfunTest("test_is_prime"),myfunTest("test_add"),myfunTest("test_divide")]
    suite=unittest.TestSuite()
    #suite.addTest()
    suite.addTest(tests) #将测试用例实例增加到测试套件中
    runner=unittest.TextTestRunner()
    runner.run(suite)

     2.如何让多个用例共用setUp,tearDown?

    Unittest的setUp、tearDown会在每个用例执行前后执行一次,如上面测试用例类中有3个测试用例,那么每个用例执行前会执行setUp,执行后会执行tearDown,即setUp、tearDown总共会调用三次,但考虑实际自动化测试场景,多个用例只需执行一次setUp,全部用例执行完成后,执行一次tearDown,针对该种场景,unittest的处理方法是使用setupclass、teardownclass,注意@classmethod的使用,代码如下:

    @classmethod
    def setUpClass(cls):
    print('所有用例执行前会调用一次setUp准备环境')

    @classmethod
    def tearDownClass(cls):
    print('所有用例执行后会调用一次tearDown进行环境清理')

     3.如何跳过用例:

    在自动化测试中,经常会遇到挑选用例的清况,在unittest中的解决方法是使用skip装饰器,其中skip装饰器主要有3种:

    unittest.skip(reason),

    unittst.skipif(condition,reason),

    unittest.skipUnless(condition,reason),

    即在满足conditiong条件下跳过该用例,reason用于描述跳过的原因,实例代码如下:

    @unittest.skipUnless(sys.platform.startswith('linux'),'requires Linux') #跳过该测试用例
    def test_divide(self):
    ''' test method divide '''
    print('divide')
    self.assertEqual(2,divide(6,3))
    self.assertNotEqual(2,divide(5,2))

     4.如何生成html格式的测试报告:

    Unittest中默认生成的报告格式为txt,如果想生成html格式的报告,可以使用HtmlTestRunner模块,安装后导入该模块,使用HTMLTestRunner代替默认的TextTestRunner()执行测试用例即可。实例代码如下:

    suite=unittest.TestSuite()
    suite.addTest(unittest.TestLoader().loadTestFromTest(myfunTest)) #使用TestLoader加载测试用例

    runner=HTMLTestRunner(output="result")
    runner.run(suite)

    五、完整代码如下:

    复制代码
     1 import unittest
     2 #https://pypi.org/project/html-testRunner
     3 from HtmlTestRunner import HTMLTestRunner    #导入第三方模块,执行结果生成html报告:pip install html-testRunner
     4 
     5 class myfunTest(unittest.TestSuite):
     6     ''' test myfunTest: test fixture only once '''
     7     
     8     
     9     @classmethod
    10     def setUpClass(cls):
    11         print('所有用例执行前会调用一次setUp准备环境')
    12         
    13         
    14     @classmethod
    15     def tearDownClass(cls):
    16         print('所有用例执行后会调用一次tearDown进行环境清理')
    17         
    18         
    19     def test_add(self):
    20         ''' test method add(a,b) '''
    21         print('add')
    22         self.assertEqual(3,add(1,2))
    23         self.assertNotEqual(3,add(2,2))
    24         
    25         
    26     @unittest.skipUnless(sys.platform.startswith('linux'),'requires Linux')    #跳过该测试用例
    27     def test_mul(self):
    28         ''' test method mul '''
    29         print('mul')
    30         self.assertEqual(2,mul(6,3))
    31         self.assertNotEqual(13,mul(7,2))
    32         
    33         
    34 if __name__=='__main__':
    35     suite=unittest.TestSuite()
    36     suite.addTest(unittest.TestLoader().loadTestFromTest(myfunTest))    #使用TestLoader加载测试用例
    37     
    38     runner=HTMLTestRunner(output="result")
    39     runner.run(suite)
    复制代码
    复制代码
     1 #coding=utf-8
     2 
     3 import unittest
     4 
     5 
     6 class myfunTest(unittest.TestCase):
     7      '''Test myfunTes'''
     8     
     9     
    10     def setUp(self):
    11         print('每个用例执行前都会调用setUp准备环境')
    12         
    13         
    14     def is_prime(number):
    15         if number<0 or number in (0,2):
    16             return False
    17         for element in range(2,number):
    18             if number%element==0:
    19                 return False
    20         return True
    21         
    22         
    23     def add(a,b):
    24         return a+b
    25         
    26         
    27     def mul(a,b):
    28         return a*b
    29         
    30         
    31     def test_is_prime(self):
    32         '''
    33         Test method is_prime(number)
    34         '''
    35         print('is_prime')
    36         self.assertTrue(is_prime(5))
    37         self.assertFalse(is_prime(8))
    38         self.assertFalse(is_prime(-3))
    39             
    40             
    41     def test_add(self):
    42         '''
    43         Test method add(a,b)
    44         '''
    45         print('add')
    46         self.assertEqual(3,add(1,2))
    47         self.assertNotEqual(3,add(2,2))
    48         
    49         
    50     def test_mul(self):
    51         '''
    52         Test method mul
    53         '''
    54         print ('mul')
    55         self.assertEqual(18,mul(6,3))
    56         self.assertNotEqual(6,mul(3,2))
    57         
    58         
    59     def tearDown(self):
    60         print('每个用例执行完都会调用tearDown进行环境清理')
    61         
    62         
    63 if __name__='__main__':
    64     #使用TestSuite控制用例顺序,用例的执行顺序是由添加到TestSuite的顺序决定的
    65     tests=[myfunTest("test_is_prime"),myfunTest("test_add"),myfunTest("test_mul")]
    66     
    67     suite=unittest.TestSuite()
    68     #suite.addTest()
    69     suite.addTest(tests)    #将测试用例实例增加到测试套件中
    70     
    71     runner=unittest.TextTestRunner()
    72     runner.run(suite)
    复制代码
  • 相关阅读:
    vue+element-ui中的表单验证(电话等等)
    什么是 RegExp?
    C中的指针和字符串
    getchar与scanf区别
    回显程序
    Python基础之容器1----字符串和列表
    Python基础之语句2
    Python基础之语句1
    Python基础之数据基本运算
    python初识
  • 原文地址:https://www.cnblogs.com/xiaoneng/p/11660644.html
Copyright © 2011-2022 走看看