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

五、完整代码如下:

 import unittest
#https://pypi.org/project/html-testRunner
from HtmlTestRunner import HTMLTestRunner #导入第三方模块,执行结果生成html报告:pip install html-testRunner class myfunTest(unittest.TestSuite):
''' test myfunTest: test fixture only once ''' @classmethod
def setUpClass(cls):
print('所有用例执行前会调用一次setUp准备环境') @classmethod
def tearDownClass(cls):
print('所有用例执行后会调用一次tearDown进行环境清理') def test_add(self):
''' test method add(a,b) '''
print('add')
self.assertEqual(3,add(1,2))
self.assertNotEqual(3,add(2,2)) @unittest.skipUnless(sys.platform.startswith('linux'),'requires Linux') #跳过该测试用例
def test_mul(self):
''' test method mul '''
print('mul')
self.assertEqual(2,mul(6,3))
self.assertNotEqual(13,mul(7,2)) if __name__=='__main__':
suite=unittest.TestSuite()
suite.addTest(unittest.TestLoader().loadTestFromTest(myfunTest)) #使用TestLoader加载测试用例 runner=HTMLTestRunner(output="result")
runner.run(suite)
 #coding=utf-8

 import unittest

 class myfunTest(unittest.TestCase):
'''Test myfunTes''' def setUp(self):
print('每个用例执行前都会调用setUp准备环境') def is_prime(number):
if number<0 or number in (0,2):
return False
for element in range(2,number):
if number%element==0:
return False
return True def add(a,b):
return a+b def mul(a,b):
return a*b def test_is_prime(self):
'''
Test method is_prime(number)
'''
print('is_prime')
self.assertTrue(is_prime(5))
self.assertFalse(is_prime(8))
self.assertFalse(is_prime(-3)) def test_add(self):
'''
Test method add(a,b)
'''
print('add')
self.assertEqual(3,add(1,2))
self.assertNotEqual(3,add(2,2)) def test_mul(self):
'''
Test method mul
'''
print ('mul')
self.assertEqual(18,mul(6,3))
self.assertNotEqual(6,mul(3,2)) def tearDown(self):
print('每个用例执行完都会调用tearDown进行环境清理') if __name__='__main__':
#使用TestSuite控制用例顺序,用例的执行顺序是由添加到TestSuite的顺序决定的
tests=[myfunTest("test_is_prime"),myfunTest("test_add"),myfunTest("test_mul")] suite=unittest.TestSuite()
#suite.addTest()
suite.addTest(tests) #将测试用例实例增加到测试套件中 runner=unittest.TextTestRunner()
runner.run(suite)

细说unittest-2的更多相关文章

  1. 细说unittest

    一.unittest模块官方文档: https://docs.python.org/3/library/unittest.html 二.一张图看懂unittest: 三.Unittest主要方法属性: ...

  2. unittest笔记

    学习资料: 官网: https://docs.python.org/2.7/library/unittest.html IBM Python自动单元测试框架: http://www.ibm.com/d ...

  3. Unittest框架+ddt数据驱动+HTMLTestRunner+sendmail(自动发送测试报告)+git+Jenkins

    本次写的是针对有代码基础的,没基础建议先去学基础,以下所有描述内容都是我已经在公司项目实践成功的!仅供参考 整体思路: 1.接口自动化用的是Python中unittest框架 2.所有的测试数据用例存 ...

  4. 接口自动化之unittest+ddt

    我在上一篇(https://www.cnblogs.com/wlyhy/p/10083318.html) 文章整理了unittest的模板,但在后续学习中,发现还有许多值得优化的地方.例如在我们设计测 ...

  5. 接口自动化之unittest初探

    最近几天苦心钻研unittest,终于略有所得,所以想来跟大家分享一下.有关python和unittest的基础知识部分就不在一一细说,相信各位也不是小白了.如果需要我整理基础知识,欢迎留言,我会看情 ...

  6. 二、为什么要选用pytest以及 pytest与unittest比较

    为什么要选择pytest,我看中的如下: 写case,不需要像unittest那样,创建测试类,继承unittest.TestCase pytest中的fixture(类似于setUp.tearDow ...

  7. python+unittest框架第二天unittest之简单认识Test Suite:测试套件

    今天了解下测试套件Test Suite,什么是测试套件,测试套件是由多个Test Case测试用例组成的,当然也可以由多个子测试套件组成. 接下来看下如果构建测试套件,构建测试套件的方法: 1.用un ...

  8. 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密

    0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...

  9. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  10. python_单元测试unittest

    Python自带一个单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作. 步骤1:首先引入unittest模块--import un ...

随机推荐

  1. 利用arguments对象在javaScript中实现重载(overload)

    一些概念: 重载(overload): 什么是: 相同函数名,不同参数列表的多个函数,在调用时,可根据传入参数的不同,自动选择对应的函数调用! 为什么: 减轻调用者的负担,一个函数名,可执行多种操作 ...

  2. Linux、UNIX设置开机自动运行命令、脚本配置

    一般我们不建议人工部署开机自动启动的脚本.而是建议通过crontab 部署脚本监控,理由如下: 1.自动开机部署脚本不好定位问题,有可能导致主机重启过慢. 2.自动开机部署脚本不好定位问题,有可能导致 ...

  3. python学习之调试 错误捕捉及处理

    1 捕捉错误:try except    Err_Case1: pass except    Err_Case2: pass else: 正常情况: finally: 无论是否异常都要 处理的代码 w ...

  4. Ajax基础介绍

      什么是Ajax 首先来看一下什么是Ajax,英语全称Asynchronous JavaScript And XML,翻译成中文就是异步的JavaScript和XML.也被称为异步无刷新技术 先来解 ...

  5. vs2013修改为双击打开文件

    vs2012和vs2013默认是单击打开文件,让人突然就不习惯了,各种不爽. 修改方法: 工具-选项-环境-选项卡和窗口-不勾选允许在预览选项卡中打开新文件.

  6. CF895 E. Eyes Closed(线段树 期望)

    题意 Sol 今天考试的T3,,我本来留了一个小时去写.但是T2一刚就刚了两个小时 最后也没来的及写.. 然后考完 开始写,,25min就A了.. 感觉自己太高估自己的思维,太低估自己的码力了... ...

  7. codeforces736D. Permutations(线性代数)

    题意 $m \leqslant 500000$,题目打错了 Sol 神仙题Orz 构造矩阵$B$,使得$B[b[i]][a[i]] = 1$ 那么他的行列式的奇偶性也就对应了生成排列数列数量的奇偶性( ...

  8. [windows]设置开机取消登录窗口选项直接进入桌面

    步骤: 菜单--〉运行--〉输入:control passwords2或rundll32 netplwizdll,UsersRunDll--〉用户账户-用户-取消勾选“要使用本机,用户必须输入用户名和 ...

  9. Spring MVC系列[1]—— HelloWorld

    1.导入jar包 ioc mvc 复制spring-mvc.xml到src目录下. 2.web.xml <?xml version="1.0" encoding=" ...

  10. jmeter分布式测试配置

    jmeter分布式测试 说明:1台8核16G的windows2008的机器,只能器6000个线程,否则效果不是很好:并且负载机器需要做如下设置: 1.打开注册表:regedit 2.HKEY_LOCA ...