5

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

4

5 回答 5

2

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

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

于 2009-08-20T17:25:31.587 回答
1

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

于 2009-08-20T17:28:36.603 回答
1

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

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

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

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

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

欢迎您查看claft和使用它或从中获得您自己的解决方案(它是 BSD 许可的)。显然,欢迎您回馈。(它在 [bitbucket]:( http://www.bitbucket.org/)上,因此您可以使用 Mercurial 进行克隆,并分叉您自己的存储库……如果您希望我查看,请提交“拉取请求”将您的更改合并回我的仓库)。

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

于 2009-08-20T21:10:09.260 回答
0

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

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

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

testlist = []
x.testMulti(testlist.append)
assert all(testlist)
于 2009-08-21T22:26:04.497 回答
-1

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

测试.py:

def test1():
    assert False

def test2():
    assert False

没有 -x 选项:

C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py
法郎
==================================================== =====================
失败:test.test1
-------------------------------------------------- --------------------
回溯(最近一次通话最后):
  文件“C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py”,行
183,在运行测试中
    self.test(*self.arg)
  文件“C:\temp\py\test.py”,第 2 行,在 test1
    断言假
断言错误

==================================================== =====================
失败:test.test2
-------------------------------------------------- --------------------
回溯(最近一次通话最后):
  文件“C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py”,行
183,在运行测试中
    self.test(*self.arg)
  文件“C:\temp\py\test.py”,第 5 行,在 test2
    断言假
断言错误

-------------------------------------------------- --------------------
在 0.031 秒内运行 2 次测试

失败(失败=2)

使用 -x 选项:

C:\temp\py>C:\Python26\Scripts\nosetests.exe test.py -x
F
==================================================== =====================
失败:test.test1
-------------------------------------------------- --------------------
回溯(最近一次通话最后):
  文件“C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py”,行
183,在运行测试中
    self.test(*self.arg)
  文件“C:\temp\py\test.py”,第 2 行,在 test1
    断言假
断言错误

-------------------------------------------------- --------------------
在 0.047 秒内运行 1 次测试

失败(失败=1)

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

于 2009-08-20T16:41:49.753 回答