Joh*_*Eye 7 python testing unit-testing fixtures pytest
我正在开发一个快速增长的 Python 项目。最近,我们的测试套件开始变得有些难以管理。一些测试在它们所在的模块以错误的顺序执行时失败,尽管它们看起来很好隔离。
我发现了一些关于此的其他问题,但他们关注的是固定装置:
虽然我们也在使用固定装置,但我不认为问题出在它们内部,但更有可能是因为我们使用的库中的类具有内部状态,这些内部状态会通过测试运行而改变,例如通过mockito-python.
我最初来自 Java 世界,除非你明确地让你的测试相互依赖或做一些疯狂和不寻常的事情,否则这不会发生。在 Python 中遵循相同的一组实践导致我遇到了这些问题,所以我意识到我可能遗漏了 Python 测试开发的一些关键规则。
是否有可能告诉pytest在不同模块运行之间删除/恢复/重新初始化所有类的内部状态?
如果没有,我们在测试开发过程中应该遵循哪些规则来防止这些问题?
编辑:我们发现的问题之一是我们在测试文件的顶层设置了一些对象,这些对象是由mockito-python. 执行测试时,首先导入所有文件,然后执行测试。发生的事情是调用了一个测试,mockito.unstub()它删除了 mockito 的模拟注册表中的所有模拟。所以当测试实际执行时,另一个测试已经拆除了它的模拟。这种行为非常违反直觉,尤其是对于没有经验的开发人员。
在Python中,很容易发生某些状态被错误修改的情况。[:]例如,当将列表分配给变量时,当需要创建列表的副本时很容易忘记添加 a 。
x = [0,1,2,3,4,5]
y = x # oops, should have been x[:]
y[2] = 7 # now we modify state somewhere...
x
=> [0, 1, 7, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
至少更有可能识别此类问题的一种可能方法是按随机顺序执行单元测试。我根据/sf/answers/280423111/的想法进行了一项实验:
import unittest
import random
def randcmp(_, x, y):
return random.randrange(-1, 2)
unittest.TestLoader.sortTestMethodsUsing = randcmp
Run Code Online (Sandbox Code Playgroud)
因此,测试的执行顺序在测试执行之间发生了变化。如果您的测试错误地碰巧具有依赖性,您也许可以通过这种方式解决问题,因为某些执行顺序会导致失败。当然,您会从小规模开始(仅执行少量测试),这样您就有机会更轻松地找到罪魁祸首。
也许值得尝试...
| 归档时间: |
|
| 查看次数: |
1419 次 |
| 最近记录: |