Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在py.test中收集动态创建unittest测试用例和测试套件的结果?_Python_Testing_Functional Testing_Pytest - Fatal编程技术网

Python 如何在py.test中收集动态创建unittest测试用例和测试套件的结果?

Python 如何在py.test中收集动态创建unittest测试用例和测试套件的结果?,python,testing,functional-testing,pytest,Python,Testing,Functional Testing,Pytest,tl;dr:有没有办法用py.test收集动态生成的unitest.TestSuite包含的测试,还是我运气不好 我开发了一个名为的工具,它允许使用YAML格式对HTTP API进行声明性测试。它在概念上与OpenStack类似,但专门设计用于OpenStack开发的动态和驱动世界 然而,在我进入那个世界之前,我使用pytest,我仍然更喜欢它。我希望我的工具能和它一起使用。事实证明,这比我希望的要困难得多 在gabbi中,每个YAML文件都是HTTP请求的有序序列。每个请求都是一个TestCa

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

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

然而,在我进入那个世界之前,我使用pytest,我仍然更喜欢它。我希望我的工具能和它一起使用。事实证明,这比我希望的要困难得多

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

  • 按顺序运行测试
  • 建立YAML文件中规定的任何所谓“固定装置”
在世界的unittest端,这些测试是通过
load\u测试
协议构建和加载的

显示我向TiddlyWeb添加gabbi测试的示例。我在那个分支中进行了实验,以使它在py.test中工作。通过向文件中添加类似以下内容,我几乎可以但不完全可以使其正常工作:

(我还需要确保底层TestSuites可以使用
\uuuuuhash\uuuuu
函数进行散列。)

这将实际运行测试,但存在以下问题:

  • 失败不会被跟踪:py.test表示一切都通过了
  • 测试计数是测试套件的计数,而不是测试用例的计数
我曾尝试在收集、运行和报告期间以各种方式使用py.test钩子,对收集有一定影响,但在运行和报告方面没有成功。问题似乎在于py.test中内置的unittest处理尚未准备好处理嵌套或生成的TestSuite。(load_tests返回一个TestSuite,每个YAML文件包含一个TestSuite,YAML文件中的每个HTTP请求都是一个TestCase。)

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


更新:为了跟进我自己,我最终找到了一种使用发电机的方法。这就是合并后的结果。

我从未使用unittest中的
testLoader
,但我收集了非python文件,将它们“翻译”成有效的python,然后成功地将它们传递给py.test,这就是插件:
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