首先,我的主要问题是在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测试。