一、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?

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)

最新文章

  1. 清除页面广告?身为前端,自己做一款简易的chrome扩展吧
  2. React常用的API说明
  3. 非Spring下的Quartz
  4. QB资料学习.01
  5. ExtJs布局之border
  6. strcasecmp在VS2010中提示未定义标识符
  7. js移除最后一个字符,js替换字符串的连接符号,js移除最后一个分隔符号
  8. 道破Redis的VM
  9. MyBatis_动态SQL
  10. Java Enum解析【转】
  11. js数组去重排序(封装方法)
  12. Streaming Principal Component Analysis in Noisy Settings
  13. .net调用系统软键盘(兼容win7及win10)
  14. PHP7.27: connect mysql 5.7 using new mysqli
  15. 发现eclipse红叉,查看markers发现Target runtime Apache Tomcat 6.0 is not defined
  16. 20155303 2016-2017-2 《Java程序设计》第八周学习总结
  17. CentOS6安装各种大数据软件 第一章:各个软件版本介绍
  18. 解题:BZOJ 4808 马
  19. RedHat7.4最小化安装没有ifconfig命令
  20. python基础-第十三篇-13.2Web框架之Tornado

热门文章

  1. go-redis 基于beego正确使用序列化存储数据和反序列化获取数据
  2. centos7 命令 对比 cenots6 命令
  3. 【C语言】一堆数组中存放了10个小于100的整数,请编程对所有数据按照从小到大的顺序进行排序,若个位数相等,则按照十位从小到大的顺序排序,输出排序后的结果
  4. 每天进步一点点------verilog语言实现的分频
  5. Mac系统升级后git没法使用的问题
  6. [Excel] 一些实用的函数式子
  7. Nuxt配置动态路由以及参数校验
  8. Java - Java IO 示例
  9. cordova的安装与配置
  10. cJson 常见用法