Zelfstudie: Een .NET-klassebibliotheek testen met Visual Studio Code
Deze zelfstudie laat zien hoe u eenheidstests automatiseert door een testproject toe te voegen aan een oplossing.
Voorwaarden
- Deze zelfstudie werkt met de oplossing die u maakt in Een .NET-klassebibliotheek maken met behulp van Visual Studio Code.
Een eenheidstestproject maken
Eenheidstests bieden geautomatiseerde softwaretests tijdens uw ontwikkeling en publicatie. Het testframework dat u in deze zelfstudie gebruikt, is MSTest. MSTest is een van de drie testframeworks waaruit u kunt kiezen. De andere zijn xUnit en nUnit.
Start Visual Studio Code.
Open de
ClassLibraryProjects
-oplossing die u hebt gemaakt in Een .NET-klassebibliotheek maken met behulp van Visual Studio Code.Selecteer in Solution ExplorerNieuw projectof selecteer in het opdrachtenpalet .NET: Nieuw project.
Selecteer MSTest Test Project, geef het de naam 'StringLibraryTest', selecteer de standaardmap en selecteer Project maken.
De projectsjabloon maakt een UnitTest1.cs-bestand met de volgende code:
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }
De broncode die door de eenheidstestsjabloon is gemaakt, doet het volgende:
- Het kenmerk TestClassAttribute wordt toegepast op de
UnitTest1
-klasse. - Hiermee wordt het kenmerk TestMethodAttribute toegepast om
TestMethod1
te definiëren. - Hiermee importeert u de Microsoft.VisualStudio.TestTools.UnitTesting naamruimte, die de typen bevat die worden gebruikt voor eenheidstests. De naamruimte wordt geïmporteerd via een
global using
instructie in GlobalUsings.cs.
Elke methode die is getagd met [TestMethod] in een testklasse die is gelabeld met [TestClass] automatisch wordt uitgevoerd wanneer de eenheidstest wordt aangeroepen.
- Het kenmerk TestClassAttribute wordt toegepast op de
Een projectreferentie toevoegen
Voeg een verwijzing in het StringLibraryTest
project toe aan het StringLibrary
project om het testproject te laten werken met de StringLibrary
-klasse.
Klik in Solution Explorer met de rechtermuisknop op het project StringLibraryTest en selecteer Projectverwijzing toevoegen.
Selecteer "StringLibrary".
Testmethoden voor eenheden toevoegen en uitvoeren
Wanneer Visual Studio een eenheidstest aanroept, wordt elke methode uitgevoerd die is gemarkeerd met het kenmerk TestMethodAttribute in een klasse die is gemarkeerd met het kenmerk TestClassAttribute. Een testmethode eindigt wanneer de eerste fout wordt gevonden of wanneer alle tests in de methode zijn geslaagd.
De meest voorkomende tests roepen leden van de Assert-klasse aan. Veel assertiemethoden bevatten ten minste twee parameters, waarvan een het verwachte testresultaat is en waarvan het werkelijke testresultaat is. Enkele van de meest gebruikte methoden van de Assert
-klasse worden weergegeven in de volgende tabel:
Assert-methoden | Functie |
---|---|
Assert.AreEqual |
Controleert of twee waarden of objecten gelijk zijn. De assert mislukt als de waarden of objecten niet gelijk zijn. |
Assert.AreSame |
Controleert of twee objectvariabelen naar hetzelfde object verwijzen. De assert mislukt als de variabelen verwijzen naar verschillende objecten. |
Assert.IsFalse |
Controleert of een voorwaarde voldoet aan false . De assert mislukt als de voorwaarde true is. |
Assert.IsNotNull |
Controleert of een object niet null is. De assertie faalt als het object null is. |
U kunt ook de methode Assert.ThrowsException (of Assert.Throws
en Assert.ThrowsExactly
gebruiken als u msTest 3.8 en hoger gebruikt) in een testmethode om aan te geven welk type uitzondering wordt verwacht te genereren. De test mislukt als de opgegeven uitzondering niet wordt opgeworpen.
Bij het testen van de methode StringLibrary.StartsWithUpper
wilt u een aantal tekenreeksen opgeven die beginnen met een hoofdletter. U verwacht dat de methode in deze gevallen true
retourneert, zodat u de Assert.IsTrue methode kunt aanroepen. Op dezelfde manier wilt u een aantal tekenreeksen opgeven die beginnen met iets anders dan een hoofdletter. U verwacht dat de methode in deze gevallen false
retourneert, zodat u de Assert.IsFalse methode kunt aanroepen.
Omdat de bibliotheekmethode tekenreeksen verwerkt, wilt u er ook voor zorgen dat deze zowel een lege tekenreeks (String.Empty
) als een null
tekenreeks succesvol verwerkt. Een lege tekenreeks is een tekenreeks die geen tekens bevat en waarvan de Length 0 is. Een null
-tekenreeks is er een die niet geïnitialiseerd is. U kunt StartsWithUpper
rechtstreeks aanroepen als een statische methode en één String argument doorgeven. U kunt ook StartsWithUpper
aanroepen als een extensiemethode op een string
variabele die is toegewezen aan null
.
U definieert drie methoden, die elk een Assert methode aanroepen voor elk element in een tekenreeksmatrix. U roept een overbelasting van de methode aan waarmee u een foutbericht kunt opgeven dat moet worden weergegeven in het geval van een testfout. Het bericht identificeert de tekenreeks die de fout heeft veroorzaakt.
De testmethoden maken:
Open StringLibraryTest/UnitTest1.cs en vervang alle code door de volgende code.
using Microsoft.VisualStudio.TestTools.UnitTesting; using UtilityLibraries; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestStartsWithUpper() { // Tests that we expect to return true. string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsTrue(result, string.Format("Expected for '{0}': true; Actual: {1}", word, result)); } } [TestMethod] public void TestDoesNotStartWithUpper() { // Tests that we expect to return false. string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word, result)); } } [TestMethod] public void DirectCallWithNullOrEmpty() { // Tests that we expect to return false. string?[] words = { string.Empty, null }; foreach (var word in words) { bool result = StringLibrary.StartsWithUpper(word); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word == null ? "<null>" : word, result)); } } } }
De test van hoofdletters in de
TestStartsWithUpper
methode omvat de Griekse hoofdletter alfa (U+0391) en de Cyrillische hoofdletter EM (U+041C). De test van kleine letters in de methodeTestDoesNotStartWithUpper
bevat de Griekse kleine letter alfa (U+03B1) en de Cyrillische kleine letter Ghe (U+0433).Sla uw wijzigingen op.
Uw tests bouwen en uitvoeren
Klik in Solution Explorermet de rechtermuisknop op de oplossingslijst en selecteer Build of selecteer in de opdrachtpalet .NET: Build.
Selecteer het venster Testen, selecteer Tests uitvoeren of selecteer vanuit de Command Palette Test: Alle tests uitvoeren.
Testfouten afhandelen
Als u testgestuurde ontwikkeling (TDD) uitvoert, schrijft u eerst tests en mislukken ze de eerste keer dat u ze uitvoert. Vervolgens voegt u code toe aan de app waarmee de test slaagt. Voor deze zelfstudie hebt u de test gemaakt nadat u de app-code hebt geschreven die de test valideert, zodat u de test niet hebt zien falen. Als u wilt controleren of een test mislukt wanneer u verwacht dat deze mislukt, voegt u een ongeldige waarde toe aan de testinvoer.
Wijzig de
words
array in deTestDoesNotStartWithUpper
methode om de string 'Fout' op te nemen.string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Voer de tests uit door te klikken op de groene fout naast de test in de editor.
De uitvoer laat zien dat de test mislukt en er wordt een foutbericht weergegeven voor de mislukte test: 'Assert.IsFalse is mislukt. Verwacht voor 'Fout': onwaar; feitelijk: waar. Vanwege de fout zijn er geen tekenreeksen in de array getest na het woord 'Error'.
Verwijder de tekenreeks 'Fout' die u in de stap hebt toegevoegd.
Voer de test opnieuw uit en de tests zijn geslaagd.
De releaseversie van de bibliotheek testen
Alle tests zijn nu geslaagd bij het uitvoeren van de Debug-build van de bibliotheek. Voer de tests nogmaals uit tegen de Release-build van de bibliotheek. Een aantal factoren, waaronder compileroptimalisaties, kan soms verschillend gedrag produceren tussen foutopsporing en release-builds.
Voer de tests uit met de buildconfiguratie van de release:
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
De tests zijn geslaagd.
Foutopsporingstests
Als u Visual Studio Code als uw IDE gebruikt, kunt u hetzelfde proces gebruiken dat wordt weergegeven in Fouten opsporen in een .NET-consoletoepassing met behulp van Visual Studio Code om fouten in code op te sporen met behulp van uw eenheidstestproject. In plaats van het project ShowCase-app te starten, opent u StringLibraryTest/UnitTest1.csen selecteert u Foutopsporingstests in het huidige bestand tussen regel 7 en 8. Als u het niet kunt vinden, drukt u op Ctrl+Shift+P om het opdrachtenpalet te openen en Opnieuw laden vensterin te voeren.
Visual Studio Code start het testproject met het bijgevoegde foutopsporingsprogramma. De uitvoering stopt op elk onderbrekingspunt dat u hebt toegevoegd aan het testproject of de onderliggende bibliotheekcode.
Aanvullende informatiebronnen
Volgende stappen
In deze zelfstudie hebt u een klassebibliotheek via unit testing getest. U kunt de bibliotheek beschikbaar maken voor anderen door deze als pakket te publiceren naar NuGet-. Volg een NuGet-zelfstudie voor meer informatie:
Als u een bibliotheek publiceert als een NuGet-pakket, kunnen anderen deze installeren en gebruiken. Volg een NuGet-zelfstudie voor meer informatie:
Een bibliotheek hoeft niet als pakket te worden gedistribueerd. Het kan worden gebundeld met een console-app die deze gebruikt. Zie de eerdere zelfstudie in deze reeks voor meer informatie over het publiceren van een console-app:
De Visual Studio Code-extensie C# Dev Kit biedt meer hulpprogramma's voor het ontwikkelen van C#-apps en -bibliotheken: