支持非致命故障的Python测试框架
我正在评估自动化系统测试的“测试框架”;到目前为止,我正在寻找一个python框架。 在py.test或nose中,我看不到类似于我从google测试框架中知道的EXPECT宏的东西。 我希望在一个测试中做出几个断言,同时不要在第一次失败时中止测试。 我是否在这些框架中遗漏了一些东西,或者这不起作用?支持非致命故障的Python测试框架,python,testing,assert,nose,Python,Testing,Assert,Nose,我正在评估自动化系统测试的“测试框架”;到目前为止,我正在寻找一个python框架。 在py.test或nose中,我看不到类似于我从google测试框架中知道的EXPECT宏的东西。 我希望在一个测试中做出几个断言,同时不要在第一次失败时中止测试。 我是否在这些框架中遗漏了一些东西,或者这不起作用? 有人对可用于自动系统测试的python测试框架有什么建议吗?如果您在命令行中通过-x选项,nose只会在第一次失败时中止 test.py: def test1(): assert Fals
有人对可用于自动系统测试的python测试框架有什么建议吗?如果您在命令行中通过
-x
选项,nose只会在第一次失败时中止
test.py:
def test1():
assert False
def test2():
assert False
没有-x选项:
C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py
FF
======================================================================
FAIL: test.test1
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
self.test(*self.arg)
File "C:\temp\py\test.py", line 2, in test1
assert False
AssertionError
======================================================================
FAIL: test.test2
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
self.test(*self.arg)
File "C:\temp\py\test.py", line 5, in test2
assert False
AssertionError
----------------------------------------------------------------------
Ran 2 tests in 0.031s
FAILED (failures=2)
C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py -x
F
======================================================================
FAIL: test.test1
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
self.test(*self.arg)
File "C:\temp\py\test.py", line 2, in test1
assert False
AssertionError
----------------------------------------------------------------------
Ran 1 test in 0.047s
FAILED (failures=1)
C:\temp\py>C:\Python26\Scripts\nostests.exe test.py
FF
======================================================================
失败:test.test1
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“C:\Python26\lib\site packages\nose-0.11.1-py2.6.egg\nose\case.py”,第行
183,运行测试中
自检(*self.arg)
test1中第2行的文件“C:\temp\py\test.py”
断言错误
断言错误
======================================================================
失败:test.test2
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“C:\Python26\lib\site packages\nose-0.11.1-py2.6.egg\nose\case.py”,第行
183,运行测试中
自检(*self.arg)
test2中第5行的文件“C:\temp\py\test.py”
断言错误
断言错误
----------------------------------------------------------------------
在0.031s内运行了2次测试
失败(失败=2)
使用-x选项:
C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py
FF
======================================================================
FAIL: test.test1
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
self.test(*self.arg)
File "C:\temp\py\test.py", line 2, in test1
assert False
AssertionError
======================================================================
FAIL: test.test2
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
self.test(*self.arg)
File "C:\temp\py\test.py", line 5, in test2
assert False
AssertionError
----------------------------------------------------------------------
Ran 2 tests in 0.031s
FAILED (failures=2)
C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py -x
F
======================================================================
FAIL: test.test1
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
self.test(*self.arg)
File "C:\temp\py\test.py", line 2, in test1
assert False
AssertionError
----------------------------------------------------------------------
Ran 1 test in 0.047s
FAILED (failures=1)
C:\temp\py>C:\Python26\Scripts\nostests.exe test.py-x
F
======================================================================
失败:test.test1
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“C:\Python26\lib\site packages\nose-0.11.1-py2.6.egg\nose\case.py”,第行
183,运行测试中
自检(*self.arg)
test1中第2行的文件“C:\temp\py\test.py”
断言错误
断言错误
----------------------------------------------------------------------
在0.047秒内运行了1次测试
失败(失败=1)
<>你可能想考虑复习.我想用类似的函数来测试我用鼻子做的测试。我终于想到了这个:
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
换句话说,它打印出字符串,指示测试是通过还是失败。在测试结束时,调用invoke方法,该方法实际执行实际的断言。这肯定不是最好的,但我还没有看到一个Python测试框架可以处理这种测试。我也没有想到如何编写一个nose插件来完成这类工作-/ 你征求了我的建议,所以我会提出建议 奇怪的是,听起来您正在寻找类似my(命令行和过滤器测试仪)的东西。有点像,但要成熟得多 到目前为止,
claft
只是我为帮助学生进行编程练习而编写的一个玩具。其思想是为练习提供简单的配置文件,这些文件代表程序的需求,具有合理的可读性(声明性而非编程性),同时也适用于自动化测试
claft
运行所有定义的测试,为每个测试提供参数和输入,检查返回代码,并根据正则表达式模式匹配输出(stdout
)和错误消息(stderr
)。它收集列表中的所有故障,并在每个套件的末尾打印整个列表
它还不能对输入/输出序列进行任意对话。到目前为止,它只是输入数据,然后读取所有数据/错误。它也不实现超时,事实上,甚至不捕获失败的执行尝试。(到目前为止,我确实说过这只是一个玩具,不是吗?)。我还没有实现对安装、拆卸和外部检查脚本的支持(尽管我计划这样做)
布莱恩关于“机器人框架”的建议可能更符合你的需要;尽管快速浏览一下它表明它比我想要的要复杂得多。(我需要让事情变得足够简单,让刚接触编程的学生能够专注于他们的练习,而不是花很多时间在设置测试工具上)
欢迎您查看claft
并使用它或从中派生出您自己的解决方案(它是BSD许可的)。很明显,欢迎你回馈。(它位于[bitbucket]:()上,因此您可以使用Mercurial进行克隆,并提供您自己的响应…如果您希望我考虑将您的更改合并回我的repo,请提交“拉请求”)
那么,也许我又误解了你的问题。为什么不(在unittest
中,但这在任何框架下都应该有效):
假设实现了MyTestCase,以便将函数包装到
testlist = []
x.testMulti(testlist.append)
assert all(testlist)
问题是关于一个测试中的多个断言,有些可能会失败,而不是关于多个测试。看到了你对我答案的评论。我不明白你到底想做什么-我回答说“我想在一个测试中做几个断言,而不是在第一次失败时中止测试。”我只是给出了一个框架方法,显然你可以在一个列表中捕获所有异常信息,如果你想在异常处理程序中捕获的话。我更新了我的答案。你的答案到哪里去了?你删除了吗?还有对它的评论(如果我没记错的话,来自多个用户),好主意。既然我们决定使用nose,插件就太好了。由于某些原因,我不能使用关键字驱动的测试框架。但对于未来的项目,我会记住这一点。谢谢