Testy jednostkowe na żywo — często zadawane pytania

Obsługiwane struktury

Jakie struktury testowe obsługują testy jednostkowe na żywo i jakie są minimalne obsługiwane wersje?

Funkcja Live Unit Testing współpracuje z trzema popularnymi strukturami testowania jednostkowego wymienionymi w poniższej tabeli. Minimalna obsługiwana wersja ich adapterów i struktur znajduje się również w tabeli. Wszystkie struktury testowania jednostkowego są dostępne w NuGet.org.

Struktura testowa Minimalna wersja adaptera programu Visual Studio Minimalna wersja platformy
xUnit.net xunit.runner.visualstudio w wersji 2.2.0-beta3-build1187 xunit 1.9.2
NUnit NUnit3TestAdapter w wersji 3.7.0 NUnit w wersji 3.5.0
MSTest MSTest.TestAdapter 1.1.4-preview MSTest.TestFramework 1.0.5-preview

Jeśli masz starsze projekty testowe oparte na narzędziu Microsoft.VisualStudio.QualityTools.UnitTestFramework MSTest i nie chcesz przechodzić do nowszych pakietów NUGet MSTest, przeprowadź uaktualnienie do programu Visual Studio 2019 lub Visual Studio 2017.

Obsługa platformy .NET Core

Czy testy jednostkowe na żywo działają z platformą .NET Core?

Tak. Testy jednostkowe na żywo współdziałają z platformą .NET Core i programem .NET Framework.

Konfigurowanie

Dlaczego funkcja Live Unit Testing nie działa po włączeniu?

Okno Dane wyjściowe (po wybraniu listy rozwijanej Live Unit Testing) powinno poinformować, dlaczego testowanie jednostkowe na żywo nie działa. Testy jednostkowe na żywo mogą nie działać z jednego z następujących powodów:

  • Jeśli pakiety NuGet, do których odwołują się projekty w rozwiązaniu, nie zostały przywrócone, testy jednostkowe na żywo nie będą działać. Wykonanie jawnej kompilacji rozwiązania lub przywrócenie pakietów NuGet w rozwiązaniu przed włączeniem funkcji Live Unit Testing powinno rozwiązać ten problem.

  • Jeśli używasz testów opartych na msTest w projektach, upewnij się, że usunięto odwołanie do Microsoft.VisualStudio.QualityTools.UnitTestFrameworkelementu i dodano odwołania do najnowszych pakietów MSTest.TestAdapter NUGet MSTest (wymagana jest minimalna wersja 1.1.11) i MSTest.TestFramework (wymagana jest minimalna wersja 1.1.11). Aby uzyskać więcej informacji, zobacz sekcję "Obsługiwane struktury testowe" w artykule Use Live Unit Testing in Visual Studio (Używanie testów jednostkowych na żywo w programie Visual Studio ).

  • Co najmniej jeden projekt w rozwiązaniu powinien mieć odwołanie NuGet lub bezpośrednie odwołanie do platformy testowej xUnit, NUnit lub MSTest. Ten projekt powinien również odwoływać się do odpowiedniego pakietu NuGet kart testowych programu Visual Studio.

Dlaczego mój projekt nie jest kompilowania?

Błędy kompilacji są zgłaszane w oknie Dane wyjściowe po wybraniu listy rozwijanej Live Unit Testing. Istnieje kilka typowych problemów spowodowanych nieprawidłową konfiguracją w kreatorze instalacji, które mogą powodować problemy z kompilacją w testach jednostkowych na żywo.

  • Jeśli właściwość Główny obszaru roboczego jest zbyt długa, możliwe, że kompilacja zakończy się niepowodzeniem z powodu wyjątków wskazujących, że ścieżka jest zbyt długa.

  • Jeśli właściwość Katalog główny repozytorium nie wskazuje na katalog główny repozytorium, obszar roboczy zostanie wypełniony niewłaściwym zestawem plików.

  • W przypadku repozytoriów git właściwość Exclude files zwykle unika kopiowania plików określonych w pliku gitignore . Można jednak zaewidencjonować pliki w repozytorium Git, które jest ignorowane, lub można uruchamiać narzędzia, które automatycznie generują pliki, ale nie są generowane podczas kompilacji. W takich przypadkach należy wybrać opcję "<Niestandardowy>" i niestandardowy zestaw reguł, które wyświetlają tylko foldery artefaktów, powinny być wyświetlane.

Oprócz opisanych wcześniej problemów następujące konfiguracje projektu, które mogą nie zostać poprawnie skompilowane.

  • Jeśli zależności projektu są określane jako globalna konfiguracja rozwiązania, a nie tak ProjectReferences jak dla każdego projektu, testowanie jednostkowe na żywo może zakończyć się tworzeniem niepoprawnego zestawu projektów. Aby rozwiązać ten problem, dodaj jawne odwołania między projektami.

  • Dopóki nie zostanie wybrana lista odtwarzania funkcji Live Unit Testing, testy jednostkowe na żywo nie będą kompilować żadnych projektów. Aby rozwiązać ten problem, uwzględnij niektóre testy na liście odtwarzania Live Unit Testing.

  • Jeśli używasz testów opartych na msTest w projektach, upewnij się, że usunięto odwołanie do Microsoft.VisualStudio.QualityTools.UnitTestFrameworkelementu i dodano odwołania do najnowszych pakietów MSTest.TestAdapter NUGet MSTest (wymagana jest minimalna wersja 1.1.11) i MSTest.TestFramework (wymagana jest minimalna wersja 1.1.11). Aby uzyskać więcej informacji, zobacz Obsługiwane platformy testowe.

  • Co najmniej jeden projekt w rozwiązaniu powinien mieć odwołanie NuGet lub bezpośrednie odwołanie do platformy testowej xUnit, NUnit lub MSTest. Ten projekt powinien również odwoływać się do odpowiedniego pakietu NuGet kart testowych programu Visual Studio. Adapter testowy programu Visual Studio można również odwoływać się za pośrednictwem pliku .runsettings . Plik .runsettings musi mieć wpis podobny do następującego przykładu:

<RunSettings>
    <RunConfiguration>
          <TestAdaptersPaths>path-to-your-test-adapter</TestAdaptersPaths>
    </RunConfiguration>
</RunSettings>

Dlaczego nie można uruchomić moich testów?

  • Typowym problemem jest to, że nie wszystkie pliki są kopiowane do folderu testowego. Może być konieczne dodanie niektórych elementów zależności testu jednostkowego na żywo do plików csproj.

  • Innym problemem są przekroczenia limitu czasu. Ponieważ funkcja Live Unit Testing uruchamia testy na czas nieokreślony, automatycznie przerywa przebieg, jeśli testy są uruchamiane zbyt długo. Możesz zwiększyć limit czasu w Kreatorze projektu.

Niepoprawne pokrycie po uaktualnieniu

Dlaczego testy jednostkowe na żywo pokazują niepoprawne pokrycie po uaktualnieniu karty testowej, do której odwołujesz się w projektach programu Visual Studio do obsługiwanej wersji?

  • Jeśli wiele projektów w rozwiązaniu odwołuje się do pakietu adaptera testowego NuGet, każdy z nich musi zostać uaktualniony do obsługiwanej wersji.

  • Upewnij się, że plik MSBuild .props zaimportowany z pakietu adaptera testowego również został poprawnie zaktualizowany. Sprawdź wersję/ścieżkę pakietu NuGet importu, którą zwykle można znaleźć w górnej części pliku projektu, tak jak poniżej:

      <Import Project="..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props')" />
    

Dostosowywanie kompilacji

Czy mogę dostosować kompilacje testów jednostkowych na żywo?

Jeśli twoje rozwiązanie wymaga niestandardowych kroków do skompilowania instrumentacji (Live Unit Testing), które nie są wymagane w przypadku "regularnej" kompilacji nie instrumentowanej, możesz dodać kod do projektu lub plików docelowych , które sprawdzają BuildingForLiveUnitTesting właściwość i wykonują niestandardowe kroki kompilacji wstępnej/po kompilacji. Możesz również usunąć pewne kroki kompilacji (takie jak publikowanie lub generowanie pakietów) lub dodać kroki kompilacji (takie jak kopiowanie wymagań wstępnych) do kompilacji Live Unit Testing na podstawie tej właściwości projektu. Dostosowywanie kompilacji na podstawie tej właściwości nie zmienia regularnej kompilacji w żaden sposób i ma wpływ tylko na kompilacje testów jednostkowych na żywo.

Na przykład może istnieć element docelowy, który generuje pakiety NuGet podczas regularnej kompilacji. Prawdopodobnie nie chcesz, aby pakiety NuGet są generowane po każdej dokonaniu edycji. Możesz więc wyłączyć ten element docelowy w kompilacji Live Unit Testing, wykonując czynności podobne do następujących:

<Target Name="GenerateNuGetPackages" BeforeTargets="AfterBuild" Condition="'$(BuildingForLiveUnitTesting)' != 'true'">
    <Exec Command='"$(MSBuildThisFileDirectory)..\tools\GenPac" '/>
</Target>

Eksplorator testów a testy jednostkowe na żywo

Jak uruchamiać testy w oknie Eksploratora testów różni się od uruchamiania testów w testach jednostkowych na żywo?

Istnieje kilka różnic:

  • Uruchamianie lub debugowanie testów z okna Eksploratora testów uruchamia regularne pliki binarne, podczas gdy testy jednostkowe na żywo uruchamiają instrumentowane pliki binarne. Jeśli chcesz debugować instrumentowane pliki binarne, dodanie wywołania metody Debugger.Launch w metodzie testowej powoduje uruchomienie debugera za każdym razem, gdy ta metoda jest wykonywana (w tym podczas wykonywania przez funkcję Live Unit Testing), a następnie dołączyć i debugować instrumentowany plik binarny. Mamy jednak nadzieję, że instrumentacja jest niewidoczna dla większości scenariuszy użytkownika i że nie trzeba debugować instrumentowanych plików binarnych.

  • Testy jednostkowe na żywo nie tworzą nowej domeny aplikacji do uruchamiania testów, ale testy są uruchamiane w oknie Eksplorator testów, aby utworzyć nową domenę aplikacji.

  • Testy jednostkowe na żywo uruchamiają testy w każdym zestawie testowym sekwencyjnie. W Eksploratorze testów możesz uruchomić wiele testów równolegle.

  • Eksplorator testów domyślnie uruchamia testy w jednym wątkowym mieszkaniu (STA), natomiast funkcja Live Unit Testing uruchamia testy w mieszkaniu wielowątkowy (MTA). Aby uruchomić testy MSTest w sta w funkcji Live Unit Testing, udekoruj metodę testową lub zawierającą klasę za pomocą atrybutu <STATestMethod> lub <STATestClass> , który można znaleźć w MSTest.STAExtensions 1.0.3-beta pakiecie NuGet. W przypadku elementu NUnit dekoruj metodę testową za pomocą atrybutu <RequiresThread(ApartmentState.STA)> i dla elementu xUnit za pomocą atrybutu <STAFact> .

Wykluczanie testów

Jak mogę wykluczyć testy z udziału w testach jednostkowych na żywo?

Zobacz sekcję "Dołączanie i wykluczanie projektów testowych i metod testowych" artykułu Use Live Unit Testing in Visual Studio (Używanie testów jednostkowych na żywo w programie Visual Studio ) dla ustawienia specyficznego dla użytkownika. Dołączanie lub wykluczanie testów jest przydatne, gdy chcesz uruchomić określony zestaw testów dla określonej sesji edycji lub zachować własne preferencje osobiste.

W przypadku ustawień specyficznych dla rozwiązania można programowo zastosować System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute atrybut, aby wykluczyć metody, właściwości, klasy lub struktury z instrumentowania przez testy jednostkowe na żywo. Ponadto można również ustawić <ExcludeFromCodeCoverage> właściwość na true wartość w pliku projektu, aby wykluczyć cały projekt z instrumentowania. Testy jednostkowe na żywo będą nadal uruchamiać testy, które nie zostały instrumentowane, ale ich pokrycie nie zostanie zwizualizowane.

Możesz również sprawdzić, czy Microsoft.CodeAnalysis.LiveUnitTesting.Runtime jest ładowany w bieżącej domenie aplikacji, i wyłączyć testy w oparciu o przyczynę. Możesz na przykład wykonać następujące czynności za pomocą narzędzia xUnit:

[ExcludeFromCodeCoverage]
public class SkipLiveFactAttribute : FactAttribute
{
   private static bool s_lutRuntimeLoaded = AppDomain.CurrentDomain.GetAssemblies().Any(a => a.GetName().Name ==
                                            "Microsoft.CodeAnalysis.LiveUnitTesting.Runtime");
   public override string Skip => s_lutRuntimeLoaded ? "Test excluded from Live Unit Testing" : "";
}

public class Class1
{
   [SkipLiveFact]
   public void F()
   {
      Assert.True(true);
   }
}

Kompilacje ciągłe

Dlaczego testy jednostkowe na żywo cały czas wciąż kompiluje moje rozwiązanie, nawet jeśli nie wprowadzam żadnych zmian?

Rozwiązanie może kompilować się nawet wtedy, gdy nie wprowadzasz zmian, jeśli proces kompilacji generuje kod źródłowy, który jest częścią samego rozwiązania, a pliki docelowe kompilacji nie mają określonych odpowiednich danych wejściowych i wyjściowych. Obiekty docelowe powinny mieć listę danych wejściowych i wyjściowych, aby program MSBuild mógł wykonać odpowiednie aktualne testy i określić, czy jest wymagana nowa kompilacja.

Funkcja Live Unit Testing uruchamia kompilację za każdym razem, gdy wykryje, że pliki źródłowe uległy zmianie. Ponieważ kompilacja rozwiązania generuje pliki źródłowe, funkcja Live Unit Testing przechodzi do nieskończonej pętli kompilacji. Jeśli jednak dane wejściowe i wyjściowe obiektu docelowego są sprawdzane, gdy funkcja Live Unit Testing uruchamia drugą kompilację (po wykryciu nowo wygenerowanych plików źródłowych z poprzedniej kompilacji), przerywa pętlę kompilacji, ponieważ dane wejściowe i wyjściowe sprawdzają, czy wszystko jest aktualne.

Ikony edytora

Dlaczego nie widzę żadnych ikon w edytorze, mimo że testy jednostkowe na żywo wydają się uruchamiać testy na podstawie komunikatów w oknie Dane wyjściowe?

Ikony w edytorze mogą nie być widoczne, jeśli zestawy, na których działa funkcja Live Unit Testing, nie są instrumentowane z jakiegokolwiek powodu. Na przykład funkcja Live Unit Testing nie jest zgodna z projektami ustawionymi przez program <UseHostCompilerIfAvailable>false</UseHostCompilerIfAvailable>. W takim przypadku proces kompilacji musi zostać zaktualizowany, aby usunąć to ustawienie lub zmienić je na true , aby testy jednostkowe na żywo działały. 

Przechwytywanie dzienników

Jak mogę zbierać bardziej szczegółowe dzienniki w celu tworzenia raportów o błędach?

Możesz wykonać kilka czynności, aby zebrać bardziej szczegółowe dzienniki:

  • Przejdź do pozycji Narzędzia>Opcje>testów jednostkowych na żywo i zmień opcję rejestrowania na Pełne. Pełne rejestrowanie powoduje wyświetlanie bardziej szczegółowych dzienników w oknie Dane wyjściowe .

  • Ustaw zmienną LiveUnitTesting_BuildLog środowiskową użytkownika na nazwę pliku, którego chcesz użyć do przechwycenia dziennika MSBuild. Szczegółowe komunikaty dziennika programu MSBuild z kompilacji Live Unit Testing można następnie pobrać z tego pliku.

  • Ustaw zmienną LiveUnitTesting_TestPlatformLog środowiskową użytkownika, aby 1 przechwycić dziennik platformy testowej. Szczegółowe komunikaty dziennika platformy testowej z przebiegów testów jednostkowych na żywo można następnie pobrać z programu [Solution Root]\.vs\[Solution Name]\log\[VisualStudio Process ID].

  • Utwórz zmienną środowiskową na poziomie użytkownika o nazwie VS_UTE_DIAGNOSTICS i ustaw ją na 1 (lub dowolną wartość) i uruchom ponownie program Visual Studio. Teraz na karcie Dane wyjściowe — testy w programie Visual Studio powinno zostać wyświetlonych wiele dzienników.

Folder obszaru roboczego

Czy mogę edytować pliki w folderze obszaru roboczego?

Nie, nie należy otwierać ani edytować plików w katalogach kompilacji i testowania folderu obszaru roboczego. Testy jednostkowe na żywo powinny zarządzać wszystkimi plikami w folderze src, aby zachować synchronizację między katalogiem głównym repozytorium a katalogiem głównym obszaru roboczego.

Dyski deweloperskie

Czy testy jednostkowe na żywo obsługują dysk deweloperski dla domyślnego katalogu głównego obszaru roboczego?

Tak, ale upewnij się, że jest włączona. Jeśli używasz dysku deweloperskiego, upewnij się, że filtr przewidywanego systemu plików (ProjFS) jest włączony. Na przykład następujące polecenie włącza program ProjFS i usługę Windows Defender:

fsutil devdrv setfiltersallowed PrjFlt, WdFilter