快速、并行、功能丰富的Python单元测试框架
项目描述
GoodTests是一个快速兼容Python 2/3的单元测试框架,我编写此框架是为了克服其他现有框架(如pytest和py单元测试)的不足。它可以作为直接替换,无需修改任何现有测试用例(或仅需非常少的修改)。
它支持并行执行、正则表达式过滤,并提供类级别封装,以确保损坏的Python环境(例如模拟数据库函数调用等)不会传播到其他测试。这是我发现pytest的一个问题。如果测试失败,则不会调用teardown,因此捕获清理是不可能的。它支持整个类和每个方法的setup/teardown。
每个类都作为一个单独的进程运行,这可以在数据生成和早期故障预测上节省大量时间。
一些功能
它使用“assert”关键字,而不是其他具有晦涩方法(如self.assertEquals)的框架
彩色输出
因为使用了“assert”关键字,失败会关联相应的消息。例如:assert len(items) == 2, '期望2个项目,得到了%d' %(len(items),)
它支持只运行匹配给定正则表达式的类方法。
它支持发现目录中的所有测试。
是现有 py.test/unit 测试的替代品。
测试扩展了“对象”。测试本身实际上没有导入 GoodTests 的任何部分。
许可证是 LGPL。
支持 Python 2 和 Python 3。
并行运行测试。
每个测试类(每个文件应该有一个)都在同一进程中运行。这允许您通过不对每个函数设置和拆除相似数据来获得更多性能,并允许共享状态和知识(例如,如果测试构造函数在一个类上失败,您知道其他所有测试都将失败,因此您可以在函数开始时标记一个标志“self.xWillFail”并进行断言。)还有其他优点
支持 pdb 模式(通过 –pdb 启用)。请参阅下面的“交互式调试”部分。
GoodTests 支持给定目录自动发现测试,通过查找匹配模式的文件和类(与 py.test 兼容)
每个文件都应该采用 test_$$CLASSNAME$$ 的形式.py(其中 $$CLASSNAME$$ 是名称,例如“Magic”)。文件中的类应该以“Test”开头或结尾(例如:“TestMagic”或“MagicTest”)。
支持旧的单元测试风格(对每个方法调用 teardown_method 和 setup_method,对每个类调用 setup_class 和 teardown_class),也支持更现代的形式,setup/teardown_[CLASSNAME] 和 setup/teardown_[METHOD]。
设置和拆除函数会运行,无论该方法本身是否成功(与某些其他单元测试框架相反)。
断言应使用 Python 中的“assert”关键字(例如:assert 1 != 2)。
请参阅“test_Magic.py”以获取示例。
用法
用法:GoodTests.py(选项)[文件名或目录]
选项
-n [数字] - 指定同时执行的数目
默认值 = 处理器数量(2)。
如果使用 pdb,则必须使用“-n 1”。
--pdb - 当断言失败时,在测试代码失败点进入 pdb 壳层(强制 –n1)
中
-m [正则表达式] - 运行匹配特定模式的函数
-q - 静音(仅打印失败)
这将还会在测试执行期间禁用 stdout
-t - 打印额外的计时信息
--no-colour - 从输出中移除颜色
--no-color
--version - 打印版本和版权信息
--help - 显示此信息
GoodTests 可以用 -n 使用来执行多个同时执行(每个测试类一个进程)
-m 将使用正则表达式模式来执行只匹配名称的函数
GoodTests.py 可以指向任何目录,并将加载所有以 test_ 开头的文件(例如:test_Something.py)
输出将包含颜色,并按发生的顺序列出所有失败(或通过),并在最后有一个汇总列表
交互式调试(pdb)
GoodTests.py 支持一个“交互式调试”模式,可以通过在命令行中传递“–pdb”作为参数来切换。
当处于“pdb模式”或“交互式调试模式”时,如果引发 AssertionError(失败的断言)或测试执行期间的其他未捕获的异常,则发生以下情况
在异常引发的帧中启动一个 pdb 壳层。因此,如果您有一个失败的断言,shell 将在代码中的该点停止,让您检查变量等,以帮助诊断失败的原因并纠正情况。
一旦输入“next” [n] 或“continue” [c],设置(如果有的话)将被再次运行,您将进入一个从测试函数顶部开始的 pdb 交互式 shell。这将允许您遍历代码,更改变量,调用函数,并打印值,以便在线理解和尝试纠正情况。如果在此次会话期间您纠正了问题,之前失败的断言现在通过了,它将标记为“PASS(调试器)”在结果中。原始 Traceback 将在测试结果底部的汇总中打印,指出它确实在重试时通过了,因为您的调试会话期间执行了操作。
您还可以选择在您的测试或代码中的某处直接放置“pdb.set_trace()”。为了使此操作正常工作,您必须确保 maxRunners == 1(即通过“-n1”作为参数)。
示例
示例测试 test_Magic.py
import os
DO_PRINT = int(os.environ.get('DO_PRINT', 0))
class TestMagic(object)
def setup_TestMagic(self)
if DO_PRINT
print("类构造函数")
def setup_one(self)
if DO_PRINT
print("--设置一个")
def test_one(self)
assert "one" != "magic"
assert "magic" == "magic"
def teardown_one(self)
if DO_PRINT
print("--拆除一个")
def test_WillFail(self)
assert 2 == 3, '期望两个等于三'
def test_popularity(self)
tim = 'abcsdfsd'
cool = 'abcsdfsd'
assert tim is cool
def teardown_WillFail(self)
if DO_PRINT
print("--拆除 WillFail")
结果
$ GoodTests.py test_Magic.py
test_Magic.py - TestMagic.test_WillFail 失败 *****断言错误*****
Traceback (最近调用)
文件“/home/media/work/github/GoodTests/test_Magic.py”,第25行,在 test_WillFail 中
assert 2 == 3
断言错误:期望两个等于三
test_Magic.py - TestMagic.test_one 通过
test_Magic.py - TestMagic.test_popularity 通过
==================================================
摘要
测试结果(3个中的2个通过)运行耗时 0.000650 秒。
失败的测试
test_Magic.py (1 个失败)
TestMagic (1 个失败)
test_WillFail -
Traceback (最近调用)
文件“/home/media/work/github/GoodTests/test_Magic.py”,第25行,在 test_WillFail 中
assert 2 == 3
断言错误:期望两个等于三
==================================================
摘要
测试结果(3个中的2个通过)运行耗时 0.006250 秒。
包含在项目中
我建议将提供的“distrib/runTests.py”与您的项目捆绑,以支持 GoodTests。
runTests.py 如果未安装,将下载最新的 GoodTests.py 到本地目录,并确保在运行测试时使用本地源副本,这省去了每次更改后运行“setup.py install”来运行测试的步骤。
项目详细信息
GoodTests-3.0.5.tar.gz 的散列
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1b5f59b4e735cfcab290bd33afc2d7585bd7e6553d4c5e17b6292d53b80560bc |
|
MD5 | 6e5125f412ebdd62db3886bbb735f4ac |
|
BLAKE2b-256 | 731c3c8c0ef13113a2d4ca451325a319e85b7ce0676d96e89de8d22543b28552 |