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 ...
随机推荐
- 设计模式---对象创建模式之工厂方法模式(Factory Method)
前提:“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式(表现最为突出) 工 ...
- 怎样动态地插入不会暴露给用户的JS文件
也是无意间看见的,以前想过这个问题,但是没多想,今天看到这段代码豁然开朗 (function() { var dynamicScript = document.createElement('scrip ...
- 动态规划之Fib数列类问题应用
一,问题描述 有个小孩上楼梯,共有N阶楼梯,小孩一次可以上1阶,2阶或者3阶.走到N阶楼梯,一共有多少种走法? 二,问题分析 DP之自顶向下分析方式: 爬到第N阶楼梯,一共只有三种情况(全划分,加法原 ...
- 简易selenium自动化测试框架(Python)
最近空闲时间在探索Selenium的自动化测试,简单的写了一个小框架来测试公司的一个web产品.该框架包括以下模块: 1. Test case编写模式(page模式,参考之前的博文http://www ...
- u-boot移植(二)---修改前工作:代码流程分析1
一.代码执行总体流程图 1.1 代码路径 U-boot.lds (arch\arm\cpu) vectors.S (arch\arm\lib) start.S (arch\arm\cpu\arm920 ...
- C# 使用ffmpeg视频截图
<appSettings> <add key="ffmpeg" value="E:\ffmpeg\ffmpeg-20141012-git-20df026 ...
- Python写黑客小工具,360免杀
构思: client:反向连接server,执行shell命令 server:发送命令,控制客户端 import subprocess import socket import threading t ...
- 如何将SVN仓库转换为Git仓库
按如下步骤操作就可以将SVN仓库完整的转换为Git仓库: 1) 将远程SVN仓库搬到本地(这一步主要是为了提高转换的速度,也可以忽略) 参考这篇文章: http://rongjih.blog. ...
- 自助Linux之问题诊断工具strace【转】
转自:http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...
- Shell脚本中执行sql语句操作mysql的5种方法【转】
对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...