【问题标题】:pytest-randomly - detect test couplingpytest-randomly - 检测测试耦合
【发布时间】:2021-03-26 15:11:28
【问题描述】:

总结问题:

我有大约 1000 个测试,用 pytest-randomly 测试。我知道它们由于耦合而失败,例如--randomly-seed=42

test_1 OK
test_2 OK
...
test_x OK [the one I want to find]
...
test_y FAILED [ y and x are coupled ]
...
test_1000

我想自动找到创建耦合的最小测试序列(对于本示例,它将是test_x -> test_y)。有什么办法吗?

你尝试过的

  • 运行整个测试套件直到我发现种子 42 会产生错误。

  • 我认为这可以通过以--randomly-seed=42 的顺序运行测试用例 1000 次来解决 - 每次都排除一个测试,并检查测试是否仍然失败。如果他们失败了,排除的测试是noise,如果他们没有,排除的测试是重现错误所必需的。这样,在运行 1000 次后,我应该有一组更小的测试导致错误。但这听起来显然已经实现了。

  • 其他问题是 - 如何重新创建确切的测试顺序,但没有一个 chosen 测试?

  • 我基本上是在寻找可以通过给定序列查看的东西...类似于 git rerere 通过 git 提交的方式。

【问题讨论】:

  • 我认为没有现成的解决方案,但编写一个能够做到这一点的 pytest 插件可能是个好主意……可能基于 pytest-reverse。感谢您提到git rerere,不知道这一点:)

标签: python testing pytest


【解决方案1】:

我没有随机使用 pytest,但我可以建议一个算法:

  1. 放弃测试失败后运行的所有测试。
  2. 将数据分成两半。
  3. 运行每一半的测试,在每一半之后进行失败的测试。
  4. 如果失败的测试成功,则丢弃那一半的所有测试。
  5. 转到第 2 步。

它本质上是一个二分搜索,但是将失败的测试放到正常的位置。一旦二分搜索的范围缩小到只包含一个元素而不是失败的测试,你就知道它是耦合的。

【讨论】:

    【解决方案2】:

    通过@Hack5 扩展答案:
    我认为这是可以自动化的,所以我写了一个小的pytest plugin 来做到这一点。它首先在不同的测试运行中以不同的方向(例如向前和向后)运行两次测试,如果它发现仅在一次运行中失败的测试,它会继续运行测试的子集,直到找到依赖关系(使用一种二分搜索,与提议的搜索相比有点优化)。

    使用安装它

    pip install pytest-find-dependencies
    

    并像这样使用它:

    pytest --find-dependencies
    

    如果你有很多测试,你需要一些耐心......

    请注意,这仅在测试不会永久更改环境时才有效 - 假设在每次测试运行时都会重置状态(其他答案也是如此)。

    另请注意,如果您使用 pytest-randomly 找到的种子启动它,它将在第一次运行时使用它,但之后仍会向后运行测试。

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2021-01-23
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      相关资源
      最近更新 更多