unittest中更多的测试用例
随着软件功能的不断增加,对应的测试用例也会呈指数级增长。一个实现几十个功能的项目,对应的单
元测试用例可能达到上百个。如果把所有的测试用例都写在一个 test.py 文件中,那么这个文件会越来越臃肿,后期维护起来也比较麻烦。需要将这些用例按照所测试的功能进行拆分,分散到不同的测试文件中。
目录结构如下:
testpro/
├── count.py
├── testadd.py
├── testsub.py
└── runtest.py
文件拆分后的实现代码如下。
calculator.py
# 计算器类
class Count():
def __init__(self, a, b):
self.a = int(a)
self.b = int(b)
# 计算加法
def add(self):
return self.a + self.b
# 计算减法
def sub(self):
return self.a - self.b
testadd.py
from calculator import Count import unittest
class TestAdd(unittest.TestCase):
def setUp(self):
print("test case start")
def tearDown(self):
print("test case end")
def test_add(self):
j = Count(2, 3)
self.assertEqual(j.add(), 5)
def test_add2(self):
j = Count(41, 76)
self.assertEqual(j.add(), 117)
if __name__ == '__main__':
unittest.main()
testsub.py
from calculator import Count import unittest
class TestSub(unittest.TestCase):
def setUp(self):
print("test case start")
def tearDown(self):
print("test case end")
def test_sub(self):
j = Count(2, 3)
self.assertEqual(j.sub(), -1)
def test_sub2(self):
j = Count(71, 46)
self.assertEqual(j.sub(), 25)
if __name__ == '__main__':
unittest.main()
runtest.py
import unittest
# 加载测试文件
import testadd import testsub
# 构造测试集
suite = unittest.TestSuite()
suite.addTest(testadd.TestAdd("test_add")) #需要执行的第一条用例
suite.addTest(testadd.TestAdd("test_add2"))#需要执行的第二条用例
suite.addTest(testsub.TestSub("test_sub")) #需要执行的第三条用例
suite.addTest(testsub.TestSub("test_sub2"))#需要执行的第四条用例
if __name__ == '__main__':
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
这样的拆分带来了好处,可以根据不同的功能创建不同的测试文件,甚至是不同的测试目录,测试文件
中还可以将不同的小功能划分为不同的测试类,在类下编写测试用例,整体结构更加清晰。
这样的设计看上去很完美,但依然没有解决添加用例的问题,当用例达到成百上千条时,在 runtest.py 文件中通过 addTest()添加/删除测试用例就变得非常麻烦,那么有没有方法让 unittest 单元测试框架自动识别测试用例呢?答案是肯定的,TestLoader 类中提供的 discover()方法可以解决这个问题。
TestLoader
该类负责根据各种标准加载测试用例,并将它们返回给测试套件。正常情况下,不需要创建这个类的实例。unittest 提供了可以共享的 defaultTestLoader 类,可以使用其子类和方法创建实例,discover()方法就是其中之一。
discover(start_dir,pattern='test*.py',top_level_dir=None) 找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名才能被加载。如果启动的不是顶层目录,那么顶层目录必须单独指定。
- start_dir :要测试的模块名或测试用例目录。
- pattern=‘test*.py’ :表示用例文件名的匹配原则。此处匹配文件名以“test”开头的“.py”类型的文件,星号“*”表示任意多个字符。
- top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为 None。
现在通过 discover()方法重新实现 runtest.py 文件的功能。
runtest.py
import unittest
# 定义测试用例的目录为当前目录
test_dir = './' #需要执行的文件路径
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')#执行所有以test开头的py文件
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(discover)
discover()方法会自动根据测试目录(test_dir)匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件中,因此,可以直接通过 run()方法执行 discover ,大大简化了测试用例的查找与执行。
注意:在使用discover时不再是依照代码从上到下执行,如多个文件同时执行是以文件名a - z,A-Z,0 - 9 先后顺序 ,测试用例也是也是这个先后顺序。
如有两个文件:
a.py 和 b.py # a.py先执行
a1.py 和 a.py # a.py先执行
ab.py 和 ac.py #ab.py先执行
#类中的测试用例也是按名字这种先后顺序
class a(): 和 class b(): #class a先执行
如我们先要执行某个文件可在文件名前面加a,后执行加z。
文件名第一个字母相同就开始比对第二个,第二个相同就比对第三个。。。。
unittest中更多的测试用例的更多相关文章
- unittest中忽略某些测试用例的执行
添加装饰器(@unittest.skip("")) from init import * import unittest class baidu(Info): @unittest. ...
- unittest中更高效的执行测试用例一个类只需要打开一次浏览器
示例代码 baidu.py # _*_ coding:utf-8 _*_ import csv,unittest #导入csv模块 from time import sleep from seleni ...
- Python 中 unittest 框架加载测试用例的常用方法
unittest 当中为我们提供了许多加载用例的方法,这里说下常用的两种方法...推荐使用第二种 第一种加载测试用例的方法:使用加载器加载两个模块 需要把所有的模块加载到套件中 那么就可以自动的运行所 ...
- python利用unittest测试框架组织测试用例的5种方法
利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...
- Dev环境中的集成测试用例执行时上下文环境检查(实战)
Dev环境中的集成测试用例执行时上下文环境检查(实战) Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术 ...
- unittest中的方法调用时报错ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest
调用unittest中的方法时报错: ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest ...
- 网格搜索与K近邻中更多的超参数
目录 网格搜索与K近邻中更多的超参数 一.knn网格搜索超参寻优 二.更多距离的定义 1.向量空间余弦相似度 2.调整余弦相似度 3.皮尔森相关系数 4.杰卡德相似系数 网格搜索与K近邻中更多的超参数 ...
- unittest中的TestLoader使用
一:unittest中的TestLoader使用说明 第一步:unittest增加TestSuit() suite=unittest.TestSuite() 第二步:unittest增加Testloa ...
- unittest 中的方法调用时报错 ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest
1.调用unittest中的方法时报错: ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTe ...
随机推荐
- 记录一个elasticsearch 的索引templates
搞了好长时间终于成了. { "order": 0, "version": 50001, "template": "click.*& ...
- 学习windows编程 day3 之 设置当前的背景颜色
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...
- MVC模块化开发方案
核心: 主要利用MVC的区域功能,实现项目模块独立开发和调试. 目标: 各个模块以独立MVC应用程序存在,即模块可独立开发和调试. 动态注册各个模块路由. 一:新建解决方案目录结构 如图: 二:Eas ...
- servlet 获取 post body 体用流读取为空的问题【转】
引用自: http://www.zicheng.net/article/982028.htm 目前基于rest风格的很多API开始使用通过body data来传输来代替之前的key-value传输方式 ...
- B树学习总结
1,B树的基本介绍 ①B树,相比于二叉树.红黑树而言,它的特点就是树的高度比其他类型的树要低很多.如何做到低呢?B树中的每个结点的分支数目非常大,即每个结点有很多很多孩子结点.这样,在相同结点数目情况 ...
- C# ffmpeg工具将视频转为SWF格式
1.下载ffmpeg工具 using System; using System.Collections; using System.Configuration; using System.Data; ...
- 2017CCPC秦皇岛 L题One-Dimensional Maze&&ZOJ3992【模拟】
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3992 题意: 走迷宫,一个一维字符串迷宫,由'L'.'R'组成,分别 ...
- <转载>Mac下,使用sshpass让iterm2支持多ssh登录信息保存
windows里有个Xshell非常的方便好使,因为它能保存你所有的ssh登录帐号信息.MAC下并没有xshell,有些也提供这样的功能,但效果都不好.iterm2是很好的终端,但却不能很好的支持多p ...
- http raw post 之理解
参考链接: https://imququ.com/post/four-ways-to-post-data-in-http.html http://blog.csdn.net/leyangjun/art ...
- Node.js的基本操作(使用Vue前必学)
安装 Windows下不需要讲,Mac下的安装步骤: https://www.cnblogs.com/bobi1234/category/1367458.html 全局安装淘宝镜像 npm insta ...