带有非致命错误支持的Python测试框架

5

我正在评估自动化系统测试的“测试框架”,目前我正在寻找一个Python框架。 在py.test或nose中,我看不到类似于我从谷歌测试框架中了解的EXPECT宏。 我想在一个测试中进行多个断言,而不会在第一个失败时终止测试。 这些框架中是否有我遗漏的东西或者这不起作用? 有没有人对可用于自动化系统测试的Python测试框架有建议?


看到了你对我的回答的评论。我不太明白你具体想做什么——我是在回应“我想在一个测试中进行多个断言,而不会在第一次失败时终止测试。” 我只是给出了一个框架式的方法,显然,如果你想在异常处理程序中捕获所有异常信息并将其存储在列表中,那也是可以的。我已经更新了我的回答。 - Vinay Sajip
你的回答去哪了?你删掉了吗?还有评论(如果我没记错的话)也被删除了吗? - housemaister
5个回答

2

我希望能够找到类似的东西来进行使用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

换句话说,它会打印出字符串,指示测试是否通过或失败。在测试结束时,您调用invoke方法,该方法实际上执行了真正的断言。这绝对不是首选方法,但我还没有看到可以处理此类测试的Python测试框架。也没有找到时间来弄清楚如何编写nose插件来执行此类操作。 :-/

好主意。既然我们决定使用nose,一个插件会很棒。 - housemaister

1

由于某些原因,我目前无法使用关键字驱动测试框架。但是对于未来的项目,我会记住这一点。谢谢。 - housemaister

1

奇怪的是,你似乎在寻找类似于我的claft(命令行和过滤器测试工具)的东西。它与之类似但更加成熟。

claft(到目前为止)只是我为帮助学生完成编程练习而编写的玩具。其想法是提供简单的配置文件来表示程序要求的术语,这些术语相对人类可读(而不是程序化),同时也适合自动化测试。

claft运行所有定义的测试,为每个测试提供参数和输入,检查返回代码,并将输出(stdout)和错误消息(stderr)与正则表达式模式匹配。它将所有失败项收集到列表中,并在每个测试套件结束时打印整个列表。

目前它还不能执行任意的输入/输出序列对话。到目前为止,它只是将数据输入,然后读取所有的数据/错误信息。它也没有实现超时功能,事实上,它甚至没有捕获失败的执行尝试。(我说过它只是一个玩具,到目前为止,是吗?)我还没有实现支持设置、拆卸和外部检查脚本的功能(虽然我有计划这样做)。

Bryan提出的“机器人框架”可能更适合您的需求;不过快速浏览一下,它似乎比我想要的要复杂得多。(我需要保持足够简单,以便新手编程的学生可以专注于他们的练习,而不是花费大量时间来设置他们的测试工具)。

您可以查看claft并使用它或从中派生自己的解决方案(它是BSD许可证)。显然,您可以贡献回来。(它在[bitbucket]上:(http://www.bitbucket.org/),所以您可以使用Mercurial克隆和分叉您自己的存储库...如果您希望我查看将您的更改合并回我的存储库,请提交“拉取请求”)。

不过也许我误解了你的问题。


0
为什么不在(unittest中,但这应该适用于任何框架):
class multiTests(MyTestCase):
    def testMulti(self, tests):
        tests( a == b )
        tests( frobnicate())
        ...

假设您已经实现了MyTestCase,以便将函数包装在其中。
testlist = []
x.testMulti(testlist.append)
assert all(testlist)

-1

如果您在命令行中传递了-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)

使用-x选项:

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)

您可能需要考虑查看nose文档


3
问题是关于一个测试中多个断言,其中一些可能会失败,而不是关于多个测试。 - Vinay Sajip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接