(我是非技术QA,请原谅我的技术无知)
图书馆:
- pytest ==6.2.4
- mysql-connector-python ==8.0.23
- 硒==3.141.0
- psycopg2 ==2.8.6
- 断言==1.1
- 请求==2.25.1
- sshtunnel ==0.4.0
(如果它解决了我的问题,我不介意切换到另一个 python 测试框架)
测试执行环境:目前在本地并手动触发。未来,通过 CI 管道。
用例:
我将使用 selenium 运行 E2E 测试,然后在 DB 中检查一些东西。一些检查会立即进行,而一些检查会延迟一些已知的持续时间。
这些检查被延迟,因为被测 API 创建了一个作业,该作业在 20 分钟后执行以在数据库表中插入/更新某些内容。
API 与前端 cookie 紧密耦合,因此无法通过 API 单元/集成测试单独测试此功能。
这些测试与合规性相关,因此不能忽略它们。现在每周手动测试一次。这是一个真正的痛苦......
假设我有 35 个这样的测试并且每个自动化测试需要等待 20 分钟,那么测试执行的总持续时间非常长。
考虑一个场景:
我的测试文件很少,其中有 5 个测试。在每个测试方法的末尾有 4 个断言。最后 2 个断言需要我在“x”分钟后验证数据库表中的某些内容。对于每种测试方法,最后 2 个断言的等待持续时间可能会有所不同(>=15 分钟),这将是事先知道的。
现在我试过了,
time.sleep(duration) 这只是支撑整个测试。
即使并发/并行执行也无济于事,因为当它们到达每个测试方法中的最后 2 个断言语句时,它们都必须等待一段时间,并且它只会在给定的时间内停止测试。
考虑过将 RabbitMQ 与 Celery 一起使用并安排这些断言,但是在执行这些断言时,pytest 会为所有测试分配一个状态:(通过/失败)。因此,如果 test1 被标记为 Pass 并且在 10 分钟后,在执行断言语句后它失败,那么我将无法在 pytest 中更新 test1 的状态。
当前解决方法:
对于每种测试方法,我将所需的 id 存储在一个文件中,并在 30 分钟后手动检查它们。
我有几件事:
如果我能够:
延迟或计划执行测试方法中的语句。(这样的语句将是测试方法中的最后几条语句)
保持延迟语句执行完成的测试结果。
在延迟断言结束后更新此类测试或测试方法的结果。
在运行并行测试时安排这些延迟语句后,从下一个测试方法开始。(总是理解这样的延迟语句将是测试方法的最后几个语句)
这是可行和可实现的吗?
其他参考:https ://github.com/pytest-dev/pytest/issues/9012#issuecomment-900851702 (我真的没明白)
任何已解决类似问题的参考文档、伪代码、文章、博客将不胜感激。