XUnit测试框架-Python unittest
选择
语言选择
本次个人作业我选择的语言是Python,了解学习Python有一段时间了但是一直没有练习,所以这次玩蛇,使用的版本是Python3.6。
开发工具选择
我选择的IDE是Pycharm,个人认为Pycharm是一款不错的Py开发工具,用起来得心应手,unittset是py自带的包不需要安装直接引用即可,方便快捷。开发工具截图如下。

Python单元测试框架unittest
unittest简介
TestCase(测试用例)
一个testcase就是一个测试用例,包括测试前环境的搭建setUp,执行测试代码run,测试后环境的还原tearDown,是一个完整的测试单元。
TestSuite(测试套件)
多个testcase的集合
TestLoder
用来加载TestCase到TestSuite中
TextTestRunner
是来执行测试用例的
TextTestResult
保存测试结果的类
TestFixture
测试准备前和执行后要做到的工作
核心工作原理
unittest实例
准备待测方法
mathfunc.py
def add(a,b):
return a+b
def minus(a,b):
return a-b
def multi(a,b):
return a*b
def divide(a,b):
return a/b
编写测试方法
test_mathfunc.py
import unittest
from mathfunc import *
class TestMathFunc(unittest.TestCase):
#每个测试方法以test开头
def test_add(self):
self.assertEqual(3,add(1,2))
self.assertNotEqual(3,add(2,2))
def test_minus(self):
self.assertEqual(1,minus(3,2))
def test_multi(self):
self.assertEqual(6,multi(2,3))
def test_divide(self):
self.assertEqual(2,divide(6,3))
self.assertEqual(2.5,divide(5,2))
if __name__ == '__main__':
#verbosity 输出详细程度 0 1 2
unittest.main(verbosity=2)
运行结果
测试通过

测试不通过
把除法/改为//(整除)报错如下图

TestSuite
上面的代码运行无序,如果我们写的用例有顺序的话,就需要用TestSuite,被添加到TestSuite中的case会被按照顺序执行。
编写test_suite.py代码如下
import unittest
from test_mathfunc import TestMathFunc
from HTMLTestRunner import HTMLTestRunner
if __name__ == '__main__':
suite = unittest.TestSuite()
tests = [TestMathFunc("test_add"), TestMathFunc("test_minus"), TestMathFunc("test_divide")]
#addTests添加多个TestCase
#addTest添加单个TestCase
#suite.addTests(tests)
suite.addTests(unittest.TestLoader().loadTestsFromName('test_mathfunc.TestMathFunc'))
#suite.addTests(unittest.TestLoader().loadTestsFromNames(['test_mathfunc.TestMathFunc')]) 传入列表
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
addTests方法
传入一个TestCase对象的列表。
unittest.TestLoader().loadTestsFromName/Names
传入一个TestCase对象,这个对象里可以包含多个test_开头的方法,每个test_开头的方法处理的时候都可以理解为一个TestCase实例。
TestFixture
在实际测试中,我们可能会遇到这种情况,需要测试的方法中有的需要连接数据库,测试完毕需要还原数据,所以我们就需要一个准备环境的方法(setUp)还有清理环境的方法(TearDown),这就是TestFixture所包含的内容。
修改test_mathfunc.py如下
import unittest
from mathfunc import *
class TestMathFunc(unittest.TestCase):
#重写了TestCase的方法
def setUp(self):
print("开始测试之前的环境搭建")
def tearDown(self):
print("环境清理")
def test_add(self):
self.assertEqual(3,add(1,2))
self.assertNotEqual(3,add(2,2))
def test_minus(self):
self.assertEqual(1,minus(3,2))
def test_multi(self):
self.assertEqual(6,multi(2,3))
#skip装饰器
@unittest.skip("我不想执行除法")
#@unittest.skipIf(condition=,reason=) 当condition为true时跳过
#@unittest.skipUnless(condition=,reason=) 为false时跳过
def test_divide(self):
self.assertEqual(2,divide(6,3))
self.assertEqual(2.5,divide(5,2))
if __name__ == '__main__':
unittest.main(verbosity=2)
在实际测试中我们也可能会遇到这样的情况,开始测试前需要连接数据库,测试结束后关闭连接,不需要还原数据,只在开始和结束各自执行一次即可,setUpClass和tearDownClass的作用就是实现以上功能。
@classmethod
def setUpClass(cls):
print("开始测试之前的环境搭建统一")
@classmethod
def tearDownClass(cls):
print("最后清理环境")
输出结果如下图

没有得到想要的结果,多次输出发现setUp和tearDown输出位置不定,猜想是因为不是单线程执行造成的,所以进行调试结果正确,暂存疑问。

跳过测试
有时候当某些条件的时候我们可能需要跳过测试,unittest也为我们提供了相应的方法
#@unittest.skipIf(condition=,reason=) 当condition为true时跳过
#@unittest.skipUnless(condition=,reason=) 为false时跳过
def test_divide(self):
self.assertEqual(2,divide(6,3))
self.assertEqual(2.5,divide(5,2))
执行结果如下

把结果保存到文件中
保存到文本文件中
with open('Unittest.txt','a') as f:
runner = unittest.TextTestRunner(stream=f, verbosity=2)
runner.run(suite)
会在项目目录下生成Unittext.txt文本文件,内容如下
test_add (test_mathfunc.TestMathFunc) ... ok
test_divide (test_mathfunc.TestMathFunc) ... ok
test_minus (test_mathfunc.TestMathFunc) ... ok
test_multi (test_mathfunc.TestMathFunc) ... ok
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK
生成HTML
需要HTMLTsetRunner文件
with open('HTMLReport.html', 'wb') as f:
runner = HTMLTestRunner(stream=f, title="123", description="test", verbosity=2)
runner.run(suite)
XUnit测试框架-Python unittest的更多相关文章
- [转]Python测试框架对比----unittest, pytest, nose, robot framework对比
测试框架 什么是框架? 框架(Framework)是整个或部分系统的可重用设计,框架是用来解决代码的组织及运行控制问题的. 在我们编写自动化脚本的时候,经常需要读取配置文件,读取数据文件,发送请求 ...
- Python测试框架对比----unittest, pytest, nose, robot framework对比
什么是框架? 框架(Framework)是整个或部分系统的可重用设计, 框架是用来解决代码的组织及运行控制问题的. 在我们编写自动化脚本的时候,经常需要读取配置文件,读取数据文件,发送请求,记录日志, ...
- Allure测试框架 python
关于Allure Allure是一个report框架,可以基于一些测试框架生成测试报告,比较常用的一般是Junit/Testng框架: Allure 生成的报告样式简洁美观,同时又支持中文: Allu ...
- Python测试框架之Unittest梳理
1. 2.
- 接口框架 python+unittest+request+HTMLTestRunner
request的各种方法主要用来处理客户端浏览器提交的请求中的各项参数和选项.如POST,GET最常用的两种请求 官方文档:http://docs.python-requests.org/en/mas ...
- Python接口测试实战3(下)- unittest测试框架
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python 各种测试框架简介
转载:https://blog.csdn.net/yockie/article/details/47415265 一.doctest doctest 是一个 Python 发行版自带的标准模块.本篇将 ...
- phpunit 测试框架安装
PHPUnit是一个轻量级的PHP测试框架.它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计).来自百度百科 一.下载wg ...
- PHP自动测试框架Top 10
对于很多PHP开发新手来说,测试自己编写的代码是一个非常棘手的问题.如果出现问题,他们将不知道下一步该怎么做.花费很长的时间调试PHP代码是一个非常不明智的选择,最好的方法就是在编写应用程序代码之前就 ...
随机推荐
- js 讲解
substring() 取文本中间 split() 分割文本 charcodeat() utf-8 tolowercase() 小写 正则是一个对象 正则 i 不区分大小写 escape(s ...
- 寻找真正的入口(OEP)--广义ESP定律
1.前言 在论坛上看到很多朋友,不知道什么是ESP定律,ESP的适用范围是什么,ESP定律的原理是什么,如何使用ESP定律?看到了我在“”调查结果发现,大家对ESP定律很感兴趣,当然因为实在是太好用了 ...
- 搭建ionic3-angular5 开发环境并打包成安卓apk包教程
安装node.js 搭建ionic3-angular5 开发环境,首先查看本地电脑是否安装node环境,打开终端,输入 命令: node -v 没有去安装nodejs 网址:http://nodej ...
- 图片上传组件webuploader
前端组件webuploader 当时也是搞了很久参考这种demo,但是没记.现在事后大致总结下.直接上大概代码(我使用asp.net MVC来做的): 执行顺序:(get)Record/Add——A ...
- ListView添加图片文字项
1)listview 控件 结合 imagelist 控件 实现类似效果. 2)添加 imagelist 控件 images 属性,点击后面的... 添加相应图片. 3)点listview,查看其属性 ...
- struct与class的区别
C++中的struct是对C中struct的扩充,它已经不再只是一个包含不同数据类型的数据结构,因为其扩充了太多功能.总的来说,C++中struct和class极其相似,比如,struct能包含成员函 ...
- Libvmi实现分析
LibVMI是一个专注于读写虚拟机内存的自省库,它能够监视虚拟机底层的运行细节并将其还原.LibVMI支持对Xen及KVM虚拟化平台上的运行虚拟机进行自省操作,针对KVM虚拟化平台,LibVMI对QE ...
- GMT\UTC YYYY-MM-DDTHH:mm:ss.sssZ、YYYY-MM-DDTHH:mm:ss.sss+8:00意义及与北京时间转换
UTC: Universal Time Coordinated 协调世界时,又称世界标准时间. GMT: Greenwich Mean Time 格林尼治平均时. 格林尼治标准时间的正午是指当太阳横穿 ...
- 2017(2)数据库设计,数据库设计过程,ER模型,规范化理论
试题二(共 25 分〉 阅读以下关于系统数据分析与建模的叙述,在答题纸上回答问题1 至问题 3. [说明] 某软件公司受快递公司委托,拟开发一套快递业务综合管理系统,实现快递单和物流信息的综合管理.项 ...
- 【java.sql.SQLException: Before start of result set】
将ResultSet转换为 Map<String,String>时抛出了一个这样的异常:java.sql.SQLException: Before start of result set ...