🧠关于测试环境清洁的一点儿小思考
前言:
每次执行接口自动化测试之前,确保测试环境的清洁是非常重要的。
工作中常见的方式有以下几种:
1、专用清理接口(很好,但不建议)
- 由开发提供对应接口的数据清理接口,这样对测试来说最简单了!
- 优点:简单、安全、可控、适合 CI。
- 缺点:需开发配合,增加他们的工作量,如果和开发没有过命的交情不要说!!!
2、测试数据隔离
- 每个测试用例使用独立的数据:通过在测试用例中创建唯一的数据(例如使用 UUID 生成唯一的用户名、订单号等),可以避免不同测试之间的数据冲突。
- 优点:不需要重置整个数据库,减少了清理的工作量。
- 缺点:需要确保所有测试都遵循这一规则,且某些场景下可能难以实现完全隔离。
3、局部数据清理(沟通成本大,不建议)
- 测试后清理:在每个测试结束时(teardown 阶段)删除该测试创建的数据。这可以通过
pytest
的 fixture 来实现。 - 测试前准备:在测试开始前(setup 阶段)清除与当前测试相关的旧数据,确保测试环境干净。
- 优点:针对性强,不影响其他测试数据,适合大多数场景。
- 缺点:需要编写额外的代码来处理数据的增删,需要提前和开发沟通,看代码对哪些表进行了操作,再去一一清理,沟通成本也很大!!!
4、定期重置数据库(简单粗暴)
- 定时清理:可以在每天或每次 CI/CD 构建之前执行一次数据库重置脚本,清理所有测试数据。
- 优点:简单直接,适用于数据量不大或测试环境相对简单的项目。
- 缺点:如果测试频繁运行,可能会导致效率低下;并且如果存在长时间运行的测试,可能会丢失部分测试结果。
5、事务回滚(理想状态,不现实)
- 利用数据库事务:对于支持事务的数据库操作,可以在测试前后开启和回滚事务,这样即使测试过程中修改了数据,在测试结束后也能恢复到初始状态。(大前提,服务端和测试框架共享数据库连接 + 测试直接调用业务逻辑,一般实现不了。)
- 优点:高效,对现有数据无影响。
- 缺点:仅适用于支持事务的操作,不适用于所有类型的测试(如外部API调用)。
6、混合策略
- 结合多种方法:根据不同的测试类型采用不同的清理策略。例如,单元测试可以使用事务回滚,集成测试则采用局部数据清理或定期重置。
- 优点:灵活,能够适应复杂的应用场景。
- 缺点:实现较为复杂,需要仔细规划和维护。
🔥实际应用中的建议
- 优先考虑测试数据隔离:这是最轻量级的方法,尽量让每个测试用例只依赖自己创建的数据,并确保这些数据是唯一的。
- 局部清理作为补充:对于那些确实需要清理的数据,使用 teardown 清理机制确保测试后环境干净。
- 定期重置作为兜底措施:如果有条件的话,可以在夜间或其他低峰时段执行一次全面的数据库重置,以确保长期运行的测试环境不会积累过多的垃圾数据。
🔐 个人经验:
怎么方便怎么来!
如果是jmeter编写脚本的方式来维护脚本,推荐方式2,尽量让脚本用例数据独立。
如果是python脚本也是首推方式2,脚本用例的数据独立是成本最低的。如:
# 每次生成唯一用户名,可标识的前缀+uuid
username = f"auto_{uuid.uuid4().hex[:6]}"
# 示例:auto_a1b2c3
其次再考虑方式3的 fixture 清理数据,通常服务端一个接口会对多张业务表进行改动的,那我们的teardown逐个delete太麻烦啦!和开发沟通会增加很多不必要的时间合作成本。
事务回滚的前提条件太麻烦,基本搞不了!!!
因为事务回滚是针对数据库连接的,我们测试端开启事务,并不能回滚服务端对数据库的操作。
所以我们要求我们测试端能直接调用开发的业务逻辑,这样才能真正的通过事务回滚数据库内容,难实现!通常是开发本地写单元测试时比较容易实现。
方式4,工作中比较少会这样做,测试阶段的测试环境数据库往往不只有一人在用,不能因为我要数据干净而影响到其他同事的进度!
最终我推荐方式2,数据唯一,且不进行数据清理!另外选择一个比较干净完整的数据库做备份,当每次迭代完需求后,我们在进行数据库回滚。
在实际工作中,切勿有“完美”洁癖。 因为项目通常都是赶工期的,先确保工作内容交付掉,后续空闲时再琢磨怎么优化。项目前期还是要以手动的功能测试为主,待业务稳定后,再对这些稳定业务拓展接口自动化!!!
评论区