Testy można traktować jako narzędzia do wykonania pewnych operacji podczas developingu systemu. Przykładem mogą być testy, które mają za zadanie wykonanie dropa bazy, postawienie schematu na nowo, czy wypełnienie jej testowymi danymi. Z oczywistych powodów, takie testy nie powinny działać podczas uruchamiania wszystkich testów automatycznych. Powinny zostać pominięte. Zobaczmy jak to zrobić:

Do solucji TestingPatterns dodałem nowy katalog Skip oraz plik SkipFeature.cs, w którym znajdzie się przykładowy kod.

Rys. 1. Struktura projektu

W xUnit test, można pominąć stosując dopisek Skip przy atrybucie [Fact], możemy opcjonalnie dodać informację, dlaczego ten test jest pomijany. Zobaczmy przykład:

W pliku SkipFeature.cs napiszmy prostą klasę z jednym testem, który zostanie pominięty. Sam test nas nie interesuje więc będzie bardzo prosty:

  public class SkipFeature
    {
        [Fact(Skip = "bo tak")]
        public void TestA()
        {
            var result = 1 + 2;

            Assert.Equal(3, result);
        }
    }

Po uruchomieniu testów w Test Explorer zobaczymy następujący rezultat:

Rys. 2. Pominięty test w Test Explorer.

Test został zignorowany. Natomiast nie został wyświetlony powód jego pominięcia. Możliwe, że istnieje opcja umożliwiająca wyświetlenie tego komunikatu, jednak ja jej nie znam. Używając narzędzia ReSharper Test Runner ten problem znika, powód pominięcia testu jest wyświetlany.

Rys. 3. Pominięty test w ReSharper test runner.

Niestety Skip w frameworku xUnit ma pewną wadę. Nie jesteśmy w stanie uruchomić tego testu ręcznie dopóki nie usuniemy dopisku w atrybucie [Fact]. Przez co używanie testów jako narzędzi staje się uciążliwe. Zobaczmy jak wygląda to w innych frameworkach:

MSTest

W przypadku frameworka MSTest sytuacja jest praktycznie taka sama jak w xUnit. Aby pominąć test wystarczy dodać atrybut [Ignore]

[TestClass]
public class TestSet
{
    [TestMethod, Ignore]
    public void TestA()
    {
        var result = 1 + 2;

        result.Should().Be(3);
    }
}

Także nie jesteśmy w stanie włączyć testu ręcznie bez usuwania atrybutu.

NUnit

Aby pominąć test w NUnit należy dodać atrybut [Explicit]. Zobaczmy przykład:

 [TestFixture]
    public class TestSet
    {
        [SetUp]
        public void BeforeTest()
        {
        }

        [TearDown]
        public void AfterTest()
        {
        }
        
        [Test]
        [Explicit]
        public void TestA()
        {
            var result = 1 + 2;

            result.Should().Be(3);
        }
    }

Można także połączyć te atrybuty w następujący sposób: [Test, Explicit]
Po uruchomieniu testów zobaczymy następujący rezultat:

Rys. 4. Uruchomione testy.

Możemy teraz uruchomić test na żądanie. Wystarczy kliknąć na nim prawym przyciskiem myszy i wybrać z menu kontekstowego Run Unit Tests.
Zobaczymy wtedy następujący rezultat:

Rys. 5. Test został uruchomiony

Oczywiście możemy uruchomić test z poziomu kodu klikając ikonę obok nazwy testu i z menu kontekstowego wybieramy Run

Rys. 6. Uruchomienie testu z poziomu kodu.

Podsumowanie:
Dla testów traktowanych jako narzędzie dla programisty najlepiej spisuje się NUnit. Polecam go stosować do tego celu. Nie oznacza to, że NUnit powinien być głównym frameworkiem do testów. Możemy w projekcie korzystać z kilku frameworków.