【发布时间】: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