如何并行运行独立的Robotium UI测试?

Dan*_*n J 15 continuous-integration android robotium jenkins android-gradle-plugin

我正在使用Jenkins进行Android持续集成.我有一些独立的,独立的Robotium UI测试,目前需要12分钟才能对单个模拟器进行串行运行.任何人都可以建议一个好的方法来并行运行它们只需要6分钟(或更短)?

我知道在多个设备/模拟器上并行运行完整测试套件的各种方法,例如,请参阅Jenkins Android Emulator插件,SpoonAppThwack等云测试公司的多配置(矩阵)作业部分.

我知道如何通过使用JUnit注释运行我的测试的特定子集,或者显然Spoon支持类似的功能(请参阅我的问题).

我现在正在使用Spoon来运行我的完整测试套件(主要是为了利用带有屏幕截图的可爱HTML输出).如果有人提供关于拆分测试并将其并行运行的最佳方法的提示,那就太棒了.

我假设我可以通过将测试分成两个单独的CI工作来实现这一点,但是维持两个单独的工作并将结果结合起来听起来很痛苦.

Dan*_*n J 6

更新:我添加了另一个答案,我认为它提供了更清晰,更简洁的Jenkins配置,并且更直接基于Spoon.


我刚刚发现了Jenkins MultiJob插件,它允许您在一个阶段内并行运行多个作业.

下面是我使用Fork插件执行此操作但稍微脆弱的方法.我使用手动配置的正则表达式来划分测试(这是我尝试使用Fork的主要原因 - 它支持使用正则表达式).

MultiJob在阶段中具有多个下游作业,如下所示:

multi_job_summary

主要工作配置

以下是我的"Android Multi Job"配置方式:

multi_job_summary_1 multi_job_summary_2

下游作业配置

下面是如何配置下游"Android Phase N"作业(android.test.classes每个作业使用不同的正则表达式):

downstream_config

陷阱

  • 根据fork插件问题#6,Fork目前无法在Gradle v1.0.0上运行.
  • 如果您希望Fork正则表达式匹配多个不同的包,则需要用逗号分隔正则表达式.这在Fork项目中没有很好地记录,但他们的TestClassFilter源代码向您展示了他们如何解释正则表达式.
  • 需要命名任何抽象测试类Abstract*,否则Fork会尝试将它们作为测试运行,从而产生恼人的故障.他们的TestClassScanner对此进行控制,并发出#5曲目来改变它.
  • IIRC,您需要为"聚合下游测试结果"选项安装指纹插件才能工作.如果你没有安装它,你会看到这个错误:"在这个版本上没有启用指纹识别.测试聚合需要指纹识别."

限制

  • 测试结果是聚合的,但仅使用JUnit XML测试报告.这意味着您需要单击每个下游作业以查看不错的HTML结果.
  • 基于正则表达式手动分区测试可能会非常繁琐且容易出错.如果您使用这种方法,我建议您仍然需要每晚/每周一次的Jenkins工作,以便在一个地方运行您的完整测试套件,以确保您不会意外丢失任何测试.
  • 此MultiJob方法要求您手动配置每个下游作业,每个下游作业对应要使用的每个从属节点.我们使用Matrix作业制作了一个更好的方法原型,您只需要在一个Jenkins作业中配置所有内容.我们会在接下来的几周内尝试写下来.

期货

我们还设计了一种扩展Spoon的方法(输出比Fork更漂亮),以便在N个下游作业中自动拆分整个测试套件.我们仍然需要增强它以将所有这些结果聚合回上游作业中的单个HTML页面,但不幸的是,Jenkins"Copy To Slave"插件中的一个错误阻止了此工作.


Dan*_*n J 0

这个答案是对我之前的 MultiJob 答案的改进。


我发现做到这一点的最好方法是使用 Jenkins Matrix 作业(又名“多配置项目”)。这真的很方便,因为您可以在单个 Jenkins 作业中配置所有内容。

Spoon 现在支持一个--e选项,允许您将参数直接传递给检测运行器。我已经更新了他们的自述文件,其中包含有关测试分片的部分

该自述文件应该为您提供所需的内容,但以下是我们的 Jenkins 作业配置中的其他亮点,以防有帮助。

设置User-defined Axis我们想要运行的从节点的数量。我们必须将标签设置为,android以便我们的云提供商可以启动适当的从属设备。

矩阵配置

我们有一个run-build.sh使用正确参数调用 Spoon 的脚本。我们需要传入节点总数(在本例中6),以及正在运行的特定从节点的索引(自动出现在变量中node_index)。

矩阵构建

构建后步骤不应与您现有的步骤有任何不同。将来我们可能需要添加一些东西来将结果收集到主节点上(这非常难以弄清楚)。现在您仍然可以点击查看从站的结果。

矩阵构建后