Konfiguracja zestawu MSTest SDK

W tym artykule opisano zaawansowane opcje konfiguracji dla zestawu MSTest.Sdk. Aby uzyskać podstawową konfigurację i rozpocząć pracę, zobacz Rozpocznij pracę z biblioteką MSTest.

Ważne

Domyślnie MSTest.Sdk używa uruchamiacza MSTest z MTP, włącznie z dotnet test. Wymaga to zmodyfikowania wywołań CI oraz lokalnych wywołań CLI, a także wpływa na dostępne wpisy .runsettings. Stare integracje i narzędzia można zachować, przełączając się na program VSTest.

Biblioteka MSTest.Sdk domyślnie ustawia EnableMSTestRunner i wartość TestingPlatformDotnetTestSupport na true. Aby uzyskać więcej informacji na temat testu dotnet i jego różnych trybów, zobacz Testowanie za pomocą testu dotnet.

Biblioteki pomocnicze do testowania narzędzi

Jeśli project używający zestawu MSTest.Sdk ma być biblioteką pomocnika narzędzia testowego i nie zawiera żadnych testów możliwych do uruchomienia, project powinien mieć <IsTestApplication>false</IsTestApplication>.

Wybierz biegacza

Domyślnie, MSTest SDK korzysta z MTP, ale możesz przełączyć się na VSTest, dodając właściwość <UseVSTest>true</UseVSTest>.

Rozszerzanie protokołu MTP

Środowisko MTP można dostosować za pomocą zestawu rozszerzeń pakietów NuGet. Aby uprościć i ulepszyć to środowisko, zestaw MSTest SDK wprowadza dwie funkcje:

Microsoft. Testing.Profil platformy

Koncepcja profiles umożliwia wybranie domyślnego zestawu konfiguracji i rozszerzeń, które zostaną zastosowane do project testowej.

Profil można ustawić przy użyciu właściwości TestingExtensionsProfile z jednym z następujących trzech profilów:

  • None — Nie włączono rozszerzeń.

  • Default — włącza zalecane rozszerzenia dla tej wersji zestawu MSTest.SDK. Jest to ustawienie domyślne, gdy właściwość nie jest ustawiana jawnie.

    Włącza następujące rozszerzenia:

  • AllMicrosoft - Włącza rozszerzenia firmy Microsoft wybrane do szerokiego, domyślnego użytku, w tym rozszerzenia objęte restrykcyjną licencją. Rozszerzenia eksperymentalne i rozszerzenia dostępne wyłącznie przez interfejs API mogą nadal wymagać jawnego włączenia.

    Włącza wszystkie rozszerzenia z profilu Default oraz następujące rozszerzenia:

    W wersjach 3.11.0–4.2.x pakietu MSTest.Sdk rozszerzenie raportowania Azure DevOps jest dołączone tylko w AllMicrosoft.

Uwaga

Profile odwołują się do pakietów raportów Azure DevOps i raportów GitHub Actions, ale raportowanie pozostaje wyłączone w czasie wykonywania. Przekaż --report-azdo, aby włączyć raportowanie w Azure DevOps. Aby włączyć raportowanie GitHub Actions, uruchom testy na GitHub Actions i przekaż polecenie --report-gh.

Oto pełny przykład użycia profilu None:

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <TestingExtensionsProfile>None</TestingExtensionsProfile>
    </PropertyGroup>

</Project>
Rozszerzenie/profil Żaden Domyślny WszystkieMicrosoft
pokrycie kodu ✔️ ✔️
zrzut awaryjny ✔️
Fałszywki ✔️¹
zrzut pamięci zawieszonego programu ✔️
Przeładowywanie na gorąco ✔️
Raport HTML ✔️
Raport GitHub Actions ✔️³ ✔️³
ponów próbę ✔️
Trx ✔️ ✔️
raport Azure DevOps ✔️³ ✔️²

² MSTest.Sdk 3.7.0+ ² MSTest.Sdk 3.11.0+ ³ MSTest.Sdk 4.3.0+

Włączanie lub wyłączanie rozszerzeń

Rozszerzenia można włączać i wyłączać przez właściwości programu MSBuild za pomocą wzorca Enable[NugetPackageNameWithoutDots].

Aby na przykład włączyć rozszerzenie zrzutu awaryjnego (pakiet NuGet Microsoft.Testing.Extensions.CrashDump) można użyć następującej właściwości EnableMicrosoftTestingExtensionsCrashDump ustawionej na true:

<Project Sdk="MSTest.Sdk/4.1.0">

<PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <EnableMicrosoftTestingExtensionsCrashDump>true</EnableMicrosoftTestingExtensionsCrashDump>
</PropertyGroup>

</Project>

Aby uzyskać listę wszystkich dostępnych rozszerzeń, zobacz MTP features (Funkcje MTP).

Niektóre rozszerzenia MTP pozostają opcjonalne i nie są uwzględnione w profilach Default lub AllMicrosoft:

  • Począwszy od MSTest.Sdk 4.3 ustaw <EnableMicrosoftTestingExtensionsJUnitReport>true</EnableMicrosoftTestingExtensionsJUnitReport>, a następnie przekaż --report-junit.
  • Począwszy od wersji zapoznawczej zestawu MSTest.Sdk 4.4, ustaw wartość <EnableMicrosoftTestingExtensionsCtrfReport>true</EnableMicrosoftTestingExtensionsCtrfReport>, a następnie przekaż polecenie --report-ctrf.
  • Aby odwołać się do rozszerzenia OpenTelemetry, ustaw wartość <EnableMicrosoftTestingExtensionsOpenTelemetry>true</EnableMicrosoftTestingExtensionsOpenTelemetry>. Ponieważ rozszerzenie wymaga konfiguracji API, zarejestruj je w niestandardowym punkcie wejścia zgodnie z opisem w OpenTelemetry.

Te rozszerzenia są dostępne tylko w przypadku protokołu MTP.

Ostrzeżenie

Ważne jest, aby przejrzeć postanowienia licencyjne dla każdego rozszerzenia, ponieważ mogą się one różnić.

Włączone i wyłączone rozszerzenia są łączone z rozszerzeniami dostarczonymi przez wybrany profil rozszerzeń.

Ten wzorzec właściwości może służyć do włączenia dodatkowego rozszerzenia na bazie niejawnego Default profilu (jak pokazano w poprzednim przykładzie rozszerzenia CrashDumpExtension).

Możesz również wyłączyć rozszerzenie pochodzące z wybranego profilu. Na przykład wyłącz MS Code Coverage rozszerzenie, ustawiając wartość <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>:

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
    </PropertyGroup>

</Project>

W pakiecie MSTest.Sdk 4.3.0 i nowszych profil Default odwołuje się do pakietów Azure DevOps Report i GitHub Actions Report. Aby usunąć odwołanie do pakietu, ustaw <EnableMicrosoftTestingExtensionsAzureDevOpsReport>false</EnableMicrosoftTestingExtensionsAzureDevOpsReport> lub <EnableMicrosoftTestingExtensionsGitHubActionsReport>false</EnableMicrosoftTestingExtensionsGitHubActionsReport>. Jeśli zachowasz odwołania do pakietów, raportowanie w Azure DevOps rozpoczyna się dopiero po przekazaniu --report-azdo. Raportowanie w GitHub Actions rozpoczyna się tylko wtedy, gdy uruchomisz testy w GitHub Actions i przekażesz --report-gh.

Funkcje

Poza wyborem modułu uruchamiającego oraz specyficznych dla niego rozszerzeń, MSTest.Sdk oferuje również dodatkowe funkcje upraszczające i ulepszające Twoje środowisko testowe.

Testowanie z Aspire

Aspire jest dostosowaną do najlepszych praktyk, przystosowaną do chmury technologią do tworzenia obserwowalnych, gotowych do produkcji aplikacji rozproszonych. Aspire jest dostarczany za pośrednictwem kolekcji pakietów NuGet, które obsługują konkretne problemy natywne dla chmury. Aby uzyskać więcej informacji, zobacz dokumentacjęAspire.

Uwaga

Ta funkcja jest dostępna w zestawie MSTest.Sdk 3.4.0.

Ustawiając właściwość EnableAspireTesting na true, można wprowadzić wszystkie zależności i domyślne dyrektywy using potrzebne do testowania wraz z Aspire i MSTest.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnableAspireTesting>true</EnableAspireTesting>
    </PropertyGroup>

</Project>

Testowanie z Playwright

Playwright umożliwia niezawodne kompleksowe testowanie nowoczesnych web apps. Aby uzyskać więcej informacji, zobacz oficjalną dokumentację dramaturga.

Uwaga

Ta funkcja jest dostępna w zestawie MSTest.Sdk 3.4.0.

Ustawiając właściwość EnablePlaywright na true, możesz wprowadzić wszystkie zależności i domyślne dyrektywy potrzebne do testowania za pomocą using i Playwright.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnablePlaywright>true</EnablePlaywright>
    </PropertyGroup>

</Project>

Migrowanie do zestawu MSTest SDK

Rozważ następujące kroki, które są wymagane do przeprowadzenia migracji do zestawu MSTest SDK.

Zaktualizuj swój projekt

Podczas migrowania istniejącego projektu testowego MSTest do zestawu MSTest SDK zacznij od zastąpienia wpisu Sdk="Microsoft.NET.Sdk" w górnej części projektu testowego Sdk="MSTest.Sdk"

- Sdk="Microsoft.NET.Sdk"
+ Sdk="MSTest.Sdk"

Dodaj wersję do pliku global.json:

{
    "msbuild-sdks": {
        "MSTest.Sdk": "4.1.0"
    }
}

Następnie możesz zacząć upraszczać project.

Usuń właściwości domyślne:

- <EnableMSTestRunner>true</EnableMSTestRunner>
- <OutputType>Exe</OutputType>
- <IsPackable>false</IsPackable>
- <IsTestProject>true</IsTestProject>

Usuń odwołania do pakietów domyślnych:

- <PackageReference Include="MSTest"
- <PackageReference Include="MSTest.TestFramework"
- <PackageReference Include="MSTest.TestAdapter"
- <PackageReference Include="MSTest.Analyzers"
- <PackageReference Include="Microsoft.NET.Test.Sdk"

Na koniec na podstawie używanego profilu rozszerzeń możesz również usunąć niektóre pakiety Microsoft.Testing.Extensions.*.

Zaktualizuj swoją ciągłą integrację

Po zaktualizowaniu projektów, jeśli używasz MTP (ustawienie domyślne) i polegasz na dotnet test do uruchamiania testów, musisz zaktualizować konfigurację CI. Aby uzyskać więcej informacji i poznać wszystkie wymagane zmiany, zobacz sekcję dotnet test integration.

Jeśli używasz trybu VSTest dotnet test, oto przykładowa aktualizacja podczas korzystania z zadania DotNetCoreCLI w Azure DevOps:

Domyślny profil rozszerzenia MSTest.Sdk dostarcza pakiety Microsoft.Testing.Extensions.TrxReport i Microsoft.Testing.Extensions.CodeCoverage, wymagane przez dodane opcje. Jeśli wybierzesz profil None, włącz lub odnieś się do obu rozszerzeń przed użyciem tych opcji.

\- task: DotNetCoreCLI@2
  inputs:
    command: 'test'
    projects: '**/**.sln'
-    arguments: '--configuration Release'
+    arguments: '--configuration Release -- --report-trx --results-directory $(Agent.TempDirectory) --coverage'

Generator źródła odbicia

Ważne

Poniższa funkcja MSTest 4.4 jest dostępna wyłącznie w wersjach zapoznawczych do czasu wydania MSTest 4.4.0.

MSTest 4.3 wprowadził generator źródeł oparty na refleksji w eksperymentalnym pakiecie MSTest.SourceGeneration, wersjonowanym niezależnie. Począwszy od msTest 4.4, pakiet kończy się stanem eksperymentalnym i używa wersji MSTest.

Natywne projekty AOT automatycznie zawierają generator kodu źródłowego. W przypadku projektu innego niż NativeAOT korzystającego z zestawu MSTest.Sdk wybierz opcję <EnableMSTestSourceGeneration>true</EnableMSTestSourceGeneration>. MSTest.Sdk ujednolica wersje MSTest.SourceGeneration, MSTest.TestFramework i MSTest.TestAdapter za pośrednictwem MSTestVersion.

Zestaw SDK obsługuje również generowanie źródła w bibliotekach testowych wielokrotnego użytku i projektach korzystających z centralnego zarządzania pakietami. Dostarcza pasujące MSTest.TestAdapter punkty zaczepienia środowiska uruchomieniowego i generuje wymagane PackageVersion elementy.

.NET Standard nie obsługuje tych punktów zaczepienia środowiska uruchomieniowego. Po włączeniu generowania źródła dla celu .NET Standard zestaw SDK zgłasza następujący błąd:

Generowanie kodu źródłowego przez MSTest nie jest obsługiwane dla platform docelowych .NET Standard, ponieważ wymagane punkty zaczepienia środowiska uruchomieniowego MSTest.TestAdapter są niedostępne.

Generator źródła odnajduje testy w czasie kompilacji. Gdy generator jest aktywny, klasy testowe muszą deklarować [TestClass] bezpośrednio, zamiast dziedziczyć po nim. Analizator MSTEST0069 oznacza klasy, które polegają na dziedziczonym [TestClass].

Począwszy od wersji MSTest 4.3.2, MSTestSourceGenMode jest domyślnie ustawione na ReflectionFree w projektach z przycinaniem i projektach Native AOT. Ten tryb wykorzystuje wygenerowane metadane i moduły wywołujące tam, gdzie obsługiwany jest kształt testu. W środowiskach uruchomieniowych obsługujących refleksję narzędzie MSTest używa refleksji jako mechanizmu zastępczego dla nieobsługiwanych lub brakujących wygenerowanych wpisów.

Od wersji MSTest 4.4 generowanie niewymagające mechanizmu refleksji powoduje utworzenie pełnych metadanych dziedziczonych atrybutów, w tym AttributeUsage i AllowMultiple. W przypadku protokołu MTP może pominąć odnajdywanie i walidację środowiska uruchomieniowego dla zwykłych synchronicznych [TestMethod] i [DataRow] metod. Testy asynchroniczne, niestandardowe atrybuty metod testowych, DynamicData, niestandardowe implementacje ITestDataSource oraz niejednoznaczne postacie testów korzystają ze ścieżki rezerwowej. Program VSTest zachowuje również istniejącą ścieżkę.

Tryb bez odbić raportuje następujące informacje diagnostyczne:

identyfikator Nieobsługiwana forma testu
AOTSG0001 Statyczna klasa testu
AOTSG0002 Otwieranie otwartej klasy testowej generycznej, w tym klasy zagnieżdżonej w typie generycznym
AOTSG0003 Klasa, do której wygenerowany kod nie ma dostępu, w tym klasa lokalna dla pliku lub zagnieżdżona klasa prywatna albo prywatno-chroniona
AOTSG0004 Ogólna metoda testu
AOTSG0005 Metoda testowa z parametrem ref, inlub out

Funkcje eksperymentalne

Następujące funkcje MSTest 4.3 są eksperymentalne. Ich publiczne interfejsy API mogą ulegać zmianom i są dostępne tylko w ramach diagnostyki eksperymentalnej. Aby włączyć tę opcję, potwierdź odpowiedni identyfikator diagnostyczny.

Filtrowanie testów programowych za pomocą polecenia ITestFilter

Uwaga

Wprowadzona w programie MSTest 4.3.0 (eksperymentalna).

Eksperymentalny ITestFilter punkt rozszerzenia, zarejestrowany za pomocą [TestFilterProviderAttribute], pozwala programowo zdecydować, czy dany test ma zostać uruchomiony, zanim zostanie załadowana jakakolwiek klasa testowa. Jest to przydatne w przypadku niestandardowej logiki wyboru, która nie może być wyrażona za pomocą filtrów wiersza polecenia.

Zaimplementuj ITestFilter.Filter(TestFilterContext) , aby sprawdzić metadane bez ładowania klasy testowej:

public sealed class MyFilter : ITestFilter
{
    public TestFilterResult Filter(TestFilterContext context) =>
        context.DisplayName.Contains("Nightly", StringComparison.Ordinal)
            ? TestFilterResult.Run : TestFilterResult.Drop;
}

Wróć TestFilterResult.Run , aby uruchomić test, Drop aby pominąć go bez wyniku lub Skip(reason) zgłosić pominięty wynik. Narzędzie MSTest może wywoływać jedno wystąpienie filtru jednocześnie, więc implementacje muszą być bezpieczne wątkowo. Filtry wiersza polecenia i Eksploratora testów są stosowane przed ITestFilter, a [Ignore] jest oceniane następnie.

Począwszy od msTest 4.4, .NET projekty mogą używać ogólnego, bezpiecznego typu formularza [assembly: TestFilterProvider<MyFilter>]rejestracji. Następnie kompilator wymusza, aby MyFilter implementował ITestFilter oraz miał publiczny konstruktor bezparametrowy. Atrybut ogólny nie jest dostępny dla platformy .NET Framework. W przypadku projektu wielokierunkowego wybierz ogólny lub niegeneryczny formularz z symbolem preprocesora platformy docelowej.

#if NET
[assembly: TestFilterProvider<MyFilter>]
#else
[assembly: TestFilterProvider(typeof(MyFilter))]
#endif

Począwszy od msTest 4.4, analizator MSTEST0081 w pełni weryfikuje niegeneryczny formularz rejestracji. W przypadku formularza ogólnego nadal raportuje ogólne typy filtrów i zestawy rejestrujące więcej niż jednego dostawcę.

TestRun.Current i planowane testy

Uwaga

Wprowadzona w programie MSTest 4.3.0 (eksperymentalna).

Eksperymentalny interfejs API TestRun.Current (z RFC 014) udostępnia informacje o bieżącym uruchomieniu, w tym zestaw zaplanowanych testów, dzięki czemu rozszerzenia i fikstury mogą sprawdzać, co zostało zaplanowane do wykonania.

Znane ograniczenia

Dostarczone przez NuGet zestawy SDK MSBuild (w tym MSTest.Sdk) mają ograniczoną obsługę narzędzi w zakresie aktualizacji ich wersji, co oznacza, że zwykła aktualizacja w NuGet i interfejs użytkownika Visual Studio do zarządzania pakietami NuGet nie działa zgodnie z oczekiwaniami. Trzeba ręcznie zaktualizować wersję w pliku global.json i w pliku projektu. (Dotyczy to nawet sytuacji, gdy używasz narzędzia Dependabot z powodu problemów dependabot-core#12824 i dependabot-core#8615).

Zobacz też