是否有一种方法可以自动运行几次python代码和Pytest测试的组合?



我正在寻找自动化的过程:我运行一些python代码,然后使用pytest运行一组测试然后,如果所有测试都已验证,则使用新数据再次启动该过程。

我正在考虑写一个执行python代码的脚本,然后使用pytest.main()调用pytest,在退出代码的帮助下检查所有测试是否通过,如果成功重新开始。

问题是pytest文档(https://docs.pytest.org/en/stable/usage.html)中声明不建议多次调用pytest.main():

pytest文档注释:

"调用pytest.main()将导致导入测试和它们导入的任何模块。由于python的导入系统的缓存机制,从同一进程对pytest.main()的后续调用不会反映调用之间对这些文件的更改。因此,不建议从同一进程多次调用pytest.main()(例如,为了重新运行测试)。">

我想知道是否可以按我打算的方式调用pytest.main(),或者是否有更好的方法来实现我正在寻找的东西?

我已经做了一个简单的例子,使问题更清楚:

A = [0]
def some_action(x):  
x[0] += 1
if __name__ == '__main__':
print('Initial value of A: {}'.format(A))
for i in range(10):
if i == 5:
# one test in test_mock2 that fails
test_dir = "./tests/functional_tests/test_mock2.py"
else:
# two tests in test_mock that pass
test_dir = "./tests/functional_tests/test_mock.py"
some_action(A)
check_tests = int(pytest.main(["-q", "--tb=no", test_dir]))
if check_tests != 0:
print('Interrupted at i={} because of tests failures'.format(i))
break
if i > 5:
print('All tests validated, final value of A: {}'.format(A))
else:
print('final value of A: {}'.format(A))

在本例中,执行some_action直到i达到5,此时测试失败,执行/测试的过程中断。它似乎工作得很好,我只关心因为上面所说的pytest文档中的注释

该警告适用于以下事件序列:

  1. 在直接或间接导入a.py的文件夹上运行pytest.main
  2. 修改a.py(手动或编程)
  3. 尝试在与#1相同的python进程的同一目录上重新运行pytest.main

步骤#3中的第二次运行将不会看到您在步骤#2中对a.py所做的更改。这是因为python不会两次导入文件。相反,它将检查文件是否在sys.modules中有条目,并使用该条目。它允许您多次导入大型库,而不会每次都产生巨大的惩罚。

修改导入模块中的值是可以的。Python将名称绑定到引用,因此如果您将某些内容(如新的整数值)绑定到正确的名称,每个人都可以看到它。some_action函数就是一个很好的例子。如果将来的测试将脚本作为一个模块导入,那么它们将使用修改后的值运行。

这里有警告的原因是pytest通常用于测试修改后的代码。该警告只是告诉您,如果您修改了代码,则需要在新的python进程中启动pytest.main以查看更改。

由于您在测试中似乎没有修改文件的代码,并且期望更改显示出来,因此您引用的警告并不适用于您。继续做你正在做的事。

最新更新