首先,我的主要问题是看到 Visual Studio 2017 和 VSTS(Azure Dev Ops)构建管道任务“Visual Studios Test”之间的不同代码覆盖率输出。
在分析 Visual Studio 中的代码覆盖率时,我使用的是 2017,对于我的解决方案的测试,它似乎在过程中创建了一个临时的运行设置配置文件,并在调用 vstest.console.exe 进程时使用它。
Visual Studios 正在做的是分析我们的解决方案并创建特定的配置,以过滤掉包含在我们生成的代码覆盖率报告中的依赖 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
现在说我创建一个空白运行设置并在视觉工作室中再次测试代码覆盖率。
我的运行设置。
<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 测试。