仅测试Python中受影响的代码

时间:2012-11-19 04:20:12

标签: python testing

我一直在研究一个包含大量测试的相当大的Python项目。

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

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

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

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

如果没有,那么建立类似的东西会有什么好的初步方法?

8 个答案:

答案 0 :(得分:1)

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

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

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

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

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

祝你好运,这绝对是你想要解决的一个有趣的问题,并希望其中一些想法可以帮到你。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

  • 一旦有了makefile,就可以使用making it parallel;如果你可以并行运行六个测试,你将大大减少运行时间。

答案 3 :(得分:0)

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

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

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

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

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

my_module_test.py : module1.py module2.py external\module1.py

答案 4 :(得分:0)

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

不幸的是,我无法告诉如何这样做'跳过,如果资源不可用'是测试套件使用的旧test.regrtest运行器的一个功能。跟踪器上存在向unittest添加资源的问题。

在此期间可能起作用的是这样的:添加一个特定于机器的文件exclusions.py,其中包含一个像上面那样的字符串列表。然后,如果列表中包含相应的字符串,则导入排除项并跳过测试,案例或模块。

答案 5 :(得分:0)

我们过去曾多次遇到过这个问题,并且能够通过改进和重新分解测试来解决这个问题。您没有指定开发实践,也没有指定运行测试所需的时间。我会说,如果你正在做TDD,你测试需要运行不超过几秒钟。运行时间超过您需要移动到服务器的任何内容。如果您的测试花费的时间超过一天,那么您就会遇到真正的问题,这会限制您快速有效地提供功能的能力。

答案 6 :(得分:0)

我猜您正在寻找一种连续测试工具?

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

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

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

更多详细信息在此答案中: https://stackoverflow.com/a/58136374/2377370

答案 7 :(得分:-1)

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