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

时间:2014-07-20 00:51:02

标签: android jenkins continuous-integration robotium android-gradle

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

我知道在多个设备/模拟器上并行运行完整测试套件的各种方法,例如:请参阅Jenkins Android模拟器插件的Multi-configuration (matrix) job部分SpoonAppThwack等云测试公司。

我知道如何通过使用JUnit注释来运行我的测试的特定子集,或者显然Spoon支持类似的功能(参见my question about it)。

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

我认为我可以通过将测试分成两个独立的CI工作来实现这一目标,但是维护两个单独的工作并将结果结合起来听起来很痛苦。

4 个答案:

答案 0 :(得分:6)

更新:我添加了another answer,我认为它提供了更清晰,更简洁的Jenkins配置,并且更直接基于Spoon。


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

以下是使用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目前无法在Gradle v1.0.0上运行,根据fork插件issue #6
  • 如果你想要一个Fork正则表达式匹配多个不同的包,你需要用逗号分隔你的正则表达式。这在Fork项目中没有很好地记录,但是their TestClassFilter source向您展示了它们如何解释正则表达式。
  • 任何抽象测试类都需要命名为Abstract*,否则Fork会尝试将它们作为测试运行,从而产生烦人的失败。他们的TestClassScanner会对此进行控制,issue #5会跟踪这一点。
  • IIRC,您需要为“聚合下游测试结果”选项安装Fingerprint Plugin才能运行。如果你没有安装它,你会看到这个错误:“在这个版本上没有启用指纹识别。测试聚合需要指纹识别。”

<强>限制

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

<强>期货

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

答案 1 :(得分:4)

您可以分3个步骤执行此操作:

  1. 创建指向单个目标计算机的2个节点(满足您在同一台计算机上运行测试的条件)。
  2. 在执行期间的Job中使用Jenkins env变量$ NODE_NAME并为每个节点分配不同的测试集(您可能需要NodeLabel Parameter Plugin)。
  3. 执行后,您将拥有2个报告文件,幸运的是在同一台计算机上。如果它们是文本文件,您可以将它们合并为一个,或者创建类似于PerfPublisher插件格式的xml,它可以为您提供详细的报告。
  4. 这意味着您可以使用单个作业在同一台计算机(指向它的2个节点)上实际执行2组测试。获得单一报告会很棘手但如果我知道我可以帮助的格式。

    希望这很有用

答案 2 :(得分:0)

这个答案是我previous MultiJob answer的改进。


我发现这样做的最好方法是使用Jenkins Matrix作业(a.k.a。“多配置项目”)。这非常方便,因为您可以在单个Jenkins作业中配置所有内容。

Spoon现在支持--e选项,允许您将参数直接传递给instrumentation runner。我已使用section on Test Sharding更新了自述文件。

README应该为您提供所需的内容,但以下是Jenkins作业配置中的其他重点,如果有帮助的话。

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

matrix_configuration

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

matrix_build

构建后的步骤不应与现有步骤有任何不同。将来我们可能需要添加一些内容来将结果收集到主节点上(这一点令人惊讶地难以弄清楚)。现在,你仍然可以点击奴隶上的结果。

matrix_post_build

答案 3 :(得分:-2)

您可以使用例如Jenkins MultiJob插件和Testdroid API将您的APK发送到真实设备。这可能是最简单的方法。参考指南here