【问题标题】:Automatic low level testing generation based on high level desired behavioral examples基于高级期望行为示例的自动低级测试生成
【发布时间】:2019-04-14 01:57:20
【问题描述】:

顶级问题

我们的团队继承了一个非常庞大且脆弱的 python 2(以及 C、C++ 和其他少数几个)代码库,更新起来非常困难且成本高昂。大量的依赖项。很少测试。添加行为改进和转换为 python 3 似乎都是一项艰巨的任务。即使是对新版本进行小改动,我们也不得不多次恢复,因为它已经损坏了一些东西。

这是一个测试不足及其重大技术债务的故事。

尽管如此,这个项目是如此之大而且很有帮助,与其重新发明它所做的一切相比,更新它似乎是一件轻而易举的事。

子问题

如何添加大量缺失的小测试。我们如何才能从高级用户验收测试中自动生成简单的输入/输出验收单元测试?

尝试的解决方案

该代码库需要处理大约 50 个大型高级行为测试。不幸的是,运行它们需要几天时间,而不是几秒钟。这些练习了我们最关心的所有代码,但是它们太慢了。 (也是一个书呆子的观察,每个代码都使用了 80% 的相同代码)。有没有办法在运行这些时从自动堆栈检查中自动生成输入/输出单元测试?

换句话说,我有高级测试,但我想根据这些高级测试的执行自动创建低级单元和集成测试。

使用单元测试镜像高级测试对于增加代码覆盖率确实为零,但它所做的是使测试更快,更不脆弱。它将允许快速而自信地重构各个部分。

我非常熟悉使用 TDD 来缓解这个巨大的脆弱 blob 问题,因为它实际上在很多情况下加速了开发并防止了这个问题,但这是一种独特的问题解决,因为代码库已经存在并且“有效”;)。

任何自动化测试工具提示?我用谷歌搜索了很多,我发现了一些可能适用于 C 的东西,但我找不到任何东西可以让 python 生成 pytests/unittest/nose 或其他任何东西。我不在乎它使用什么 python 测试框架(尽管更喜欢 pytest)。我一定是在搜索错误的术语,因为似乎令人难以置信的是,python 不存在测试生成工具。

【问题讨论】:

  • 您可以使用proxy pattern 来捕获对您要测试的python 代码部分的调用吗? python testing 上有一个空闲频道,可能有用。
  • 我将从一个开源覆盖工具开始,并将其扩展为序列化所有参数以及给定方法的返回值。然后,您可以使用通用测试类来调用具有先前序列化对象的方法,并将返回值与您保存的引用进行比较。它不适用于每种方法,但它可能是一个开始。

标签: python unit-testing testing automated-tests


【解决方案1】:

首先,很好,您已经运行了一些更高级别的测试。并行化它们的执行,在不同的硬件上运行每个,如果可能的话,购买更快的硬件——因为你要处理的重构任务似乎很大,这仍然是最便宜的方法。考虑将这些更高级别的测试分解为更小的测试。

其次,正如 lloyd 所提到的,对于您计划重构的组件,确定组件的边界,并在执行更高级别的测试期间记录边界处的输入和输出值。通过一些脚本,您可以将记录的值转换为单元测试代码的起点。在极少数情况下,这最终会立即成为有用的单元测试:通常您需要进行一些重要的架构分析并可能重新设计:

  • 应该测试哪些单元?单个方法、方法组、类组?例如,setter 方法不能在没有其他方法的情况下进行明智的测试。或者,要测试任何方法,首先必须存在一个构造对象,因此需要调用构造函数。
  • 组件的边界是什么?依赖的组件有哪些?您可以使用哪些依赖的组件,哪些需要模拟?许多组件可以按原样使用 - 例如,您不会模拟诸如 sin 或 cos 之类的数学函数。
  • 单元测试之间的界限是什么,也就是说,在长时间运行的测试中,您会考虑在哪些点开始和结束单元测试?记录的哪一部分被认为是设置、执行、验证?

所有这些困难都向我解释了为什么一些通用工具可能很难找到,而您可能会被留给专门为测试代码生成创建的脚本。

【讨论】:

    【解决方案2】:

    我采用了一个非常懒惰且实用的不完美解决方案,我花了大约 40 个小时:其中 20 个小时让我的头围绕着 C 部分,足以为它编写单元测试并修复它,总共大约 30 行-- 其他 20 个主要是修复 futurize 无法处理和设置 CI 的琐碎字节/字符串问题。

    1. 运行未来化
    2. 将最理想的用例作为 E2E 测试运行并修复问题,并完成新的关键单元测试
    3. CI w/ tox on 2.7/3.x for these

    最终结果是未更改的 2.7 代码库和最低限度工作的 beta 3.7 代码库,长尾 3.7 对次要用例的支持将随着时间的推移得到解决,请参阅 Dirk 的长期答案。

    【讨论】:

      猜你喜欢
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多