在VSTS生成任务“ Visual Studio测试”期间生成Runsettings配置文件

时间:2019-06-12 13:58:43

标签: visual-studio-2017 azure-devops azure-pipelines azure-pipelines-build-task runsettings

首先,我的主要问题是在Visual Studio 2017和VSTS(Azure Dev Ops)构建管道任务“ Visual Studios Test”之间看到不同的代码覆盖输出。

在分析Visual Studio中的代码覆盖率时,我使用的是2017,用于解决方案的测试过程中,它似乎正在动态创建一个临时的运行设置配置文件,并在调用vstest.console.exe进程时使用它。

视觉工作室正在做的是分析我们的解决方案,并创建特定的配置,以过滤依赖项dll,使其不包含在生成的代码覆盖率报告中。因此,在Visual Studio中,如果我在输出窗口中查看测试,就会看到生成的临时运行设置文件。

<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector uri="datacollector://microsoft/unittestisolation/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TraceCollector.UnitTestIsolationDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="UnitTestIsolation">
    <Configuration>
    </Configuration>
  </DataCollector>
  <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector">
    <Configuration>
      <CoverageFileName>Coverage 2019-06-11 14_30_31.coverage</CoverageFileName>
      <CodeCoverage>
        <ModulePaths>
          <Exclude>
            <ModulePath>.*CPPUnitTestFramework.*</ModulePath>
          </Exclude>
          <Include>
            <ModulePath>.*\\<MyNamespace>\.API\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.ACL\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.Services\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.API\.Contracts\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.Services\.Contracts\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.ACL\.Contracts\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.Services\.UnitTests\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.ACL\.UnitTests\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.PaymentSystem\.Util\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.MerchantContracts\.Clover\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.UnitTests\.Data\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.Data\.EF\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.Domain\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.Domain\.UnitTests\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.Core\.NuGetResources\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.MerchantContracts\.Mercury\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.Processor\.exe</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.Processor\.Testing\.exe</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.Processor\.UnitTests\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.MerchantContracts\.Mindbody\.dll</ModulePath>
            <ModulePath>.*\\<MyNamespace>\.API\.UnitTests\.dll</ModulePath>
          </Include>
        </ModulePaths>
    ... etc
</RunSettings>

这会导致以下内容被拖拽,请注意不要尝试将它们与上面的内容进行匹配,这仅是为了让您了解发生的事情。这些都是正确的。

<MyNamespace>.infrastructure.libraries.dll
<MyNamespace>.infrastructure.libraries.domain.dll
<MyNamespace>.infrastructure.libraries.logging.dll
<MyNamespace>.infrastructure.libraries.webapi.dll
<MyNamespace>.acl.dll
<MyNamespace>.acl.unittests.dll
<MyNamespace>.api.contracts.dll
<MyNamespace>.domain.dll
<MyNamespace>.domain.unittests.dll
<MyNamespace>.merchantcontracts.clover.dll
<MyNamespace>.merchantcontracts.mercury.dll
<MyNamespace>.merchantcontracts.mindbody.dll
<MyNamespace>.processor.unittests.dll
<MyNamespace>.services.contracts.dll
<MyNamespace>.services.dll
<MyNamespace>.services.unittests.dll
<MyNamespace>.unittests.data.dll

现在说我创建一个空白的运行设置,然后再次在Visual Studio中测试代码覆盖率。

我的运行设置。

<RunSettings>
<DataCollectionRunSettings>
    <DataCollectors>
        <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
            <Configuration>
                <CodeCoverage>
                </CodeCoverage>
            </Configuration>
        </DataCollector>
    </DataCollectors>
</DataCollectionRunSettings>
</RunSettings>

所生成的代码覆盖率与之前的覆盖率匹配,但是随后我们还获得了包括其他第三方/有害dll的信息。

fluentassertions.core.dll
fluentassertions.dll
moq.dll
nunit3.testadapter.dll

现在,在VSTS中,没有任何运行设置配置的“ Visual Studio测试”任务包括上面列出的其他第三方dll。与Visual Studios 2017不同,它不是在运行时创建运行设置配置以将其过滤掉。取而代之的是,我不得不手动创建一个运行设置配置,并将其包含在我的存储库中,以便在构建管道任务中使用。

这里的主要问题是可维护性。从长远来看,我不想亲自管理此文件,并且每次我添加另一个需要提取的项目时,都必须记住要对其进行更新。我可以使模块路径更通用,以便它根据一部分dll名称提取dll。

<ModulePath>.*\\<MyNamespace>.*\.dll</ModulePath>

这仍然留有出错的余地。对于我来说,当视觉工作室以某种方式在后台自动执行此操作时,我需要手动配置它似乎很愚蠢。

我希望有人会知道如何使用Visual Studio的相同过程在VSTS中生成代码覆盖率,以便它可以使用解决方案中的项目创建运行设置配置,以过滤掉不需要的dll测试。

0 个答案:

没有答案