随着软件功能的不断增加,对应的测试用例也会呈指数级增长。一个实现几十个功能的项目,对应的单

元测试用例可能达到上百个。如果把所有的测试用例都写在一个 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中更多的测试用例的更多相关文章

  1. unittest中忽略某些测试用例的执行

    添加装饰器(@unittest.skip("")) from init import * import unittest class baidu(Info): @unittest. ...

  2. unittest中更高效的执行测试用例一个类只需要打开一次浏览器

    示例代码 baidu.py # _*_ coding:utf-8 _*_ import csv,unittest #导入csv模块 from time import sleep from seleni ...

  3. Python 中 unittest 框架加载测试用例的常用方法

    unittest 当中为我们提供了许多加载用例的方法,这里说下常用的两种方法...推荐使用第二种 第一种加载测试用例的方法:使用加载器加载两个模块 需要把所有的模块加载到套件中 那么就可以自动的运行所 ...

  4. python利用unittest测试框架组织测试用例的5种方法

    利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...

  5. Dev环境中的集成测试用例执行时上下文环境检查(实战)

    Dev环境中的集成测试用例执行时上下文环境检查(实战) Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术 ...

  6. unittest中的方法调用时报错ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest

    调用unittest中的方法时报错: ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest ...

  7. 网格搜索与K近邻中更多的超参数

    目录 网格搜索与K近邻中更多的超参数 一.knn网格搜索超参寻优 二.更多距离的定义 1.向量空间余弦相似度 2.调整余弦相似度 3.皮尔森相关系数 4.杰卡德相似系数 网格搜索与K近邻中更多的超参数 ...

  8. unittest中的TestLoader使用

    一:unittest中的TestLoader使用说明 第一步:unittest增加TestSuit() suite=unittest.TestSuite() 第二步:unittest增加Testloa ...

  9. unittest 中的方法调用时报错 ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest

    1.调用unittest中的方法时报错: ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTe ...

随机推荐

  1. 初探 opencv-python

    一.openCV介绍 Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持.OpenCV是一个基于 ...

  2. python---redis的python使用

    set以及相关: r.set("foo","bar") print(r.get("foo"))#b'bar' #在Redis中设置值,默认, ...

  3. Spark记录-SparkSql官方文档中文翻译(部分转载)

    1 概述(Overview) Spark SQL是Spark的一个组件,用于结构化数据的计算.Spark SQL提供了一个称为DataFrames的编程抽象,DataFrames可以充当分布式SQL查 ...

  4. Centos6.8-hadoop-2.7.2 64 bit源码编译(伪分布-5大守护进程在本机上)

    1.安装插件 安装jdk/ant/libtool/protobuf/maven/zlib-devel/openssl-devel/ncurses-devel.gcc.snappy.bzip #set ...

  5. HashMap内存泄漏

    看Java核心技术1的时候看到HashMap的对象,书中讲到: 1.如果有一个值,对应的键不再使用他了,但由于key与value之间存在强引用,是不会被垃圾回收的 2.垃圾回收器跟踪活动的对象,只要映 ...

  6. 转--python -- 收发邮件

    官方 import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smt ...

  7. java程序在windows后台执行的办法

    1.新建run.txt文件 2.在文件中输入一下内容: @echo off start javaw -jar xx.jar exit 3.保存,修改文件名为run.bat4.双击即可 5.删除wind ...

  8. Ubuntu18.04下vim的tab缩进设置为4个空格

    在/etc/vim/vimrc最后添加如下内容 set ts = 4 set exbandtab set autoindent

  9. OracleHelper与SqlServerHelper

    1.OracleHelper using System; using System.Data; using System.Configuration; using System.Linq; using ...

  10. luogu P1053 篝火晚会

    传送门 首先如果题目的目标状态不是一个环就不合法 然后先把这个环搞出来,然后每个位置上的数对这个数对应的位置连边,可以发现有若干个环,而只要对这些环执行操作就好了,答案上界显然是\(n\).然后,如果 ...