Kurz: Testování knihovny tříd .NET pomocí .NET pomocí sady Visual Studio
V tomto kurzu se dozvíte, jak automatizovat testování jednotek přidáním testovacího projektu do řešení.
Požadavky
- Tento kurz funguje s řešením, které vytvoříte v tématu Vytvoření knihovny tříd .NET pomocí sady Visual Studio.
Vytvoření projektu testování částí
Testy jednotek poskytují automatizované testování softwaru během vývoje a publikování. MSTest je jedna ze tří testovacích architektur, ze které si můžete vybrat. Ostatní jsou xUnit a nUnit.
Spusťte Visual Studio.
ClassLibraryProjects
Otevřete řešení, které jste vytvořili v části Vytvoření knihovny tříd .NET pomocí sady Visual Studio.Do řešení přidejte nový projekt testu jednotek s názvem StringLibraryTest.
V Průzkumníku řešení klikněte pravým tlačítkem myši na řešení a vyberte Přidat>nový projekt.
Na stránce Přidat nový projekt zadejte do vyhledávacího pole mstest. V seznamu jazyků zvolte jazyk C# nebo Visual Basic a pak v seznamu Platformy zvolte Všechny platformy .
Zvolte šablonu projektu MSTest Test a pak zvolte Další.
Na stránce Konfigurovat nový projekt zadejte StringLibraryTest do pole Název projektu. Pak zvolte Další.
Na stránce Další informace vyberte v poli Framework rozhraní .NET 8 (Preview). Potom zvolte Create (Vytvořit).
Visual Studio vytvoří projekt a otevře soubor třídy v okně kódu s následujícím kódem. Pokud se jazyk, který chcete použít, nezobrazuje, změňte výběr jazyka v horní části stránky.
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }
Imports Microsoft.VisualStudio.TestTools.UnitTesting Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Sub TestSub() End Sub End Class End Namespace
Zdrojový kód vytvořený šablonou testu jednotek provede následující:
- Importuje Microsoft.VisualStudio.TestTools.UnitTesting obor názvů, který obsahuje typy používané pro testování jednotek. V jazyce C# se obor názvů importuje prostřednictvím
global using
direktivy v souboru GlobalUsings.cs. - TestClassAttribute Použije atribut na
UnitTest1
třídu. - Tento atribut se použije TestMethodAttribute k definování
TestMethod1
v jazyce C# neboTestSub
v jazyce Visual Basic.
Každá metoda označená metodou [TestMethod] v testovací třídě označené pomocí třídy [TestClass] se spustí automaticky při spuštění testu jednotek.
- Importuje Microsoft.VisualStudio.TestTools.UnitTesting obor názvů, který obsahuje typy používané pro testování jednotek. V jazyce C# se obor názvů importuje prostřednictvím
Přidání odkazu na projekt
Aby testovací projekt fungoval s StringLibrary
třídou, přidejte do projektu StringLibrary
StringLibraryTest odkaz.
V Průzkumníku řešení klikněte pravým tlačítkem myši na uzel Závislosti projektu StringLibraryTest a v místní nabídce vyberte Přidat odkaz na projekt.
V dialogovém okně Správce odkazů rozbalte uzel Projekty a vyberte pole vedle StringLibrary. Přidání odkazu na
StringLibrary
sestavení umožňuje kompilátoru najít metody StringLibrary při kompilaci stringLibraryTest projektu.Vyberte OK.
Přidání a spuštění metod testování jednotek
Když Visual Studio spustí test jednotek, spustí každou metodu označenou atributem TestMethodAttribute ve třídě, která je označena atributem TestClassAttribute . Testovací metoda skončí, když se najde první selhání nebo když všechny testy obsažené v metodě proběhly úspěšně.
Nejběžnější testy volají členy Assert třídy. Mnoho metod assert zahrnuje alespoň dva parametry, jeden z nich je očekávaný výsledek testu a druhý z nich je skutečný výsledek testu. Některé z Assert
nejčastěji nazývaných metod třídy jsou uvedené v následující tabulce:
Metody Assert | Funkce |
---|---|
Assert.AreEqual |
Ověřuje, že jsou dvě hodnoty nebo objekty stejné. Kontrolní výraz selže, pokud se hodnoty nebo objekty nerovnají. |
Assert.AreSame |
Ověřuje, že dvě proměnné objektu odkazují na stejný objekt. Kontrolní výraz selže, pokud proměnné odkazují na různé objekty. |
Assert.IsFalse |
Ověřuje, že podmínka je false . Kontrolní výraz selže, pokud je true podmínka . |
Assert.IsNotNull |
Ověřuje, že objekt není null . Výraz selže, pokud je null objekt . |
Můžete také použít metodu Assert.ThrowsException v testovací metodě k označení typu výjimky, kterou má vyvolat. Test selže, pokud není vyvolán zadaná výjimka.
Při testování StringLibrary.StartsWithUpper
metody chcete zadat řadu řetězců, které začínají velkými písmeny. Očekáváte, že se metoda v těchto případech vrátí true
, takže můžete metodu Assert.IsTrue volat. Podobně chcete zadat řadu řetězců, které začínají něčím jiným než velkým znakem. Očekáváte, že se metoda v těchto případech vrátí false
, takže můžete metodu Assert.IsFalse volat.
Vzhledem k tomu, že vaše metoda knihovny zpracovává řetězce, chcete se také ujistit, že úspěšně zpracovává prázdný řetězec (String.Empty
), platný řetězec, který neobsahuje žádné znaky a jehož Length je 0, a null
řetězec, který nebyl inicializován. Můžete volat StartsWithUpper
přímo jako statickou metodu a předat jeden String argument. Nebo můžete volat StartsWithUpper
jako rozšiřující metodu pro proměnnou přiřazenou string
null
.
Definujete tři metody, z nichž každá volá metodu Assert pro každý prvek v řetězcovém poli. Zavoláte přetížení metody, které vám umožní zadat chybovou zprávu, která se zobrazí v případě selhání testu. Zpráva identifikuje řetězec, který způsobil selhání.
Vytvoření testovacích metod:
V okně kódu UnitTest1.cs nebo UnitTest1.vb nahraďte kód následujícím kódem:
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)); } } } }
Imports Microsoft.VisualStudio.TestTools.UnitTesting Imports UtilityLibraries Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Public Sub TestStartsWithUpper() ' Tests that we expect to return true. Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsTrue(result, $"Expected for '{word}': true; Actual: {result}") Next End Sub <TestMethod> Public Sub TestDoesNotStartWithUpper() ' Tests that we expect to return false. Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " "} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsFalse(result, $"Expected for '{word}': false; Actual: {result}") Next End Sub <TestMethod> Public Sub DirectCallWithNullOrEmpty() ' Tests that we expect to return false. Dim words() As String = {String.Empty, Nothing} For Each word In words Dim result As Boolean = StringLibrary.StartsWithUpper(word) Assert.IsFalse(result, $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}") Next End Sub End Class End Namespace
Test velkých písmen v
TestStartsWithUpper
metodě obsahuje řecké velké písmeno alfa (U+0391) a velké písmeno cyrilice EM (U+041C). Test malých písmen vTestDoesNotStartWithUpper
metodě obsahuje řecké malé písmeno alfa (U+03B1) a malé písmeno cyrilice Ghe (U+0433).Na řádku nabídek vyberte Soubor>Save UnitTest1.cs As nebo File>Save UnitTest1.vb As. V dialogovém okně Uložit soubor jako vyberte šipku vedle tlačítka Uložit a vyberte Uložit s kódováním.
V dialogovém okně Potvrdit uložit jako vyberte tlačítko Ano a soubor uložte.
V dialogovém okně Upřesnit možnosti uložení vyberte Unicode (UTF-8 s podpisem) - Znaková stránka 65001 z rozevíracího seznamu Kódování a vyberte OK.
Pokud zdrojový kód neuložíte jako soubor s kódováním UTF8, visual Studio ho může uložit jako soubor ASCII. V takovém případě modul runtime přesně nekóduje znaky UTF8 mimo rozsah ASCII a výsledky testu nebudou správné.
Na řádku nabídek vyberte Test>Spustit všechny testy. Pokud se okno Průzkumníka testů neotevře, otevřete ho výběrem Průzkumníka testů>. Tyto tři testy jsou uvedeny v části Úspěšné testy a v části Souhrn se zobrazí zpráva o výsledku spuštění testu.
Zpracování selhání testů
Pokud provádíte vývoj řízený testy (TDD), nejdřív napíšete testy a při prvním spuštění selžou. Pak do aplikace přidáte kód, který test uspěje. Pro účely tohoto kurzu jste vytvořili test po napsání kódu aplikace, který ověří, takže se test nepovede. Pokud chcete ověřit, že test selže, když očekáváte, že selže, přidejte do vstupu testu neplatnou hodnotu.
words
Upravte pole vTestDoesNotStartWithUpper
metodě tak, aby zahrnoval řetězec Error. Soubor nemusíte ukládat, protože Visual Studio automaticky ukládá otevřené soubory při sestavení řešení pro spouštění testů.string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }
Spusťte test výběrem možnosti Test>Run All Tests (Spustit všechny testy) na řádku nabídek. Okno Průzkumníka testů označuje, že dva testy proběhly úspěšně a jeden selhal.
Vyberte neúspěšný test .
TestDoesNotStartWith
V okně Průzkumníka testů se zobrazí zpráva vytvořená výrazem Assert.IsFalse se nezdařila. Byl očekáváno pro chybu: false; actual: True". Kvůli selhání nebyly po otestování chyby v poli žádné řetězce.
Odeberte řetězec Chyba, který jste přidali v kroku 1. Znovu spusťte test a testy projdou.
Testování verze knihovny
Teď, když testy proběhly při spuštění sestavení ladění knihovny, spusťte testy ještě jednou oproti sestavení vydané verze knihovny. Řada faktorů, včetně optimalizací kompilátoru, může někdy způsobit jiné chování mezi sestaveními Debug a Release.
Otestování sestavení vydané verze:
Na panelu nástrojů sady Visual Studio změňte konfiguraci sestavení z ladění na verzi.
V Průzkumníku řešení klikněte pravým tlačítkem myši na projekt StringLibrary a v místní nabídce vyberte Sestavit a knihovnu znovu zkompilujte.
Testy jednotek spusťte tak, že v řádku nabídek vyberete Možnost Spustit>všechny testy. Testy jsou úspěšné.
Ladění testů
Pokud jako integrované vývojové prostředí používáte Visual Studio, můžete použít stejný postup uvedený v kurzu: Ladění konzolové aplikace .NET pomocí sady Visual Studio k ladění kódu pomocí projektu testování jednotek. Místo spuštění projektu aplikace ShowCase klikněte pravým tlačítkem myši na projekt StringLibraryTests a v místní nabídce vyberte Ladit testy .
Visual Studio spustí testovací projekt s připojeným ladicím programem. Provádění se zastaví na libovolné zarážce, kterou jste přidali do testovacího projektu nebo základního kódu knihovny.
Další prostředky
Další kroky
V tomto kurzu jste otestovali knihovnu tříd. Knihovnu můžete zpřístupnit ostatním tak, že ji publikujete do NuGetu jako balíček. Postup najdete v kurzu NuGet:
Pokud publikujete knihovnu jako balíček NuGet, můžou ji nainstalovat a používat i ostatní uživatelé. Postup najdete v kurzu NuGet:
Knihovna nemusí být distribuována jako balíček. Může být součástí konzolové aplikace, která ji používá. Informace o publikování konzolové aplikace najdete v předchozím kurzu této série:
V tomto kurzu se dozvíte, jak automatizovat testování jednotek přidáním testovacího projektu do řešení.
Požadavky
- Tento kurz funguje s řešením, které vytvoříte v tématu Vytvoření knihovny tříd .NET pomocí sady Visual Studio.
Vytvoření projektu testování částí
Testy jednotek poskytují automatizované testování softwaru během vývoje a publikování. MSTest je jedna ze tří testovacích architektur, ze které si můžete vybrat. Ostatní jsou xUnit a nUnit.
Spusťte Visual Studio.
ClassLibraryProjects
Otevřete řešení, které jste vytvořili v části Vytvoření knihovny tříd .NET pomocí sady Visual Studio.Do řešení přidejte nový projekt testu jednotek s názvem StringLibraryTest.
V Průzkumníku řešení klikněte pravým tlačítkem myši na řešení a vyberte Přidat>nový projekt.
Na stránce Přidat nový projekt zadejte do vyhledávacího pole mstest. V seznamu jazyků zvolte jazyk C# nebo Visual Basic a pak v seznamu Platformy zvolte Všechny platformy .
Zvolte šablonu projektu MSTest Test a pak zvolte Další.
Na stránce Konfigurovat nový projekt zadejte StringLibraryTest do pole Název projektu. Pak zvolte Další.
Na stránce Další informace vyberte v poli Framework možnost .NET 7 (standardní podpora). Potom zvolte Create (Vytvořit).
Visual Studio vytvoří projekt a otevře soubor třídy v okně kódu s následujícím kódem. Pokud se jazyk, který chcete použít, nezobrazuje, změňte výběr jazyka v horní části stránky.
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } } }
Imports Microsoft.VisualStudio.TestTools.UnitTesting Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Sub TestSub() End Sub End Class End Namespace
Zdrojový kód vytvořený šablonou testu jednotek provede následující:
- Importuje Microsoft.VisualStudio.TestTools.UnitTesting obor názvů, který obsahuje typy používané pro testování jednotek.
- TestClassAttribute Použije atribut na
UnitTest1
třídu. - Tento atribut se použije TestMethodAttribute k definování
TestMethod1
v jazyce C# neboTestSub
v jazyce Visual Basic.
Každá metoda označená metodou [TestMethod] v testovací třídě označené pomocí třídy [TestClass] se spustí automaticky při spuštění testu jednotek.
Přidání odkazu na projekt
Aby testovací projekt fungoval s StringLibrary
třídou, přidejte do projektu StringLibrary
StringLibraryTest odkaz.
V Průzkumníku řešení klikněte pravým tlačítkem myši na uzel Závislosti projektu StringLibraryTest a v místní nabídce vyberte Přidat odkaz na projekt.
V dialogovém okně Správce odkazů rozbalte uzel Projekty a vyberte pole vedle StringLibrary. Přidání odkazu na
StringLibrary
sestavení umožňuje kompilátoru najít metody StringLibrary při kompilaci stringLibraryTest projektu.Vyberte OK.
Přidání a spuštění metod testování jednotek
Když Visual Studio spustí test jednotek, spustí každou metodu označenou atributem TestMethodAttribute ve třídě, která je označena atributem TestClassAttribute . Testovací metoda skončí, když se najde první selhání nebo když všechny testy obsažené v metodě proběhly úspěšně.
Nejběžnější testy volají členy Assert třídy. Mnoho metod assert zahrnuje alespoň dva parametry, jeden z nich je očekávaný výsledek testu a druhý z nich je skutečný výsledek testu. Některé z Assert
nejčastěji nazývaných metod třídy jsou uvedené v následující tabulce:
Metody Assert | Funkce |
---|---|
Assert.AreEqual |
Ověřuje, že jsou dvě hodnoty nebo objekty stejné. Kontrolní výraz selže, pokud se hodnoty nebo objekty nerovnají. |
Assert.AreSame |
Ověřuje, že dvě proměnné objektu odkazují na stejný objekt. Kontrolní výraz selže, pokud proměnné odkazují na různé objekty. |
Assert.IsFalse |
Ověřuje, že podmínka je false . Kontrolní výraz selže, pokud je true podmínka . |
Assert.IsNotNull |
Ověřuje, že objekt není null . Výraz selže, pokud je null objekt . |
Můžete také použít metodu Assert.ThrowsException v testovací metodě k označení typu výjimky, kterou má vyvolat. Test selže, pokud není vyvolán zadaná výjimka.
Při testování StringLibrary.StartsWithUpper
metody chcete zadat řadu řetězců, které začínají velkými písmeny. Očekáváte, že se metoda v těchto případech vrátí true
, takže můžete metodu Assert.IsTrue volat. Podobně chcete zadat řadu řetězců, které začínají něčím jiným než velkým znakem. Očekáváte, že se metoda v těchto případech vrátí false
, takže můžete metodu Assert.IsFalse volat.
Vzhledem k tomu, že vaše metoda knihovny zpracovává řetězce, chcete se také ujistit, že úspěšně zpracovává prázdný řetězec (String.Empty
), platný řetězec, který neobsahuje žádné znaky a jehož Length je 0, a null
řetězec, který nebyl inicializován. Můžete volat StartsWithUpper
přímo jako statickou metodu a předat jeden String argument. Nebo můžete volat StartsWithUpper
jako rozšiřující metodu pro proměnnou přiřazenou string
null
.
Definujete tři metody, z nichž každá volá metodu Assert pro každý prvek v řetězcovém poli. Zavoláte přetížení metody, které vám umožní zadat chybovou zprávu, která se zobrazí v případě selhání testu. Zpráva identifikuje řetězec, který způsobil selhání.
Vytvoření testovacích metod:
V okně kódu UnitTest1.cs nebo UnitTest1.vb nahraďte kód následujícím kódem:
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)); } } } }
Imports Microsoft.VisualStudio.TestTools.UnitTesting Imports UtilityLibraries Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Public Sub TestStartsWithUpper() ' Tests that we expect to return true. Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsTrue(result, $"Expected for '{word}': true; Actual: {result}") Next End Sub <TestMethod> Public Sub TestDoesNotStartWithUpper() ' Tests that we expect to return false. Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " "} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsFalse(result, $"Expected for '{word}': false; Actual: {result}") Next End Sub <TestMethod> Public Sub DirectCallWithNullOrEmpty() ' Tests that we expect to return false. Dim words() As String = {String.Empty, Nothing} For Each word In words Dim result As Boolean = StringLibrary.StartsWithUpper(word) Assert.IsFalse(result, $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}") Next End Sub End Class End Namespace
Test velkých písmen v
TestStartsWithUpper
metodě obsahuje řecké velké písmeno alfa (U+0391) a velké písmeno cyrilice EM (U+041C). Test malých písmen vTestDoesNotStartWithUpper
metodě obsahuje řecké malé písmeno alfa (U+03B1) a malé písmeno cyrilice Ghe (U+0433).Na řádku nabídek vyberte Soubor>Save UnitTest1.cs As nebo File>Save UnitTest1.vb As. V dialogovém okně Uložit soubor jako vyberte šipku vedle tlačítka Uložit a vyberte Uložit s kódováním.
V dialogovém okně Potvrdit uložit jako vyberte tlačítko Ano a soubor uložte.
V dialogovém okně Upřesnit možnosti uložení vyberte Unicode (UTF-8 s podpisem) - Znaková stránka 65001 z rozevíracího seznamu Kódování a vyberte OK.
Pokud zdrojový kód neuložíte jako soubor s kódováním UTF8, visual Studio ho může uložit jako soubor ASCII. V takovém případě modul runtime přesně nekóduje znaky UTF8 mimo rozsah ASCII a výsledky testu nebudou správné.
Na řádku nabídek vyberte Test>Spustit všechny testy. Pokud se okno Průzkumníka testů neotevře, otevřete ho výběrem Průzkumníka testů>. Tyto tři testy jsou uvedeny v části Úspěšné testy a v části Souhrn se zobrazí zpráva o výsledku spuštění testu.
Zpracování selhání testů
Pokud provádíte vývoj řízený testy (TDD), nejdřív napíšete testy a při prvním spuštění selžou. Pak do aplikace přidáte kód, který test uspěje. Pro účely tohoto kurzu jste vytvořili test po napsání kódu aplikace, který ověří, takže se test nepovede. Pokud chcete ověřit, že test selže, když očekáváte, že selže, přidejte do vstupu testu neplatnou hodnotu.
words
Upravte pole vTestDoesNotStartWithUpper
metodě tak, aby zahrnoval řetězec Error. Soubor nemusíte ukládat, protože Visual Studio automaticky ukládá otevřené soubory při sestavení řešení pro spouštění testů.string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }
Spusťte test výběrem možnosti Test>Run All Tests (Spustit všechny testy) na řádku nabídek. Okno Průzkumníka testů označuje, že dva testy proběhly úspěšně a jeden selhal.
Vyberte neúspěšný test .
TestDoesNotStartWith
V okně Průzkumníka testů se zobrazí zpráva vytvořená výrazem Assert.IsFalse se nezdařila. Byl očekáváno pro chybu: false; actual: True". Kvůli selhání nebyly po otestování chyby v poli žádné řetězce.
Odeberte řetězec Chyba, který jste přidali v kroku 1. Znovu spusťte test a testy projdou.
Testování verze knihovny
Teď, když testy proběhly při spuštění sestavení ladění knihovny, spusťte testy ještě jednou oproti sestavení vydané verze knihovny. Řada faktorů, včetně optimalizací kompilátoru, může někdy způsobit jiné chování mezi sestaveními Debug a Release.
Otestování sestavení vydané verze:
Na panelu nástrojů sady Visual Studio změňte konfiguraci sestavení z ladění na verzi.
V Průzkumníku řešení klikněte pravým tlačítkem myši na projekt StringLibrary a v místní nabídce vyberte Sestavit a knihovnu znovu zkompilujte.
Testy jednotek spusťte tak, že v řádku nabídek vyberete Možnost Spustit>všechny testy. Testy jsou úspěšné.
Ladění testů
Pokud jako integrované vývojové prostředí používáte Visual Studio, můžete použít stejný postup uvedený v kurzu: Ladění konzolové aplikace .NET pomocí sady Visual Studio k ladění kódu pomocí projektu testování jednotek. Místo spuštění projektu aplikace ShowCase klikněte pravým tlačítkem myši na projekt StringLibraryTests a v místní nabídce vyberte Ladit testy .
Visual Studio spustí testovací projekt s připojeným ladicím programem. Provádění se zastaví na libovolné zarážce, kterou jste přidali do testovacího projektu nebo základního kódu knihovny.
Další prostředky
Další kroky
V tomto kurzu jste otestovali knihovnu tříd. Knihovnu můžete zpřístupnit ostatním tak, že ji publikujete do NuGetu jako balíček. Postup najdete v kurzu NuGet:
Pokud publikujete knihovnu jako balíček NuGet, můžou ji nainstalovat a používat i ostatní uživatelé. Postup najdete v kurzu NuGet:
Knihovna nemusí být distribuována jako balíček. Může být součástí konzolové aplikace, která ji používá. Informace o publikování konzolové aplikace najdete v předchozím kurzu této série:
V tomto kurzu se dozvíte, jak automatizovat testování jednotek přidáním testovacího projektu do řešení.
Požadavky
- Tento kurz funguje s řešením, které vytvoříte v tématu Vytvoření knihovny tříd .NET pomocí sady Visual Studio.
Vytvoření projektu testování částí
Testy jednotek poskytují automatizované testování softwaru během vývoje a publikování. MSTest je jedna ze tří testovacích architektur, ze které si můžete vybrat. Ostatní jsou xUnit a nUnit.
Spusťte Visual Studio.
ClassLibraryProjects
Otevřete řešení, které jste vytvořili v části Vytvoření knihovny tříd .NET pomocí sady Visual Studio.Do řešení přidejte nový projekt testu jednotek s názvem StringLibraryTest.
V Průzkumníku řešení klikněte pravým tlačítkem myši na řešení a vyberte Přidat>nový projekt.
Na stránce Přidat nový projekt zadejte do vyhledávacího pole mstest. V seznamu jazyků zvolte jazyk C# nebo Visual Basic a pak v seznamu Platformy zvolte Všechny platformy .
Zvolte šablonu projektu MSTest Test a pak zvolte Další.
Na stránce Konfigurovat nový projekt zadejte StringLibraryTest do pole Název projektu. Pak zvolte Další.
Na stránce Další informace vyberte v poli Framework možnost .NET 6 (dlouhodobá podpora). Potom zvolte Create (Vytvořit).
Visual Studio vytvoří projekt a otevře soubor třídy v okně kódu s následujícím kódem. Pokud se jazyk, který chcete použít, nezobrazuje, změňte výběr jazyka v horní části stránky.
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } } }
Imports Microsoft.VisualStudio.TestTools.UnitTesting Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Sub TestSub() End Sub End Class End Namespace
Zdrojový kód vytvořený šablonou testu jednotek provede následující:
- Importuje Microsoft.VisualStudio.TestTools.UnitTesting obor názvů, který obsahuje typy používané pro testování jednotek.
- TestClassAttribute Použije atribut na
UnitTest1
třídu. - Tento atribut se použije TestMethodAttribute k definování
TestMethod1
v jazyce C# neboTestSub
v jazyce Visual Basic.
Každá metoda označená metodou [TestMethod] v testovací třídě označené pomocí třídy [TestClass] se spustí automaticky při spuštění testu jednotek.
Přidání odkazu na projekt
Aby testovací projekt fungoval s StringLibrary
třídou, přidejte do projektu StringLibrary
StringLibraryTest odkaz.
V Průzkumníku řešení klikněte pravým tlačítkem myši na uzel Závislosti projektu StringLibraryTest a v místní nabídce vyberte Přidat odkaz na projekt.
V dialogovém okně Správce odkazů rozbalte uzel Projekty a vyberte pole vedle StringLibrary. Přidání odkazu na
StringLibrary
sestavení umožňuje kompilátoru najít metody StringLibrary při kompilaci stringLibraryTest projektu.Vyberte OK.
Přidání a spuštění metod testování jednotek
Když Visual Studio spustí test jednotek, spustí každou metodu označenou atributem TestMethodAttribute ve třídě, která je označena atributem TestClassAttribute . Testovací metoda skončí, když se najde první selhání nebo když všechny testy obsažené v metodě proběhly úspěšně.
Nejběžnější testy volají členy Assert třídy. Mnoho metod assert zahrnuje alespoň dva parametry, jeden z nich je očekávaný výsledek testu a druhý z nich je skutečný výsledek testu. Některé z Assert
nejčastěji nazývaných metod třídy jsou uvedené v následující tabulce:
Metody Assert | Funkce |
---|---|
Assert.AreEqual |
Ověřuje, že jsou dvě hodnoty nebo objekty stejné. Kontrolní výraz selže, pokud se hodnoty nebo objekty nerovnají. |
Assert.AreSame |
Ověřuje, že dvě proměnné objektu odkazují na stejný objekt. Kontrolní výraz selže, pokud proměnné odkazují na různé objekty. |
Assert.IsFalse |
Ověřuje, že podmínka je false . Kontrolní výraz selže, pokud je true podmínka . |
Assert.IsNotNull |
Ověřuje, že objekt není null . Výraz selže, pokud je null objekt . |
Můžete také použít metodu Assert.ThrowsException v testovací metodě k označení typu výjimky, kterou má vyvolat. Test selže, pokud není vyvolán zadaná výjimka.
Při testování StringLibrary.StartsWithUpper
metody chcete zadat řadu řetězců, které začínají velkými písmeny. Očekáváte, že se metoda v těchto případech vrátí true
, takže můžete metodu Assert.IsTrue volat. Podobně chcete zadat řadu řetězců, které začínají něčím jiným než velkým znakem. Očekáváte, že se metoda v těchto případech vrátí false
, takže můžete metodu Assert.IsFalse volat.
Vzhledem k tomu, že vaše metoda knihovny zpracovává řetězce, chcete se také ujistit, že úspěšně zpracovává prázdný řetězec (String.Empty
), platný řetězec, který neobsahuje žádné znaky a jehož Length je 0, a null
řetězec, který nebyl inicializován. Můžete volat StartsWithUpper
přímo jako statickou metodu a předat jeden String argument. Nebo můžete volat StartsWithUpper
jako rozšiřující metodu pro proměnnou přiřazenou string
null
.
Definujete tři metody, z nichž každá volá metodu Assert pro každý prvek v řetězcovém poli. Zavoláte přetížení metody, které vám umožní zadat chybovou zprávu, která se zobrazí v případě selhání testu. Zpráva identifikuje řetězec, který způsobil selhání.
Vytvoření testovacích metod:
V okně kódu UnitTest1.cs nebo UnitTest1.vb nahraďte kód následujícím kódem:
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)); } } } }
Imports Microsoft.VisualStudio.TestTools.UnitTesting Imports UtilityLibraries Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Public Sub TestStartsWithUpper() ' Tests that we expect to return true. Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsTrue(result, $"Expected for '{word}': true; Actual: {result}") Next End Sub <TestMethod> Public Sub TestDoesNotStartWithUpper() ' Tests that we expect to return false. Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " "} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsFalse(result, $"Expected for '{word}': false; Actual: {result}") Next End Sub <TestMethod> Public Sub DirectCallWithNullOrEmpty() ' Tests that we expect to return false. Dim words() As String = {String.Empty, Nothing} For Each word In words Dim result As Boolean = StringLibrary.StartsWithUpper(word) Assert.IsFalse(result, $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}") Next End Sub End Class End Namespace
Test velkých písmen v
TestStartsWithUpper
metodě obsahuje řecké velké písmeno alfa (U+0391) a velké písmeno cyrilice EM (U+041C). Test malých písmen vTestDoesNotStartWithUpper
metodě obsahuje řecké malé písmeno alfa (U+03B1) a malé písmeno cyrilice Ghe (U+0433).Na řádku nabídek vyberte Soubor>Save UnitTest1.cs As nebo File>Save UnitTest1.vb As. V dialogovém okně Uložit soubor jako vyberte šipku vedle tlačítka Uložit a vyberte Uložit s kódováním.
V dialogovém okně Potvrdit uložit jako vyberte tlačítko Ano a soubor uložte.
V dialogovém okně Upřesnit možnosti uložení vyberte Unicode (UTF-8 s podpisem) - Znaková stránka 65001 z rozevíracího seznamu Kódování a vyberte OK.
Pokud zdrojový kód neuložíte jako soubor s kódováním UTF8, visual Studio ho může uložit jako soubor ASCII. V takovém případě modul runtime přesně nekóduje znaky UTF8 mimo rozsah ASCII a výsledky testu nebudou správné.
Na řádku nabídek vyberte Test>Spustit všechny testy. Pokud se okno Průzkumníka testů neotevře, otevřete ho výběrem Průzkumníka testů>. Tyto tři testy jsou uvedeny v části Úspěšné testy a v části Souhrn se zobrazí zpráva o výsledku spuštění testu.
Zpracování selhání testů
Pokud provádíte vývoj řízený testy (TDD), nejdřív napíšete testy a při prvním spuštění selžou. Pak do aplikace přidáte kód, který test uspěje. Pro účely tohoto kurzu jste vytvořili test po napsání kódu aplikace, který ověří, takže se test nepovede. Pokud chcete ověřit, že test selže, když očekáváte, že selže, přidejte do vstupu testu neplatnou hodnotu.
words
Upravte pole vTestDoesNotStartWithUpper
metodě tak, aby zahrnoval řetězec Error. Soubor nemusíte ukládat, protože Visual Studio automaticky ukládá otevřené soubory při sestavení řešení pro spouštění testů.string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }
Spusťte test výběrem možnosti Test>Run All Tests (Spustit všechny testy) na řádku nabídek. Okno Průzkumníka testů označuje, že dva testy proběhly úspěšně a jeden selhal.
Vyberte neúspěšný test .
TestDoesNotStartWith
V okně Průzkumníka testů se zobrazí zpráva vytvořená výrazem Assert.IsFalse se nezdařila. Byl očekáváno pro chybu: false; actual: True". Kvůli selhání nebyly po otestování chyby v poli žádné řetězce.
Odeberte řetězec Chyba, který jste přidali v kroku 1. Znovu spusťte test a testy projdou.
Testování verze knihovny
Teď, když testy proběhly při spuštění sestavení ladění knihovny, spusťte testy ještě jednou oproti sestavení vydané verze knihovny. Řada faktorů, včetně optimalizací kompilátoru, může někdy způsobit jiné chování mezi sestaveními Debug a Release.
Otestování sestavení vydané verze:
Na panelu nástrojů sady Visual Studio změňte konfiguraci sestavení z ladění na verzi.
V Průzkumníku řešení klikněte pravým tlačítkem myši na projekt StringLibrary a v místní nabídce vyberte Sestavit a knihovnu znovu zkompilujte.
Testy jednotek spusťte tak, že v řádku nabídek vyberete Možnost Spustit>všechny testy. Testy jsou úspěšné.
Ladění testů
Pokud jako integrované vývojové prostředí používáte Visual Studio, můžete použít stejný postup uvedený v kurzu: Ladění konzolové aplikace .NET pomocí sady Visual Studio k ladění kódu pomocí projektu testování jednotek. Místo spuštění projektu aplikace ShowCase klikněte pravým tlačítkem myši na projekt StringLibraryTests a v místní nabídce vyberte Ladit testy .
Visual Studio spustí testovací projekt s připojeným ladicím programem. Provádění se zastaví na libovolné zarážce, kterou jste přidali do testovacího projektu nebo základního kódu knihovny.
Další prostředky
Další kroky
V tomto kurzu jste otestovali knihovnu tříd. Knihovnu můžete zpřístupnit ostatním tak, že ji publikujete do NuGetu jako balíček. Postup najdete v kurzu NuGet:
Pokud publikujete knihovnu jako balíček NuGet, můžou ji nainstalovat a používat i ostatní uživatelé. Postup najdete v kurzu NuGet:
Knihovna nemusí být distribuována jako balíček. Může být součástí konzolové aplikace, která ji používá. Informace o publikování konzolové aplikace najdete v předchozím kurzu této série: