当前位置: 移动技术网 > IT编程>脚本编程>Python > 细说python单元测试框架之unittest之补充

细说python单元测试框架之unittest之补充

2019年05月16日  | 移动技术网IT编程  | 我要评论

特斯拉概念股回调,清货,深圳 宠物

一、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:\collectionoverview\webzidonghu'

    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

unittestsetupteardown会在每个用例执行前后执行一次,如上面测试用例类中有3个测试用例,那么每个用例执行前会执行setup,执行后会执行teardown,即setupteardown总共会调用三次,但考虑实际自动化测试场景,多个用例只需执行一次setup,全部用例执行完成后,执行一次teardown,针对该种场景,unittest的处理方法是使用setupclassteardownclass,注意@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)

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网