Python3学习笔记26-unittest模块
unittest单元测试框架,主要由四部分组成:测试固件、测试用例、测试套件、测试执行器
测试固件(test fixture)
测试固件有两部分,执行测试前的准备部分setUp(),测试执行完后的清扫部分tearDown()
测试用例(test case)
测试用例中,包含测试固件,具体的测试代码的函数。测试固件可以不写,但是至少要有一个以test开头的函数。
unittest会自动识别test开头的函数是测试代码,一定要用小写的test开头!,下面看一个实例
在PyCharm中新建一个项目,在下面建一个包叫做lesson_unittest,然后在这个包下面新建一个.py文件叫做lesson_test_fixture1,然后写下面的代码
import unittest
from io import StringIO
class lesson(unittest.TestCase): def setUp(self):
self.f = StringIO()
print("创建StringIO") def tearDown(self):
s = self.f.getvalue()
print("读取StringIO:",s) def test_case1(self):
self.f.write("test case 1")
print("写入test case 1") def test_case2(self):
self.f.write("test case 2")
print("写入test case 2") if __name__ =='__main__':
unittest.main()
所有方法中一定要带self这个变量
unittest.main()在PyCharm可以不要,如果要在cmd中运行,一定要加上这行
setUp()执行成功之后,不管test中有没有异常发生,tearDown()都会执行
可以看出上面这个实例在执行每个test之前和之后都会去调用setUp()和tearDown()这个方法
很多时候我们只想执行一次测试固件:比如setUp()中放着连接数据库操作,多个test case放着不同数据库操作,然后tearDown()断开数据连接
使用setUpClass()和tearDownClass()可以的得到这样的效果,必须被装饰成classmethod
使用装饰器@unittest.skip可以跳过某个测试用例不执行
在刚才lesson_unittest包下,再新建一个.py文件叫做lesson_test_fixture2,然后写下面的代码
import unittest
from io import StringIO
class lesson(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.f = StringIO()
print("创建StringIO") @classmethod
def tearDownClass(cls):
s = cls.f.getvalue()
print("读取StringIO:",s) def test_case1(self):
self.f.write("test case 1")
print("写入test case 1") def test_case2(self):
self.f.write("test case 2")
print("写入test case 2") if __name__ =='__main__':
unittest.main()
测试执行器(test runner)
test runner用来执行加载的测试用例,可以是单个测试用例,也可以是测试套件
一种就是上方实例中的直接使用unittest.main()去执行,会搜索所有以test开头的测试用例,按照ASCII的顺序执行多个用例
另一种就是使用TextTestRunner()方法初始化一个测试执行器,然后使用run()去执行测试套件
runner = unittest.TextTestRunner() runner.run(suite)
这里suite是指测试套件的实例
测试套件(test suite)
很多测试用例的集合就是测试套件,通过测试套件来管理多个测试用例,会根据用例的加载顺序执行用例
使用TestSuite()初始化一个Suite实例
使用addTest()方法加载测试方法到测试套件中,addTest()如果要在传入别的包下的测试方法: 包名.类名(测试方法函数)
suite = unittest.TestSuite()
suite.addTest(lesson('test_case1'))#lesson是类名,test_case1是测试函数
suite.addTest(lesson('test_case2'))#如果是lesson是其他包下的,就是包名.lesson(‘test_case2’)
runner = unittest.TextTestRunner()
runner.run(suite)
将文章第一个示例中最后一行unittest.main()换成上方代码执行
使用makeSuite()可以把一个类下面所有测试方法都加载到测试套件中
目前项目路径应该是这样的,最上面是项目,然后包,最后是.py文件。一定要有__init__.py文件,不然引用不到
在项目下新建一个.py文件,名字随便不要带test,或lesson就行。在项目下新建,不要在包里,不要在包里,不要在包里
import unittest
from lesson_unittest.lesson_test_fixture1 import lesson
suite = unittest.TestSuite(unittest.makeSuite(lesson))
if __name__=='__main__':
runner = unittest.TextTestRunner()
runner.run(suite)
可以看到把lesson两个测试用例都执行了,但是使用makeSuite()还是有些繁琐。要把写的所有的类都加到测试套件中
最常用的是使用discover()方法可以把指定路径下所有测试方法都加载到测试套件中
使用刚才实验makeSuite()方法的那个.py文件,清空代码输入以下代码
import unittest
test_dir = 'D:/PycharmProjects/PythonLesson/lesson_unittest'
discover = unittest.defaultTestLoader.discover(test_dir, pattern='lesson*.py')
runner = unittest.TextTestRunner()
runner.run(discover)
test_dir是指定的路径,pattern是指定的文件名。pattern参数是定义文件名匹配规则的,可以随便修改
比如这里lesson*.py是指文件名以lesson开头的文件
也可以写成*test*文件带有test的文件
如果是*lesson.py,那就是指文件名以lesson.py结尾的文件
*起到跟通配符差不多的作用
Python3学习笔记26-unittest模块的更多相关文章
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
- Python3学习笔记(urllib模块的使用)
转载地址:https://www.cnblogs.com/Lands-ljk/p/5447127.html 1.基本方法 urllib.request.urlopen(url, data=None, ...
- 【转】Python3学习笔记(urllib模块的使用)
原文地址:https://www.cnblogs.com/Lands-ljk/p/5447127.html 1.基本方法 urllib.request.urlopen(url, data=None, ...
- python3学习笔记(7)_listComprehensions-列表生成式
#python3 学习笔记17/07/11 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #通过列表生成式可以生成格式各样的list,这种list 一 ...
- python3学习笔记(6)_iteration
#python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #类似 其他语言的for循环,但是比for抽象程度更高 # f ...
- Python3学习笔记 - 准备环境
前言 最近乘着项目不忙想赶一波时髦学习一下Python3.由于正好学习了Docker,并深深迷上了Docker,所以必须趁热打铁的用它来创建我们的Python3的开发测试环境.Python3的中文教程 ...
- python3学习笔记(5)_slice
#python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #切片slice 大大简化 对于指定索引的操作 fruits ...
- python3学习笔记(4)_function-参数
#python学习笔记 17/07/10 # !/usr/bin/evn python3 # -*- coding:utf-8 -*- import math #函数 函数的 定义 #定义一个求绝对值 ...
- Python3学习笔记01-环境安装和运行环境
最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...
- python3学习笔记(9)_closure
#python 学习笔记 2017/07/13 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #从高阶函数的定义,我们可以知道,把函数作为参数的函数, ...
随机推荐
- BZOJ2150 部落战争 【带上下界最小流】
题目链接 BZOJ2150 题解 复习: 带上下界网络流两种写法: 不建\(T->S\)的\(INF\)的边,即不考虑源汇点,先求出此时超级源汇的最大流,即无源汇下最大的自我调整,再加入该边,求 ...
- Linux安装aMule下载eDonkey200网络共享文件
安装aMule 如果你的发行版本包管理器中包含amule和amule-daemon可以直接安装. 如果不包含需要在编译的Configure过程添加参数以包含amulecmd和amuled:./conf ...
- TRIE 字典树 前缀紧急集合!
TRIE: 在计算机科学中,Trie,又称前缀树或字典树,是一种有序树状的数据结构,用于保存关联数组,其中的键通常是字符串.——百度百科 自我理解: trie树,是一种处理字符串前缀的数据结构,通常会 ...
- ZOJ_3950_How Many Nines 解题报告及如何对程序进行测试修改
The 17th Zhejiang University Programming Contest Sponsored by TuSimple Solution: #include <stdio. ...
- zTree重命名节点时,操作的那个dom(类似input框那个)怎么写
<script type="text/javascript"> //tree的编辑节点的方法 ztree.editName(nodeNew[0]); /// $(&qu ...
- UML简单熟悉
+ :代表public - :代表private # :代表protected 实现,继承关系:implements,extends 关联关系:使一个类知道另一个类的属性和方法 每一个Driver类 ...
- 2156: 中南大学2018年ACM暑期集训前期训练题集(入门题) D: 机器人的指令
不要用gets!不要用gets!不要用gets! 不要用gets!不要用gets!不要用gets! 不要用gets!不要用gets!不要用gets! 不要用gets!不要用gets!不要用gets! ...
- 配置GitLab Push 自动触发Jenkins构建
配置GitLab Push 自动触发Jenkins构建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客是对之前的笔记:https://www.cnblogs.com/yin ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析)辅助变量 双链表操作 list.c
/* A custom doubly linked list implemenation */ # include <stdio.h> # include <stdlib.h> ...
- JAVA中初始化ArrayList的三种方式
下面讲一下ArrayList初始化的几种不同方式. 一.最常用的初始化方式. List<String> list1 = new ArrayList<String>(); lis ...