Как правильно ограничить покрываемый код, как сообщает OpenCover? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть скрипт-оболочка для OpenCover, который запускает его с помощью NUnit. Сценарий дается:

  1. тестовая dll.
  2. NUnit, где фильтр.
  3. список сборок для ограничения покрытия (преобразован в фильтр OpenCover).

Я пытаюсь понять, как работает ограничение покрытия, и поэтому я дважды запускаю сценарий с тем же тестовым dll и NUnit, где filter, но с другим списком сборок.

Прогон № 1 - ограничение несколькими сборками, взятыми из данного файла решения

C:\Xyz\tip> Start-TestsWithCoverage .\UI\HcmAnywhereUnitTests\bin\Debug\HcmAnywhereUnitTests.dll -Where "namespace==HcmAnywhereUnitTests.Api" -SlnFile .\HcmAnywhere.sln
Using filter +[T4Utils]* +[TestContract]* +[DfVersioning]* +[XyzApi]* +[Xyz.Web.HcmAnywhereCommon]* +[OData]*
Executing: C:\Users\mkharitonov\AppData\Local\PackageManagement\NuGet\Packages\NUnit.ConsoleRunner.3.10.0\tools\nunit3-console.exe
Runtime Environment
   OS Version: Microsoft Windows NT 10.0.17763.0
  CLR Version: 4.0.30319.42000

Test Files
    .\UI\HcmAnywhereUnitTests\bin\Debug\HcmAnywhereUnitTests.dll

Test Filters
    Where: namespace==HcmAnywhereUnitTests.Api


Run Settings
    ProcessModel: InProcess
    DomainUsage: Single
    DisposeRunners: True
    WorkDirectory: C:\Xyz\tip
    StopOnError: True
    NumberOfTestWorkers: 1
    ImageRuntimeVersion: 4.0.30319
    ImageTargetFrameworkName: .NETFramework,Version=v4.7.2
    ImageRequiresX86: False
    ImageRequiresDefaultAppDomainAssemblyResolver: False

Test Run Summary
  Overall result: Passed
  Test Count: 132, Passed: 132, Failed: 0, Warnings: 0, Inconclusive: 0, Skipped: 0
  Start time: 2019-06-11 22:57:47Z
    End time: 2019-06-11 22:57:51Z
    Duration: 4.163 seconds

Results (nunit3) saved as ~\AppData\Local\Temp\a24272_20190611185746\HcmAnywhereUnitTests.TestResult.xml
Committing...
Visited Classes 61 of 390 (15.64)
Visited Methods 202 of 2566 (7.87)
Visited Points 1125 of 6187 (18.18)
Visited Branches 523 of 4026 (12.99)

==== Alternative Results (includes all methods including those without corresponding source) ====
Alternative Visited Classes 61 of 548 (11.13)
Alternative Visited Methods 202 of 3166 (6.38)

Name                           Value
----                           -----
CoverageResult                 ~\AppData\Local\Temp\a24272_20190611185746\HcmAnywhereUnitTests.CoverageResult.xml
TestResult                     ~\AppData\Local\Temp\a24272_20190611185746\HcmAnywhereUnitTests.TestResult.xml


C:\Xyz\tip>

Основные характеристики:

  1. Использование фильтра "+[T4Utils]* +[TestContract]* +[DfVersioning]* +[XyzApi]* +[Xyz.Web.HcmAnywhereCommon]* +[OData]*"
  2. NUnit работал в течение 4 секунд
  3. Генерируемое покрытие

Прогон № 2 - ограничение одной сборкой

C:\Xyz\tip> Start-TestsWithCoverage .\UI\HcmAnywhereUnitTests\bin\Debug\HcmAnywhereUnitTests.dll -Where "namespace==HcmAnywhereUnitTests.Api" -AssemblyNames DataSvc
Using filter +[DataSvc]*
Executing: C:\Users\mkharitonov\AppData\Local\PackageManagement\NuGet\Packages\NUnit.ConsoleRunner.3.10.0\tools\nunit3-console.exe
Runtime Environment
   OS Version: Microsoft Windows NT 10.0.17763.0
  CLR Version: 4.0.30319.42000

Test Files
    .\UI\HcmAnywhereUnitTests\bin\Debug\HcmAnywhereUnitTests.dll

Test Filters
    Where: namespace==HcmAnywhereUnitTests.Api


Run Settings
    ProcessModel: InProcess
    DomainUsage: Single
    DisposeRunners: True
    WorkDirectory: C:\Xyz\tip
    StopOnError: True
    NumberOfTestWorkers: 1
    ImageRuntimeVersion: 4.0.30319
    ImageTargetFrameworkName: .NETFramework,Version=v4.7.2
    ImageRequiresX86: False
    ImageRequiresDefaultAppDomainAssemblyResolver: False

Test Run Summary
  Overall result: Passed
  Test Count: 132, Passed: 132, Failed: 0, Warnings: 0, Inconclusive: 0, Skipped: 0
  Start time: 2019-06-11 22:58:56Z
    End time: 2019-06-11 23:00:00Z
    Duration: 63.416 seconds

Results (nunit3) saved as ~\AppData\Local\Temp\a24272_20190611185855\HcmAnywhereUnitTests.TestResult.xml
Committing...
No results, this could be for a number of reasons. The most common reasons are:
    1) missing PDBs for the assemblies that match the filter please review the
    output file and refer to the Usage guide (Usage.rtf) about filters.
    2) the profiler may not be registered correctly, please refer to the Usage
    guide and the -register switch.

Name                           Value
----                           -----
CoverageResult                 ~\AppData\Local\Temp\a24272_20190611185855\HcmAnywhereUnitTests.CoverageResult.xml
TestResult                     ~\AppData\Local\Temp\a24272_20190611185855\HcmAnywhereUnitTests.TestResult.xml


C:\Xyz\tip>

Основные характеристики:

  1. Использование фильтра "+[DataSvc]*"
  2. NUnit работал в течение 63 секунд
  3. Без покрытия

Проверка результатов

C:\Xyz\tip> cat ~\AppData\Local\Temp\a24272_20190611185746\HcmAnywhereUnitTests.CoverageResult.xml | sls "ModulePath.+DataSvc"

      <ModulePath>C:\Xyz\tip\UI\HcmAnywhereUnitTests\bin\Debug\DataSvc.dll</ModulePath>


C:\Xyz\tip> cat ~\AppData\Local\Temp\a24272_20190611185855\HcmAnywhereUnitTests.CoverageResult.xml  | sls "ModulePath.+DataSvc"
C:\Xyz\tip>

Существуют косвенные доказательства того, что DataSvc был профилирован во втором запуске - NUnit потребовалось 63 секунды, чтобы выполнить точно такие же тесты по сравнению с 4 секундами ранее. DataSvc действительно намного больше, чем все сборки в решении, представленном при первом запуске. Так что для меня это имеет смысл.

Но тогда почему нет покрытия? Что не так?

...