繁体   English   中英

支持非致命故障的 Python 测试框架

[英]Python test framework with support of non-fatal failures

我正在评估用于自动化系统测试的“测试框架”; 到目前为止,我正在寻找一个 python 框架。 在 py.test 或nose 中,我看不到我从谷歌测试框架中知道的 EXPECT 宏之类的东西。 我想在一个测试中做出几个断言,而不是在第一次失败时中止测试。 我是否在这些框架中遗漏了一些东西,或者这不起作用? 有人对可用于自动化系统测试的 python 测试框架有什么建议吗?

我想要类似的功能测试,我正在使用鼻子。 我最终想出了这个:

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 测试框架。 我也没有想出如何编写鼻子插件来做这种事情。 :-/

你征求了建议,所以我会建议机器人框架

奇怪的是,听起来您正在寻找类似于我的claft (命令行和过滤器测试器)的东西。 类似的东西,但要成熟得多。

claft (到目前为止)只是我写的一个玩具,用来帮助学生进行编程练习。 这个想法是为练习提供简单的配置文件,这些文件以合理的人类可读(和声明性而非程序化)的方式表示程序的需求,同时也适合自动化测试。

claft运行所有定义的测试,为每个测试提供参数和输入,检查返回代码,并根据正则表达式模式匹配输出 ( stdout ) 和错误消息 ( stderr )。 它收集列表中的所有故障,并在每个套件的末尾打印整个列表。

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

布莱恩对“机器人框架”的建议可能更适合您的需求; 尽管快速浏览它表明它比我想要的要复杂得多。 (我需要让事情足够简单,这样刚接触编程的学生可以专注于他们的练习,而不是花很多时间来设置他们的测试工具)。

欢迎您查看claft并使用它或从中导出您自己的解决方案(它是 BSD 许可的)。 显然,欢迎您回馈。 (它在 [bitbucket]:( http://www.bitbucket.org/ )上,所以你可以使用 Mercurial 来克隆,并分叉你自己的存储库......如果你想让我看看,并提交一个“拉请求”将您的更改合并回我的仓库)。

再说一次,也许我误读了您的问题。

为什么不(在unittest ,但这应该适用于任何框架):

class multiTests(MyTestCase):
    def testMulti(self, tests):
        tests( a == b )
        tests( frobnicate())
        ...

假设您实现了 MyTestCase 以便将函数包装到

testlist = []
x.testMulti(testlist.append)
assert all(testlist)

如果您在命令行中传递-x选项,nose 只会在第一次失败时中止。

测试.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)

您可能需要考虑查看鼻子文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM