python + unittest 做单元测试之学习笔记
单元测试在保证开发效率、可维护性和软件质量等方面有很重要的地位,所谓的单元测试,就是对一个类,一个模块或者一个函数进行正确性检测的一种测试方式。
这里主要是就应用 python + unitest 做单元测试做的一些学习笔记。
Unittest 提供了test cases, test suites, test fixtures,test runner:
- test case :通过继承TestCase类,我们可以创建一个test,或者一组tests
- test suites : 测试套件, 使用时要将test case 装载到测试套件里
- test fixtures : setup + test case + teardown,每个test case执行的时候都会运行setUp->test_case->tearDown ,因此setUp 和 tearDown 可以用来做环境的初始化。例如,写一个有关数据操作的类,setUp放连接数据库,tearDown 放关闭数据库连接。

一、unittest.main() 的使用
所有的test case 要以test开头,例如 def test_pass_case(self)
具体的单元测试例子如下:
import unittest
def calc(x,y):
return x + y class TestCalc(unittest.TestCase):
def test_pass_case(self):
'''这是通过的测试用例'''
print('这个是通过用例')
res = calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(2,3)
def setUp(self):#每个用例执行前都会执行它
print('我是setUp')
def tearDown(self):#每个用例运行之后都会执行它
print('我是tearDown') @classmethod
def setUpClass(cls):#所有的用例执行之前执行一次,setUp()前
print('我是setupClass')#所有的用例都运行完之后执行一次,setDown 后
@classmethod
def tearDownClass(cls):#所有的用例执行之后执行一次,setDown()后
print('我是teardownClass')
def test_a(self):
'''这是普通的测试用例'''
print('a')
def test_fail_case(self):
'''这是失败的测试用例'''
print('这个是失败的测试用例')
res = calc(9,8)
self.assertEqual(98,res)
def test_haha(self):
'''这是哈哈'''
self.assertEqual(1,2) if __name__ == '__main__':
unittest.main()#它会帮你运行当前这个python里面所有的测试用例
由此可以看到,执行顺序是:静态方法 setUpClass() -> setUp -> test case -> SetDown ->... -> SetUp -> testcase -> testDown -> 静态方法 setDownClass()。
所以可以用setUpClass、tearDownClass做所有用例的前置初始化和结束。
unittest.main() #它会帮你运行当前这个python里面所有的测试用例
二、 应用 HTMLTestRunner 生成测试报告
if __name__ == '__main__':
suite = unittest.TestSuite()#定义一个测试套件
suite.addTest(TestCalc('test_pass_case'))#测试套件中添加测试用例
suite.addTest(TestCalc('test_a'))
f = open('report.html','wb')#打开一个保存结果的html文件
runner = HTMLTestRunner.HTMLTestRunner(stream=f,title='测试报告',description='测试情况')#生成执行用例的对象
runner.run(suite)#运行
可以将某几个test case加入test suite ,这样生成的测试报告里只有这两个test case 的结果。
具体如下:

可以将类里所有的test case加入test suite,如下
suite.addTests(unittest.makeSuite(TestCalc))#把类里面所有的测试用例加入测试套件
得到的测试报告结果为:

三、针对整个项目的test case,生成测试报告
例如有以下的结构:

test_buy 里关于购买的cases, test_login是关于login 的cases, test_reg是关于注册的cases, run_all_cases执行所有的cases
注意,在test_buy, test_login,test_reg里的case 需要以test 开头,这样才会被执行到,还有这三个文件不一定以test开头,这里只是为了方便才这么写的,但是必须得有相同的规则,比如这里的文件名都以test_ 开头。
run_all_cases.py代码如下所示:
import unittest,HTMLTestRunner
suite = unittest.TestSuite()
all_cases = unittest.defaultTestLoader.discover('.','test_*.py')#第一个参数:从哪个目录,第二个参数:定义规则
# for case in all_cases:
# suite.addTests(case)
[suite.addTests(case) for case in all_cases]#列表生成式,和上面的注释写法一样
f = open('new_report.html','wb')#打开一个保存结果的html文件
runner = HTMLTestRunner.HTMLTestRunner(stream=f,title='测试报告',description='测试情况')#生成执行用例的对象
runner.run(suite)#运行

四、集成jenkins,生成jenkins能识别的测试报告
这里就要用到 xmlrunner 模块,jenkins能识别xml格式。
runner = xmlrunner.XMLTestRunner('.')#当前目录
以上就是对Unittest的简单总结,后续会持续更新。
python + unittest 做单元测试之学习笔记的更多相关文章
- postman 做接口测试之学习笔记
Postman 之前是作为Chrome 的一个插件,现在要下载应用才能使用. 以下是postman 的界面: 各个功能区的使用如下: 快捷区: 快捷区提供常用的操作入口,包括运行收藏夹的一组测试数据, ...
- Python 日期时间处理模块学习笔记
来自:标点符的<Python 日期时间处理模块学习笔记> Python的时间处理模块在日常的使用中用的不是非常的多,但是使用的时候基本上都是要查资料,还是有些麻烦的,梳理下,便于以后方便的 ...
- 《Think Python》第16章学习笔记
目录 <Think Python>第16章学习笔记 16.1 Time 16.2 纯函数(Pure functions) 16.3 修改器(Modifiers) 16.4 原型 vs. 方 ...
- 《Think Python》第17章学习笔记
目录 <Think Python>第17章学习笔记 17.1 面向对象的特性(Object-oriented features) 17.2 打印对象(Printing objects) 1 ...
- 《Think Python》第15章学习笔记
目录 <Think Python>第15章学习笔记 15.1 程序员定义的类型(Programmer-defined types) 15.2 属性(Attributes) 15.3 矩形( ...
- Python 图片转字符画 学习笔记
Python 图片转字符画 学习笔记 标签(空格分隔): Python 声明:此文章和所有代码是学习笔记,非原创,原文教程地址:https://www.shiyanlou.com/courses/37 ...
- python cookbook第三版学习笔记十:类和对象(一)
类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair: def __init__(self,x,y): self.x=x self. ...
- python 面向对象(类)--学习笔记
面向对象是一种编程方式, 主要集中在类和对象的两个概念 python 中的类符合封装, 继承, 多态的特征 类 是一个模板, 是n多函数的集成 对象 是类的实例化 类的成员分为三大类:字段.方法.属性 ...
- python的运维交流学习笔记
#!/usr/bin/env | #!/usr/bin/python#coding:gbk #python 运维练习 #需求: #1.利用python实现自动监控服务器性能 #2.并将监控到的数据进行 ...
随机推荐
- elastic-job(lite)使用的一些注意事项
前段时间项目开发中用到了当当开源的elastic-job,使用过程遇到一些问题,虽然不见得会影响写代码,但作为一个致力于搬好每一块砖的码农,当碰到问题时,我们不应该逃避,应该本着有困难也要上,没有困难 ...
- ios 开发之本地推送
网络推送可能被人最为重视,但是本地推送有时候项目中也会运用到: 闲话少叙,代码如下: 1.添加根视图 self.window.rootViewController = [[UINavigationCo ...
- java中Date的使用情况
在开发中常使用情况. 1.将String转为date 例如"201604131630" //设置日期格式 public SimpleDateFormat sdf = new Si ...
- Duilib教程-HelloDuilib及DuiDesigner的简单使用
一.HelloDuilib 1. 首先理解DUILIB显示的一个基本流程,如下图: 在Duilib中,WindowImplBase 这个类代表了图中 “CWndClass”. 所以我们需要做的是: 1 ...
- Python 入门(七)函数
什么是函数 我们知道圆的面积计算公式为: S = πr² 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = ...
- js二级联动
<body> <section> <a>省份</a> <select id="province"> <option ...
- java基础---->java输入输出流
今天我们总结一下java中关于输入流和输出流的知识,博客的代码选自Thinking in java一书.我突然很想忘了你,就像从未遇见你. java中的输入流 huhx.txt文件的内容如下: I l ...
- vux报错二
执行npm run build后 "build": "node build/build.js", // 输出提示信息 - 提示用户请在 http 服务下查看 ...
- my sql 两个 索引 时的 union 与 or 的比较
背景:用一个表中的父子级关系进行查询 优化的过程中 发现可以使用 or 来代替 union all union all 需要查询两次 表 而 使用 or只需要 查询 一次 并且 两个字段都建立了索引 ...
- fluentValidation集成到autofac
废话不说直接上代码 // 首先实现ValidatorFactory public class DependencyResolverValidatorFactory : ValidatorFactory ...