有没有办法开始只与更改代码相关的单元测试?

Posted

技术标签:

【中文标题】有没有办法开始只与更改代码相关的单元测试?【英文标题】:Is there a way to start unit tests which related only to changed code? 【发布时间】:2015-06-30 10:50:06 【问题描述】:

在我的 Python 项目中,我们有大量的单元测试(几千个)。尽管它们在逻辑上分布在文件和类之间,但有时我需要大量时间才能找到它们,这涵盖了我正在更改的功能。

当然,我可以从某个特定文件/类运行所有测试,但同样由于测试数量众多,连续运行它们会很耗时(我每次保存后都会执行单元测试我的 IDE 中的一个文件)。

所以一般来说,我需要一些解决方案来一次执行以下活动:

跟踪自上次保存文件后更改了哪些文件 跟踪这些文件中已更改的代码与覆盖该代码的单元测试之间的依赖关系 仅选择性地执行那些覆盖受影响代码的单元测试

有人知道类似的事情吗?

【问题讨论】:

代码更改不应影响正确的单元测试...您不需要对代码库中的每个函数/方法进行单元测试。您应该坚持只对代码的公共接口 (API) 进行单元测试。这样,当您更改实现细节(例如您决定使用新算法来完成某事)或重构代码时,您的测试将继续工作。 @CharlesP 您指的是黑盒测试(端到端)。 OP 可能正在谈论白盒测试。 【参考方案1】:

pytest-testmon 是一个 pytest 插件,它只选择自上次执行以来受更改影响的测试。它使用Coverage.py 跟踪各个测试的依赖关系,并在每次执行时比较和保存方法的校验和。

【讨论】:

【参考方案2】:

您可能想结帐pytest-incremental:

我们的想法是通过不执行所有测试而只执行“必需”的测试来更快地执行您的测试。

通过pypi安装:

pip install pytest-incremental

用法:

$ py.test --inc

我认为它可以满足您的需求,它“递归查找导入以查找依赖项(使用 AST)”并且仅运行更改后的测试。

【讨论】:

还有github.com/eventbrite/nose-knows,对鼻子做了类似的事情。【参考方案3】:

假设 1:您可以将 IDE 设置为在文件保存时触发脚本。

假设2:该脚本可以接收正在保存的文件的名称并访问文件内容。

您可以创建一个测试覆盖描述“文件”(存储位置:无关)类似于以下内容:

**module**         **tested by**
mymod1.py       testsuite1.py
mymod2.py       testsuite2.py
mysubmod1.py    testsuite3.py
mysubmod2.py    testsuite3.py

读取您保存的文件以获取导入语句并从测试列中检索所有需要的值,以涵盖您保存的文件和依赖项。然后运行您的测试模块。

我想这也可以从命令行工作,将更改的文件名作为参数。

我认为依赖跟踪可能需要另辟蹊径。如果是这样,则必须解析目录中所有内容的导入以查找更改的模块。该过程的其余部分将是相同的。

【讨论】:

以上是关于有没有办法开始只与更改代码相关的单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法对 AWS Cloudformation 模板进行单元测试

有没有办法使用 XCTest 对 Touch Id 进行单元测试?

有没有办法批量处理 Karma - Angular 单元测试?

有没有办法在 .NET Core 的单元测试中查看生成的日志消息?

如何通过单元测试最好地监控性能?

更改数据库模式和单元测试