支持非致命错误的Python测试框架
我正在评估用于自动化系统测试的“测试框架”;目前我在寻找一个Python框架。在py.test或nose中,我没有看到像谷歌测试框架中的EXPECT宏那样的东西。我希望在一个测试中进行多个断言,而不是在第一次失败时就终止测试。我是不是在这些框架中漏掉了什么,还是说这根本就不行?有没有人能推荐一些适合自动化系统测试的Python测试框架?
5 个回答
奇怪的是,听起来你在寻找类似于我的claft
(命令行和过滤器测试工具)的东西。虽然类似,但功能要成熟得多。
claft
目前只是我写的一个小玩意儿,目的是帮助学生完成编程练习。它的想法是通过简单的配置文件来提供练习,这些文件用人类能理解的方式描述程序的需求(而不是用代码的方式),同时也适合自动化测试。
claft
会运行所有定义的测试,为每个测试提供参数和输入,检查返回代码,并将输出(stdout
)和错误信息(stderr
)与正则表达式模式进行匹配。它会把所有失败的测试收集成一个列表,并在每组测试结束时打印出这个列表。
不过,它目前还不能处理任意的输入/输出对话。到现在为止,它只是输入数据,然后读取所有的数据和错误信息。它也没有实现超时功能,实际上也没有捕捉到执行失败的尝试。(我确实说过这只是一个玩具,对吧?)我还没有实现对设置、拆卸和外部检查脚本的支持(不过我有计划去做)。
Bryan提到的“机器人框架”可能更适合你的需求;不过我快速浏览了一下,发现它比我想要的要复杂得多。(我需要保持简单,这样新接触编程的学生才能专注于他们的练习,而不是花很多时间去设置测试环境)。
你可以查看claft
并使用它,或者从中衍生出你自己的解决方案(它是BSD许可证的)。当然,你也可以贡献你的改进。(它在[bitbucket]:(http://www.bitbucket.org/)上,所以你可以使用Mercurial来克隆,并创建你自己的仓库……如果你想让我看看合并你的更改到我的仓库中,可以提交一个“拉取请求”)。
不过,也许我误解了你的问题。
你问了有什么建议,我就推荐你试试 robot framework。
我想要一些类似的东西,用于我正在用nose进行的功能测试。最后我想出了这个:
def raw_print(str, *args):
out_str = str % args
sys.stdout.write(out_str)
class DeferredAsserter(object):
def __init__(self):
self.broken = False
def assert_equal(self, expected, actual):
outstr = '%s == %s...' % (expected, actual)
raw_print(outstr)
try:
assert expected == actual
except AssertionError:
raw_print('FAILED\n\n')
self.broken = True
except Exception, e:
raw_print('ERROR\n')
traceback.print_exc()
self.broken = True
else:
raw_print('PASSED\n\n')
def invoke(self):
assert not self.broken
换句话说,它会打印出一些字符串,告诉你测试是通过了还是失败了。在测试结束时,你会调用一个方法,这个方法实际上会进行真正的验证。虽然这样做并不是最理想的,但我还没见过哪个Python测试框架能处理这种测试。而且我也还没弄明白怎么写一个nose插件来实现这种功能。:-/