跳转到主要内容

快速、并行、功能丰富的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 (41.8 kB 查看散列)

上传时间

由以下机构支持