使用 Visual Studio 测试任务并行运行测试

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

运行测试来验证代码更改是保持质量的关键。 若要使持续集成实践成功,必须具备一个良好的测试套件,该套件随每个生成一起运行。 但是,随着代码库的增长,回归测试套件往往也会增长,并且运行完整的回归测试可能需要很长时间。 有时,测试本身可能长时间运行 - 通常,如果编写端到端测试,则情况通常如此。 这降低了客户价值在管道无法足够快地处理生成时交付的速度。

并行运行测试是提高 CI/CD 管道效率的好方法。 这可以通过采用云提供的附加容量轻松完成。 本文讨论如何使用多个代理配置 Visual Studio 测试任务 以并行运行测试。

先决条件

熟悉 代理作业的概念。 若要并行运行多个作业,必须配置多个代理。 还需要足够的并行作业

测试切片

Visual Studio 测试任务(版本 2)旨在与并行作业设置无缝配合工作。 当包含 Visual Studio 测试任务的管道作业(称为“VSTest 任务”)配置为并行在多个代理上运行时,它会自动检测涉及多个代理,并创建可在这些代理中并行运行的测试切片。

可以将任务配置为创建测试切片以满足不同的要求,例如,根据测试和代理的数量、以前的测试运行时间或程序集中的测试位置进行批处理。

批处理选项

以下各节将介绍这些选项。

基于测试和代理数的简单切片

此设置使用简单的切片算法将测试数“T”划分为“N”代理,以便每个代理运行 T/N 测试。 例如,如果测试套件包含 1000 个测试,并且对并行作业使用两个代理,则每个代理将运行 500 个测试。 或者,可以使用 8 个代理进一步减少运行测试所需的时间,在这种情况下,每个代理并行运行 125 个测试。

当所有测试都有类似的运行时间时,通常使用此选项。 如果测试运行时间不相似,则可能无法有效地利用代理,因为某些代理可能会接收具有多个长时间运行的测试的切片,而其他代理可能会接收具有短运行测试的切片,并且比其余代理早得多。

基于过去运行的测试时间进行切片

此设置考虑过去的运行时间来创建测试切片,以便每个切片的运行时间大致相同。 短运行的测试将一起批处理,而长时间运行的测试将分配给单独的切片。

当程序集中的测试没有依赖项,并且不需要在同一代理上运行时,应使用此选项。 此选项会导致代理的利用率最高,因为每个代理获取的“工作”量相同,并且所有代理的完成时间大致相同。

基于测试程序集进行切片

此设置使用简单的切片算法,该算法将测试程序集(或文件)数划分为“N”代理的“A”,以便每个代理从 A/N 程序集运行测试。 使用此选项时,不会考虑程序集中的测试数。 例如,如果测试套件包含 10 个测试程序集,并且对并行作业使用两个代理,则每个代理将接收 5 个要运行的测试程序集。 可以使用五个代理进一步减少运行测试所需的时间,在这种情况下,每个代理都会获得两个要运行的测试程序集。

当程序集中的测试具有依赖项或利用AssemblyInitialize以及AssemblyCleanupClassInitializeClassCleanup方法来管理测试代码中的状态时,应使用此选项。

在经典生成管道中并行运行测试

如果有要在经典生成管道中运行的大型测试套件或长时间运行的集成测试,请使用以下步骤。

注释

若要将生成管道中的多代理功能用于本地 TFS 服务器,必须使用 TFS 2018 Update 2 或更高版本。

  1. 使用单个代理生成作业。 使用下图所示的任务生成 Visual Studio 项目并发布生成项目。 这使用默认作业设置(单个代理,无并行作业)。

    buildJobSingleAgent

  2. 使用多个代理并行运行测试

    • 添加 代理作业

      AddAgentJobBuild

    • 将作业配置为并行使用 多个代理。 此处的示例使用三个代理。

      ParallelTestJobBuild

      小窍门

      对于大规模并行测试,可以指定多达 99 个代理。

    • “下载生成项目 ”任务添加到作业。 此步骤是生成作业和测试作业之间的链接,必须确保生成作业中生成的二进制文件在测试作业使用的代理上可用,以便运行测试。 确保任务设置为下载“当前生成”生成的项目,项目名称与生成作业的 “发布生成项目” 任务中使用的项目名称相同。

      DownloadBuildArtifacts

    • 添加 Visual Studio 测试 任务并将其配置为使用所需的 切片策略

在 YAML 管道中设置用于并行测试的作业

指定 parallel 策略 job ,并指示应调度多少个作业。 可以指定多达 99 个代理来纵向扩展大型测试套件的测试。

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

有关详细信息,请参阅 YAML 架构 - 作业

在经典发布管道中并行运行测试

如果部署应用程序后运行大型测试套件或长时间运行的功能测试,请使用以下步骤。 例如,你可能想要部署 Web 应用程序并在浏览器中运行 Selenium 测试,以验证应用功能。

注释

若要将发布管道中的多代理功能用于本地 TFS 服务器,必须使用 TFS 2017 Update 1 或更高版本。

  1. 使用单个代理部署应用。 使用 Azure 部署:创建或更新资源组或 Azure 应用服务部署任务,将 Web 应用部署到 Azure 应用服务。 这使用默认作业设置(单个代理,无并行作业)。

    DeployApp1Agent

  2. 使用多个代理并行运行测试

    • 添加 代理作业

      AddAgentJobRM

    • 将作业配置为并行使用 多个代理。 此处的示例使用三个代理。

      ParallelTestJobRM

      小窍门

      对于大规模并行测试,可以指定多达 99 个代理。

    • 添加在运行 Visual Studio 测试任务之前必须运行 的任何其他任务 。 例如,运行 PowerShell 脚本来设置测试所需的任何数据。

      小窍门

      默认情况下,发布管道中的作业下载链接到发布管道的所有项目。 为了节省时间,可以将作业配置为仅下载作业所需的测试项目。 例如,如果应用和测试项目由生成管道单独发布,则无需 Web 应用二进制文件即可运行 Selenium 测试并下载它们。

    • 添加 Visual Studio 测试 任务并将其配置为使用所需的 切片策略

      小窍门

      如果测试计算机未安装 Visual Studio,可以使用 Visual Studio 测试平台安装程序任务 来获取测试平台的所需版本。

通过将并行管道作业与并行测试执行相结合进行大规模并行测试

在管道中使用并行作业时,它会使用多个计算机(代理)并行运行每个作业。 测试框架和运行程序还提供在单个计算机上并行运行测试的功能,通常通过创建多个并行运行的进程或线程。 并行功能可以分层方式组合,以实现大规模并行测试。 在 Visual Studio 测试任务的上下文中,可通过以下方式组合并行度:

  1. 测试框架提供的并行度。 MSTest v2、NUnit、xUnit 等所有新式测试框架都提供并行运行测试的功能。 通常,程序集中的测试并行运行。 这些测试框架使用测试适配器和测试框架与 Visual Studio 测试平台接口,以及相应的适配器,并在运行测试时 Visual Studio 测试平台创建的测试主机进程中工作。 因此,此层的并行化在所有框架和适配器的进程中。

  2. Visual Studio 测试平台(vstest.console.exe)提供的并行度。 Visual Studio 测试平台可以并行运行测试程序集。 vstest.console.exe 的用户将将其识别为 /parallel 开关。 它通过在每个可用核心上启动测试主机进程,并在要执行的程序集中对其进行测试来执行此作。 这适用于任何具有 Visual Studio 测试平台测试适配器的框架,因为并行化单元是测试程序集或测试文件。 当与测试框架提供的并行度(如上所述)结合使用时,当测试在管道中的单个代理上运行时,可提供最大并行度。

  3. Visual Studio 测试 (VSTest) 任务提供的并行度。 VSTest 任务支持跨多个代理(或计算机)并行运行测试。 将创建测试切片,每个代理一次执行一个切片。 当与测试平台和测试框架提供的并行度(如上所述)结合使用时,这三种不同的 切片策略将产生以下结果:

    • 根据测试和代理数进行切片。 简单切片,其中测试分组在大小相等的切片中。 切片包含来自一个或多个程序集的测试。 然后,在代理上测试执行符合上述 12 中所述的并行度。

    • 根据过去的运行时间进行切片。 根据以前运行测试的时间以及可用代理的数量,测试将分组到切片中,以便每个切片需要大致相同的执行时间。 切片包含来自一个或多个程序集的测试。 然后,在代理上测试执行符合上述 12 中所述的并行度。

    • 基于程序集进行切片。 切片是一个测试程序集,因此包含所有属于同一程序集的测试。 然后,对代理执行符合上述 12 中所述的并行度。 但是,如果代理只接收一个要运行的程序集,则可能不会发生 2

帮助和支持