实现测试固件是自动测试的关键方面,它为测试场景准备环境、数据和依赖关系。
问题概述 固件出现在自动化测试中,作为集中管理测试执行前的环境预设和清理的一种方式。通过这些,团队能够实现测试的一致性和可预测性,尤其在代码不断更改的情况下,这一点至关重要。
问题 没有正确的固件,自动测试会变得不稳定,彼此依赖,在并行运行时相互干扰,并且增加技术债务(因为setup/teardown逻辑重复并不断膨胀)。
解决方案
使用测试框架提供的标准固件机制(例如,JUnit中的@BeforeAll,@BeforeEach或pytest中的conftest.py)。努力使固件可配置和隔离:
关键特点:
在一个测试中可以修改固件创建的对象,如果它们在后续测试中需要吗?
不可以,这样测试会变得相互依赖:一个测试所做的更改可能会破坏另一个测试。最好为每个测试使用新的对象,或在每次执行后回滚更改。
为什么不在自动测试开始时“一次性”加载整个数据库,以加快流程?
这种方法可能导致不稳定的测试和难以捉摸的错误。数据将在测试之间“悬挂”,执行顺序将变得至关重要。
可以为整个测试集使用一个全局固件吗?
不可以,全局固件仅适用于完全独立的测试。通常,这种方法会导致测试之间的相互影响,从而难以分析和维护。
在项目中,为了节省时间,决定在同一个数据库上运行自动测试,而不在每个测试后回滚更改。在出现修改相同数据的测试后,出现了波动错误:测试不断失效,取决于运行顺序。
优点:
缺点:
使用工厂固件:每个测试创建自己的数据,测试结束后删除它们。旧错误不再重现,测试顺序无关紧要。
优点:
缺点: