如何在py.test中收集动态创建unittest TestCases和TestSuites的测试?

时间:2015-01-24 02:39:28

标签: python testing functional-testing pytest

tl; dr:有没有办法用py.test收集动态生成的unitest.TestSuite包含的测试,还是我运气不好?

我开发了一个名为gabbi的工具,它允许使用YAML格式对HTTP API进行声明性测试。它在概念上与pytest-yamlwsgi类似,但专门设计用于testrepositorysubunit驱动的OpenStack开发世界。

然而,在我进入那个世界之前,我使用了pytest,我仍然喜欢它。我希望我的工具可以使用它。事实证明这比我希望的更难。

在gabbi中,每个YAML文件都是有序的HTTP请求序列。每个请求都是一个TestCase,整个测试集保存在TestSuite的子类中,有两个目的:

  • 按顺序运行测试
  • 建立YAML文件中所述的所谓“灯具”

在世界的单元测试方面,这些测试由load_tests协议构建和加载。

This branch of TiddlyWeb显示了我向TiddlyWeb添加gabbi测试的示例。我已经在该分支中进行了实验,以使其在py.test中运行。我几乎可以通过在test_tiddlyweb文件中添加以下内容来实现它的工作:

def test_generate_tests():
    from unittest import defaultTestLoader, TestResult
    tests = load_tests(defaultTestLoader, None, None)
    # when calling a unittest.TestCase we need to provide a
    # TestResult to track the results
    result = TestResult()
    for test in tests:
        yield test, result

(我还需要确保底层的TestSuite可以使用__hash__函数进行清理。)

这实际上会运行测试,但存在问题:

  • 未跟踪失败:py.test表示一切都过去了。
  • 测试次数是TestSuites的次数,而不是TestCases的次数

我尝试在收集,运行和报告期间以各种方式使用py.test挂钩,但对收集有一些影响,但在运行和报告方面没有成功。问题似乎是内置到py.test中的unittest处理还没有准备好处理嵌套或产生的TestSuite。 (load_tests返回一个TestSuite,每个YAML文件包含一个TestSuite,YAML文件中的每个HTTP请求都是一个TestCase。)

请注意,理想的解决方案不会改变创建TestSuite和TestCase的现有gabbi代码,而是将创建的结果转换为可用的内容。如果那是不可能的,我也很想听听更具侵入性的解决方案。谢谢!

更新:为了跟进自己,我最终想出了一种使用生成器来实现这一目标的方法。这是pull request合并后的结果,我对结果感到满意。

0 个答案:

没有答案