python 杂记-unittest
介绍单元测试的好文:https://mp.weixin.qq.com/s/njxc8GXSlc3z_RibK70ROg
- setUpModule/tearDownModule:在整个模块的开始和结束时被执行。
- setUpClass/tearDownClass: 在测试类的开始和结束时被执行。
- setUp/tearDown:在测试用例的开始与结束时被执行
注意:setUpClass/tearDownClass的写法稍有不同,首先通过@classmethod进行装饰,其次方法的参数为cls,也可以是别的。每一个上面都要进行装饰
- import unittest
- class MyTest(unittest.TestCase): # 继承unittest.TestCase
- def tearDown(self):
- # 每个测试用例执行之后做操作
- print('')
- def setUp(self):
- # 每个测试用例执行之前做操作
- print('')
- @classmethod
- def tearDownClass(self):
- # 必须使用 @ classmethod装饰器, 所有test运行完后运行一次
- print('')
- @classmethod
- def setUpClass(self):
- # 必须使用@classmethod 装饰器,所有test运行前运行一次
- print('')
- def test_a_run(self):
- self.assertEqual(, ) # 测试用例
- def test_b_run(self):
- self.assertEqual(, ) # 测试用例
- if __name__ == '__main__':
- unittest.main()#运行所有的测试用例
unittest框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以TestAdd会优于TestBdd类被执行,test_aaa()方法会优于test_ccc被执行,因而它并没有按照用例从上到下的顺序执行
如果要测试的函数里包含的函数会连接数据库,或者发起http请求。你不想出发真实的操作,或者你纯粹就是不行调用这个函数。那这时候就用到mock模块了。
==========常用的断言
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(obj,cls,msg=None)
assertNotIsInstance(obj,cls,msg=None)
可能有人会好奇,为什么不使用内置断言语句 assert
,而要额外提供这么多断言方法并使用呢?原因是通过使用 unittest
提供的断言方法,测试框架在运行结束后,能够聚合所有的测试结果并产生信息丰富的测试报告。而直接使用 assert
虽然也可以达到验证被测对象是否符合预期的目的,但在用例出错时,报错信息不够丰富
- unittest 支持用例自动(递归)发现:
- 默认发现当前目录下所有符合 test*.py 测试用例
- 使用 python -m unittest 或 python -m unittest discover
- 通过 -s 参数指定要自动发现的目录, -p 参数指定用例文件的名称模式
- python -m unittest discover -s project_directory -p "test_*.py"
- 通过位置参数指定自动发现的目录和用例文件的名称模式
- python -m unittest discover project_directory "test_*.py"
- unittest 支持执行指定用例:
- 指定测试模块
- python -m unittest test_module1 test_module2
- 指定测试类
- python -m unittest test_module.TestClass
- 指定测试方法
- python -m unittest test_module.TestClass.test_method
- 指定测试文件路径(仅 Python )
- python -m unittest tests/test_something.py
如果我们希望每个测试方法之前前后分别执行测试前置和清理方法,那么需要在测试类中定义好 setUp()[11] 和 tearDown()[12]
如果我们希望单个测试类中只执行一次前置方法,再执行该测试类中的所有测试,最后执行一次清理方法,那么需要在测试类中定义好 setUpClass()[13] 和 tearDownClass()[14]
如果我们希望单个测试模块中只执行一次前置方法,再执行该模块中所有测试类的所有测试,最后执行一次清理方法,那么需要在测试模块中定义好 setUpModule()[15] 和 tearDownModule()[16]
==============
安装 HTMLTestRunner,使用执行测试用例就会生成一个html的测试报告,里面会有每个测试用例的执行结果
- import HtmlTestRunner
- import unittest
- class MyTest(unittest.TestCase):#继承unittest.TestCase
- def tearDown(self):
- #每个测试用例执行之后做操作
- print('')
- def setUp(self):
- #每个测试用例执行之前做操作
- print()
- def test_run(self):
- # self.assertEqual(,)
- self.assertIs(,)
- #测试用例
- def test_run2(self):
- # self.assertEqual(,)
- self.assertIs(,)
- #测试用例
- def test_run3(self):
- # self.assertEqual(,)
- self.assertIs(,)
- #测试用例
- def test_run1(self):
- # self.assertEqual(,)
- self.assertIs(,)
- #测试用例
- if __name__ == '__main__':
- test_suite = unittest.TestSuite()#创建一个测试集合
- test_suite.addTest(MyTest('test_run1'))#测试套件中添加测试用例
- #test_suite.addTest(unittest.makeSuite(MyTest))#使用makeSuite方法添加所有的测试方法
- fp = open('res.html','wb')#打开一个保存结果的html文件
- runner =HtmlTestRunner.HTMLTestRunner()#生成执行用例的对象
runner.run(test_suite) #执行测试套件
==============找到当前目录下所有测试用例
- import unittest
import HtmlTestRunner
if __name__ == '__main__':
suite = unittest.TestSuite()#创建测试套件
all_cases = unittest.defaultTestLoader.discover('.','test_*.py')
#找到某个目录下所有的以test开头的Python文件里面的测试用例
for case in all_cases:
suite.addTests(case)#把所有的测试用例添加进来
myrunner = HtmlTestRunner.HTMLTestRunner()
myrunner.run(suite)
print 'over'
discover()方法中的start_dir只能加载当前目录下的.py文件,如果加载子目录下的.py文件,需在每个子目录下放一个_init_.py文件。
- discover(start_dir,pattern='test*.py',top_level_dir=None)
- start_dir:要测试的模块名或测试用例的目录
- pattern='test.py':表示用例文件名的匹配原则,此处文件名以“test”开头的“.py”类型的文件,“”表示任意多个字符。
- top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None.
===================
python 杂记-unittest的更多相关文章
- python单元测试unittest
单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情.虽然会很快熟悉内容,但是修改和 调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而 ...
- Python中unittest采用不同的参数组合产生独立的test case
我们在使用Python的unittest做自动化或者单元测试时,有时需要一个测试用例根据不同的输入.输出组合而执行多次,但是,unittest中一个用例只能有一组参数组合执行,如果采用循环的方式,在生 ...
- 老李分享:开发python的unittest结果输出样式
老李分享:开发python的unittest结果输出样式 Python的unittest结果命令行输出,格式比较乱.为了提高格式输出的可读性,实现可以不同的颜色标识.所以准备扩展Python的un ...
- [转]python单元测试unittest
单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情.虽然会很快熟悉内容,但是修改和调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而单 ...
- python:unittest之跳过测试和预期失败的用例
在利用单元测试框架执行测试用例的过程中,有时只需要执行一部分用例,或者跳过某些暂不需要执行的用例,python的unittest框架就内置这样的功能. 前面的博客介绍了unittest框架的测试用例加 ...
- 常见的python的unittest用法
python的unittest好处是通过python脚本编写用例,每个用例可以单独调试初始化和清理动作,因为都是用例都是代码所以调试起来也很方便:它的缺点是得先学会python,难易程度见仁见智吧,对 ...
- Python之unittest测试代码
前言 编写函数或者类时,还可以为其编写测试.通过测试,可确定代码面对各种输入都能够按要求的那样工作. 本次我将介绍如何使用Python模块unittest中的工具来测试代码. 测试函数 首先我们先编写 ...
- Python单元测试unittest - 单元测试框架
一.unittest简介 unitest单元测试框架最初是有JUnit的启发,它支持测试自动化,共享测试的设置和关闭代码,将测试聚合到集合中,以及测试与报告框架的独立性. 二.unittest相关概念 ...
- Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构
1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...
随机推荐
- Image Perimeters
Description 给出一张由"x"和"."组成的矩阵.每个"x"可以向上下左右及两个斜对角进行连通,请问由某个点开始的"x& ...
- CSS float属性
表示向左浮动,比如多个div在一个页面上,默认情况是:一行一个div,但是只要在div的css中使用float:left,可以使一行有多个div,这样可以把网页划分成很多块,但是使用该属性会影响后面的 ...
- Node.js安装windows环境
一.安装环境 1.本机系统:Windows 10 Pro(64位)2.Node.js:v6.9.2LTS(64位) 二.安装Node.js步骤 1.下载对应你系统的Node.js版本:https:// ...
- Tp5.1 管理后台开发纪要
1. tp5.1 对网页是有缓存机制的 E:\phpStudy\PHPTutorial\WWW\NewAdmin\thinkphp\library\think\Template.php 下displa ...
- QT加载自带字体
#include <QCoreApplication> #include <QStringList> #include <QFontDatabase> #inclu ...
- Mybatis整合(Redis、Ehcache)实现二级缓存
目的: Mybatis整合Ehcache实现二级缓存 Mybatis整合Redis实现二级缓存 Mybatis整合ehcache实现二级缓存 ssm中整合ehcache 在POM中导入相关依赖 < ...
- 论坛中的问题:47(等待类型为MSSEARCH的进程被KILL之后,一直处于回滚状态)
原文:论坛中的问题:47(等待类型为MSSEARCH的进程被KILL之后,一直处于回滚状态) 求助:等待类型为MSSEARCH的进程被KILL之后,一直处于回滚状态 http://bbs.csdn.n ...
- 在论坛中出现的比较难的sql问题:12(递归问题2 拆分字符串)
原文:在论坛中出现的比较难的sql问题:12(递归问题2 拆分字符串) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- mybatis获取刚刚插入到数据库的数据的id(转载)
原文地址:https://blog.csdn.net/hehuihh/article/details/82800739 我用的是第一种写法,直接把代码copy到insert标签里(id要是自增id) ...
- centos安装rocketMQ
1.下载安装包 http://rocketmq.apache.org/release_notes/ 这里选择 4.4.0 版本,点击进去 可以选择源码包或者二进制文件,这里选择二进制文件(ps:如果选 ...