unittest单元测试框架入门及应用
一、简介
unittest是Python单元测试框架。unittest它支持自动化测试,在测试中使用setup(初始化)和shutdown(关闭销毁)操作,组织测试 用例为套件(批量运行),以及把测试和报告独立开来。
测试脚手架(test fixture):为了开展一项或多项测试所需要进行的准备工作,以及所有相关的清理操作。
测试用例(test case):一个测试用例是一个独立的测试单元。检查输入特定的数据时的响应。 unittest 提供一个基类: TestCase ,用于新建测试用例。
测试套件(test suite):一系列的测试用例。用于归档需要一起执行的测试用例。
测试运行器(test runner):一个用于执行和输出测试结果的组件
综上,整个流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。
官方文档:https://docs.python.org/zh-cn/3.7/library/unittest.html
二、unittest类的属性
unittest.TestCase:TestCase类,所有测试用例类继承的基本类。
unittest.main():使用她可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。
unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的。
unittest.TextTextRunner():unittest框架的TextTextRunner()类,通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。
unittest.defaultTestLoader(): defaultTestLoader()类,通过该类下面的discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。
unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。
三、跳过测试与预计的失败
@unittest.skip(reason)
跳过被此装饰器装饰的测试。 reason 为测试被跳过的原因。
@unittest.skipIf(condition, reason)
当 condition 为真时,跳过被装饰的测试。
@unittest.skipUnless(condition, reason)
跳过被装饰的测试,除非 condition 为真。
@unittest.expectedFailure
把测试标记为预计失败。如果测试不通过,会被认为测试成功;如果测试通过了,则被认为是测试失败。
四、常用的断言方法
五、unittest实例
我们就来上手,举个简单的例子来看看unittest里面的属性、函数与用例如何运行的。
# 导入unittest模块
import unittest # unittest.TestCase:TestCase类,所有测试用例类继承的基本类。
class TestStringCase(unittest.TestCase):
# TestCase基类方法,所有case执行之前自动执行
@classmethod
def setUpClass(self):
print("这里是所有测试用例前的准备工作") # TestCase基类方法,所有case执行之后自动执行
@classmethod
def tearDownClass(self):
print("这里是所有测试用例后的清理工作") # TestCase基类方法,每次执行case前自动执行
def setUp(self):
print("这里是一个测试用例前的准备工作") # TestCase基类方法,每次执行case后自动执行
def tearDown(self):
print("这里是一个测试用例后的清理工作") @unittest.skip("我想临时跳过这个测试用例.")
# 测试用例1
def test_case1(self):
print('执行测试用例1')
s = 'hello'
self.assertEqual(s, "hello") # 测试用例2
def test_case2(self):
print('执行测试用例2')
s = '测试'
self.assertEqual(s, '测试') # 测试用例3
def test_case3(self):
print('执行测试用例3')
s= 'ceshi'
self.assertEqual(s, 'ceshi') #测试用例集合方法
def suite():
#实例化测试套件
suite = unittest.TestSuite()
#将用例加到用例集及运行顺序
suite.addTest(TestStringCase('test_case3'))
suite.addTest(TestStringCase('test_case2'))
return suite #path= './' 定义测试集所在文件夹
#pattern='unittest_Two.py' 规定测试集文件
#discover方法找到path 目录下所有文件到的测试用例组装到测试套件
def discover():
path = './'
rundiscover = unittest.defaultTestLoader.discover(path,pattern='unittest_Two.py')
return rundiscover if __name__ == "__main__":
#运行用例方法一:
unittest.main() #运行用例方法二:
#实例化TextTestRunner类
#runner = unittest.TextTestRunner()
#runner.run(suite()) #运行用例方法三:
#实例化TextTestRunner类
#runner = unittest.TextTestRunner()
#run()方法执行discover
#runner.run(discover())
unittest实例方法一运行的结果:
打印中前面的实心点,表示用例断言成功并通过,s则表示跳转执行用例。
unittest实例方法二运行的结果:
unittest实例方法三运行的结果同方法一结果所示。
六、生成测试报告
知道了用例如何编写,那么我们来看看unittest的测试报告,这里我介绍的是经大神改进后的HTMLTestRunnerCN,由于HTMLTestRunner样式简陋,我们不做介绍。
Github下载HTMLTestRunnerCN:https://github.com/findyou/HTMLTestRunnerCN
我用的是python3.x,注意下载后用3.x下面的HTMLTestRunnerCN。Git上的文件名叫HTMLTestReportCN.py。
下载文件然后存放到你的Python安装目录中:\Lib\site-packages目录下即可。代码中如何使用呢?在上面用例的基础上,修改为下面的代码。如下所示。
if __name__ == "__main__":
filePath ='D:\\Report.html' #确定生成报告的路径
fp = open(filePath,'wb')
runner = HTMLTestReportCN.HTMLTestRunner(
stream=fp,
title='自动化测试报告',
#description='测试用例结果描述', #不传默认为空
tester='wuwei' #测试人员名字
)
runner.run(discover())
正常运行py用例文件,python XX.py,系统会在D盘下自动创建一个文件名为Report.html的html测试报告。上述实例运行的测试报告结果如下图所示。
备注:刚开始应用测试报告时,不知道有没有小伙伴发现。用例列表中的失败与通过的按钮展示都是红色,但是我想成功为绿色,失败为红色。我这里稍微修改了一下HTMLTestRunnerCN.py的源码。
原代码:
tmpl = has_output and self.REPORT_TEST_WITH_OUTPUT_TMPL or self.REPORT_TEST_NO_OUTPUT_TMPL
修改为:
tmpl = (n == 0 and self.REPORT_TEST_NO_OUTPUT_TMPL or self.REPORT_TEST_WITH_OUTPUT_TMPL)
找至成功按钮展示列表逻辑。
修改为:
# 通过 的样式,加标签效果
REPORT_TEST_NO_OUTPUT_TMPL = r"""
<tr id='%(tid)s' class='%(Class)s'>
<td class='%(style)s'><div class='testcase'>%(desc)s</div></td>
<td colspan='5' align='center'>
<button id='btn_%(tid)s' type="button" class="btn btn-success btn-xs" data-toggle="collapse" data-target='#div_%(tid)s'>%(status)s</button>
<div id='div_%(tid)s' class="collapse in">
<pre>
%(script)s
</pre>
</div>
</td>
</tr>
""" # variables: (tid, Class, style, desc, status)
大家可以根据自己的需求来修改HTMLTestRunnerCN.py的源码,来实现自己的需要的测试报告样式与需求。
七、requests接口测试应用unittest实例
上面的Demo实例不过瘾,我们来看看python requests接口测试如何来应用unittest实例的。下面我列举的是一个慕课网的搜索接口,普通的Get请求的实例,涉及应用到接口调用,上面说明两个简单的用例,断言及上述HTMLTestReportCN生成的测试报告。
# 导入os、unittest、requests、HTMLTestReportCN模块
import requests
import unittest
import os
import HTMLTestReportCN # 发送Get请求方法
def sendGet(url, paramData):
result = requests.get(url=url, params=paramData).json()
return result # unittest.TestCase:TestCase类,所有测试用例类继承的基本类。
class TestRequestOne(unittest.TestCase):
# 每次case执行前,调用接口地址
def setUp(self):
print("这里是一个测试用例前的准备工作")
#接口地址
self.url = 'https://www.imooc.com/search/history' def tearDown(self):
print("这里是一个测试用例后的清理工作") # 测试用例1
def test_api1(self):
resultData = sendGet(url=self.url, paramData={'words': 'test'})
# 用例断言
self.assertEqual(resultData['data'][0]['word'], "testng") # 测试用例2
def test_api2(self):
resultData = sendGet(url=self.url, paramData={'words': '测试'})
# 用例断言
self.assertEqual(resultData['data'][0]['word'], "测试你好") #测试用例集合方法
def suite():
#实例化测试套件
suite = unittest.TestSuite()
#将用例加到用例集及运行顺序
suite.addTest(TestRequestOne('test_api2'))
suite.addTest(TestRequestOne('test_api1'))
return suite if __name__ == "__main__":
filePath = 'D:\\Report.html' # 确定生成报告的路径
fp = open(filePath, 'wb')
runner = HTMLTestReportCN.HTMLTestRunner(
stream=fp,
title='简单接口自动化测试报告',
description='简单接口自动化测试用例结果', #不传默认为空
tester='wuwei' # 测试人员名字,不传默认为QA
)
runner.run(suite())
上述测试用例运行结果的测试报告如下:
八、seleniumWeb自动化应用unittest实例
上面我们用unittest进行了接口测试的实例应用,下面我们就来看看unittest如何在seleniumWeb自动化中应用的。我们以百度首页为例来进行web自动化测试,搜索并进行断言,生成对应的测试报告。
# 导入os、unittest、requests、HTMLTestReportCN模块
from selenium import webdriver
import unittest
import os
import HTMLTestReportCN
import time # unittest.TestCase:TestCase类,所有测试用例类继承的基本类。
class TestSeleniumOne(unittest.TestCase):
# 每次case执行前,调用接口地址
def setUp(self):
print("这里是一个测试用例前的准备工作")
#chrome实例,打开浏览器网页
self.driver = webdriver.Chrome()
self.driver.get('https://www.baidu.com') def tearDown(self):
print("这里是一个测试用例后的清理工作")
#每个用例执行后关闭浏览器
self.driver.quit() # 测试用例1
def test_selenium1(self):
# 利用find_element_by_id定位元素位置并模拟按键输入“博客园”,点击百度一下按钮搜索,断言
self.driver.find_element_by_id("kw").send_keys("博客园")
self.driver.find_element_by_id("su").click()
time.sleep(5)
resultTest = self.driver.find_element_by_xpath("//*[@id='1']/h3").text
self.assertEqual(resultTest,"博客园 - 开发者的网上家园官方") # 测试用例2
def test_selenium2(self):
# 利用find_element_by_id定位元素位置并模拟按键输入“测试”,点击百度一下按钮搜索,断言
self.driver.find_element_by_id("kw").send_keys("测试")
self.driver.find_element_by_id("su").click()
time.sleep(5)
resultTest = self.driver.find_element_by_xpath("//*[@id='3001']/div[1]/h3").text
self.assertEqual(resultTest,"ceshi_前景如何?博为峰16年专注软件测试培训") #测试用例集合方法
def suite():
#实例化测试套件
suite = unittest.TestSuite()
#将用例加到用例集及运行顺序
suite.addTest(TestSeleniumOne('test_selenium1'))
suite.addTest(TestSeleniumOne('test_selenium2'))
return suite if __name__ == "__main__":
filePath = 'D:\\Report.html' # 确定生成报告的路径
fp = open(filePath, 'wb')
runner = HTMLTestReportCN.HTMLTestRunner(
stream=fp,
title='简单Web自动化测试报告',
description='简单Web自动化测试用例结果', #不传默认为空
tester='wuwei' # 测试人员名字,不传默认为QA
)
runner.run(suite())
上述测试用例运行结果的测试报告如下:
unittest单元测试框架入门及应用的更多相关文章
- unittest单元测试框架总结
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- unittest单元测试框架详解
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型
1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...
- unittest单元测试框架
unittest单元测试框架 概述: 单元测试框架主要用来完成以下三件事: 提供用例组织与执行:当测试用例只有几条时,可以不必考虑用例的组织,但是当用例达到成百上千条时,大量的用例堆砌在一起,就产生了 ...
- unittest单元测试框架简单说明
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- Python+selenium之简单介绍unittest单元测试框架
Python+selenium之简单介绍unittest单元测试框架 一.unittest简单介绍 unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是 ...
- unittest单元测试框架总结(转载)
转载:https://www.cnblogs.com/yufeihlf/p/5707929.html unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该 ...
- 四. 引入unittest单元测试框架
1. 安装 SeleniumIDE(firefox) (1)下载地址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/ (2 ...
- unittest 单元测试框架断言方法
unittest单元测试框架的TestCase类下,测试结果断言方法:Assertion methods 方法 检查 版本 assertEqual(a, b) a == b assertNotEqu ...
随机推荐
- linux磁盘已满,查看哪个文件占用多
1.使用df -h查看磁盘空间占用情况 2.使用sudo du -s -h /* | sort -nr命令查看那个目录占用空间大 3.然后那个目录占用多 再通过sudo du -s -h /var/* ...
- MYsql 8 连接报错 MySQLNonTransientConnectionException: Could not create connection to database server.
本地安装mysql 是8 项目中数据驱动 也要求是 8 <dependency> <groupId>mysql</groupId> <artifactId&g ...
- shell 并行运行。
我实在是太喜欢这个方法了.爽歪歪. 原帖 http://www.xaprb.com/blog/2009/05/01/an-easy-way-to-run-many-tasks-in-parallel/ ...
- 用JetBrains PyCharm 开发工具写一个简单python案例
import urllib.request import re #解析html的内容 def getHtml(url): page=urllib.request.urlopen(url) html=p ...
- python基本数据类型:字符串及其方法(一)
大小写转换类 方法一:capitalize()首字母大写字符串 name='hatusne miku' name1=name.capitalize() print(name,name1) 方法二:ti ...
- uniapp打包发版到linux服务器步骤----H5端
最近在写uni-app项目,项目打包部署到服务器后,搞了好一会一直打开是空白页,原来自己有几个地方疏忽了,现把步骤整理一下: 第1步:编辑配置 mainifest.json 文件 tip:运行的基础路 ...
- C# HttpClient 使用 Consul 发现服务
试用了Overt.Core.Grpc, 把 GRPC 的使用改造得像 WCF, 性能测试也非常不错, 非常推荐各位使用. 但已有项目大多是 http 请求, 改造成 GRPC 的话, 工作量比较大, ...
- Ef core 如何设置主键
在正题之前,先说明几个问题. (1)写 sql 不好吗,为什么要引入 ORM ? 总的来说由于需求的复杂性增加,引入了面向对象编程,进而有了 ORM ,ORM 使得开发人员以对象的方式表达业务逻辑.对 ...
- [ES6系列-06]展开操作符 Spread Operator 就像解压到这里
[原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs 在前面的文章中,介绍了...在获取剩余参数中的作用. ...
- Java 获取IP工具类、Vo类整理记录
前言 日常开发中,获取ip是常用的功能,本文记录如何在Java中获取本机外网ip.地理位置,访问用户的外网ip.地理位置,以及指定外网ip的地理位置: 代码编写 1.获取访问用户外网ip,我们从访问者 ...