Как игнорировать модульный тест при анализе покрытия dotCover?

Рассмотрим следующий пример воспроизведения (код модульного теста MS Test):

using System.Diagnostics.CodeAnalysis;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            SharedMethod();
        }

        [TestMethod, ExcludeFromCodeCoverage]
        public void TestMethod2()
        {
            SharedMethod();
            // This is a performance test which will fail during coverage analysis.
            Assert.Fail();
        }

        private void SharedMethod()
        {
            // Should be green
            if (true) ; // NOOP
        }
    }
}

TestMethod2 — это метод тестирования производительности, который будет успешным во время «обычного» модульного тестирования, но не удастся во время анализа покрытия кода (из-за дополнительных накладных расходов). Это нормально. Я просто хочу, чтобы этот метод игнорировался во время анализа покрытия кода, чтобы мой SharedMethod отображался как «зеленый» (потому что он успешно покрыт TestMethod1.

Согласно JetBrains, фильтры покрытия должны сделайте это, и да, для ExcludeFromCodeCoverageAttribute будет активен фильтр:

скриншот фильтров покрытия

Однако запуск Extensions/ReSharper/Unit Tests/"Cover All Tests From Solution" по-прежнему учитывает мой исключенный тест при раскрашивании моего кода:

скриншот результата теста покрытия

Что я сделал не так? И как (легко) исключить тесты производительности из анализа покрытия кода?


person Heinzi    schedule 31.03.2020    source источник
comment
Согласно Настройка фильтров покрытия, существует два типа фильтров: время выполнения и покрытие. Кажется, ты применил только первый   -  person Pavel Anikhouski    schedule 31.03.2020
comment
@PavelAnikhouski: Хорошая находка, но это не так: TestMethod2 уже не отображается в окне покрытия (вероятно, потому что существует фильтр времени выполнения), поэтому я не могу добавить для него фильтр покрытия.   -  person Heinzi    schedule 31.03.2020


Ответы (1)


(Это самостоятельный ответ, основанный на найденном мной обходном пути. Не стесняйтесь добавлять свой собственный ответ, если вы нашли реальное решение этой проблемы.)

По-видимому, фильтры покрытия dotCover влияют только на статистику покрытия, отображаемую в окне Unit Test Coverage (% покрытого кода), а не на «окраску кода».

В качестве обходного пути вы можете обычно исключить тесты определенных категорий из средства выполнения тестов ReSharper. Для этого вы сначала добавляете категорию ко всем тестам, которые хотите игнорировать:

[TestMethod, ExcludeFromCodeCoverage, TestCategory("Performance")]
public void TestMethod2()
{
    SharedMethod();
    // This is a performance test which will fail during coverage analysis.
    Assert.Fail();
}

а затем вы добавляете эту категорию в Extensions/ReSharper/Options/Tools/Unit Testing/General/"Пропустить тесты из категорий":

скриншот

Ваш тест по-прежнему будет выполняться при запуске с помощью обычного средства запуска тестов Visual Studio (например, Test/Run All Tests), но ReSharper и его инструменты будут игнорировать его.

person Heinzi    schedule 31.03.2020