13

我一直在从事一个相当大的 Python 项目,并进行了许多测试。

应用程序的某些特定部分需要一些 CPU 密集型测试,而我们在提交之前测试所有内容的方法不再有意义。

从那时起,我们就采用了基于标签的选择性测试方法。问题是,随着代码库的增长,维护所述标记方案变得有些麻烦,我想开始研究我们是否可以构建更智能的东西。

在之前的工作中,测试系统只测试受提交更改影响的代码。

似乎Mighty MooseCLR对语言采用了类似的方法。以这些为灵感,我的问题是,项目中的智能选择性测试有哪些替代方案(如果有的话)Python

如果没有,构建这样的东西有什么好的初始方法?

4

8 回答 8

2

自动对应用程序的某些部分进行选择性测试的想法听起来很有趣。然而,感觉这是使用静态类型语言更容易实现的东西,但考虑到 Python 的动态特性,获得能够可靠地检测受给定提交影响的所有测试的东西可能是一项重大的时间投资.

在阅读您的问题时,抛开选择性测试的想法,想到的方法是能够将测试分组,以便您可以单独执行测试套件,从而启用许多有用的自动化测试执行策略,可以缩短反馈循环如:

  • 在不同机器上并行执行单独的测试套件
  • 在构建管道的不同阶段运行测试
  • 在每次提交时运行一些测试,在每晚构建时运行其他测试。

因此,我认为您使用标签将测试划分为不同“组”的方法是一种聪明的方法,尽管正如您所说,使用大型测试套件管理这些变得困难。鉴于此,可能值得花时间构建工具来帮助管理测试套件,尤其是标签管理。这样的系统可以通过从以下方面收集信息来构建:

  • 测试结果输出(通过/失败、执行时间、记录输出)
  • 代码覆盖率输出
  • 源码分析

祝你好运,这绝对是你正在尝试解决的一个有趣的问题,希望这些想法对你有所帮助。

于 2013-06-24T08:49:27.560 回答
1

我猜你正在寻找一个连续的测试工具?

我创建了一个位于后台并仅运行受影响的测试的工具:(您将需要来自 pip 的 PyCharm 插件和 pycrunch-engine)

https://github.com/gleb-sevruk/pycrunch-engine

如果您使用 PyCharm,这将特别有用。

更多细节在这个答案中: https ://stackoverflow.com/a/58136374/2377370

于 2019-10-21T20:24:04.237 回答
0

如果您正在使用,unittest.TestCase那么您可以使用参数指定要执行的文件pattern。然后您可以根据更改的代码执行测试。即使不使用unittest,您也应该按功能区域/模块组织测试,以便您可以使用类似的方法。

可选地,这不是解决您的问题的优雅解决方案,但如果每个开发人员/组或功能代码区域都提交到单独的分支,您可以在您的持续测试环境中执行它。一旦完成(并通过),您可以将它们合并到您的主干/主分支中。

每 15-30 分钟(如果有新提交)将所有测试的夜间作业和每个分支测试的组合就足够了。

于 2012-11-19T06:59:11.690 回答
0

关于这个主题的一些随机想法,基于我之前在 Perl 代码库上所做的工作,其中存在类似的“完整构建太长”问题:

  • 了解您的依赖关系是完成这项工作的关键。如果模块 A 依赖于 B 和 C,那么当其中任何一个发生更改时,您需要测试 A。看起来Snakefood是获取概述代码中依赖关系的字典的好方法;如果你把它翻译成一个makefile,那么你可以在签入时简单地“make test”,所有的依赖项(只有需要的依赖项)都将被重建和测试。

  • 一旦你有了一个makefile,就让它并行;如果您可以并行运行六个测试,您将大大减少运行时间。

于 2013-03-19T19:06:24.660 回答
0

如果您将测试结果写入文件,则可以使用 make 或类似的替代方法来确定何时需要“重建”测试。如果将结果写入文件,make 可以将测试的日期时间戳与依赖的 python 文件进行比较。

不幸的是,Python 不太擅长确定它所依赖的内容,因为模块可以动态导入,因此您无法可靠地查看导入来确定受影响的模块。

我会使用命名约定来允许 make 通用地解决这个问题。一个天真的例子是:

%.test_result : %_test.py
python $< > $@

它定义了一个新的隐式规则来在 _test.py 和测试结果之间进行转换。然后你可以告诉你为你的测试创建额外的依赖项,如下所示:

my_module_test.py : module1.py module2.py external\module1.py
于 2013-06-18T14:16:02.353 回答
0

考虑扭转这个问题:需要排除哪些测试才能使其余的测试可以接受。Lib/test 中的 CPython 测试套件排除了资源繁重的测试,直到特别请求(因为它们可能在 buildbot 上)。一些可选资源是“cpu”(时间)、“largefile”(磁盘空间)和“network”(连接)。(python -m test -h(在 3.x 上,test.regrtest 在 2.x 上)给出了整个列表。)

不幸的是,我无法告诉如何执行此操作,因为“如果资源不可用则跳过”是测试套件使用的较旧的 test.regrtest 运行器的一个功能。跟踪器上存在向单元测试添加资源的问题。

在此期间可能会起作用的是:添加一个特定于机器的文件 excludes.py,其中包含与上述类似的字符串列表。然后导入排除项并跳过测试、案例或模块(如果适当的字符串在列表中)。

于 2013-07-27T00:33:26.330 回答
0

我们过去多次遇到这个问题,并且能够通过改进和重构测试来解决这个问题。您没有指定您的开发实践,也没有指定运行测试需要多长时间。我想说,如果你在做 TDD,你的测试需要运行不超过几秒钟。任何运行时间超过您需要移动到服务器的东西。如果您的测试运行时间超过一天,那么您遇到了一个真正的问题,它将限制您快速有效地交付功能的能力。

于 2013-10-01T02:11:36.623 回答
-1

你不能使用像Fabric这样的东西吗?http://docs.fabfile.org/en/1.7/

于 2013-09-12T09:34:30.577 回答