Megosztás a következőn keresztül:


Oktatóanyag: .NET osztálykódtár tesztelése

Ez az oktatóanyag bemutatja, hogyan automatizálhatja az egységtesztelést egy tesztprojekt megoldáshoz való hozzáadásával.

Előfeltételek

Ez az oktatóanyag a .NET osztálytár létrehozása.

Egységtesztelési projekt létrehozása

Az egységtesztek automatizált szoftvertesztelést biztosítanak a fejlesztés és a közzététel során. MSTest a három választható tesztelési keretrendszer egyike. A többi xUnit és nUnit.

  1. Indítsa el Visual Studio.

  2. Nyissa meg a ClassLibraryProjects megoldást, amelyet a Hozzon létre egy .NET osztálytárat során hozott létre.

  3. Adjon hozzá egy "StringLibraryTest" nevű új egységtesztelési projektet a megoldáshoz.

    1. Kattintson a jobb gombbal a megoldásra a Solution Explorer és válassza a Add>Új projekt lehetőséget.

    2. Az Új projekt hozzáadása oldalon írja be mstest a keresőmező mezőbe. Válassza a C# vagy Visual Basic lehetőséget a Nyelv listából, majd válassza All platform lehetőséget a Platform listából.

    3. Válassza a MSTest Test Project sablont, majd válassza a Továbblehetőséget.

    4. Az Új projekt konfigurálása lapon írja be StringLibraryTest a Projekt neve mezőbe. Ezután válassza a Tovább gombot.

    5. A Címadatok lapon válassza a .NET 10 lehetőséget a Framework mezőben, válassza a Microsoft.Testing.Platform lehetőséget a Test futóhoz, majd válassza a Create lehetőséget.

    Adja meg az MSTest Test Projecthez szükséges további információkat

  4. Visual Studio létrehozza a projektet, és megnyitja az osztályfájlt a kódablakban az alábbi kóddal. Ha a használni kívánt nyelv nem jelenik meg, módosítsa a nyelvválasztót a lap tetején.

    namespace StringLibraryTest
    {
    
        [TestClass]
        public sealed class Test1
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class Test1
            <TestMethod>
            Sub TestSub()
    
            End Sub
        End Class
    End Namespace
    

    Az egységtesztsablon által létrehozott forráskód a következőket teszi:

    A [TestClass] címkével ellátott tesztosztályban a [TestMethod] címkével ellátott metódusok automatikusan futnak az egységteszt futtatásakor.

  1. Indítsa el a Visual Studio Code.

  2. Nyissa meg a ClassLibraryProjects megoldást, amelyet a Hozzon létre egy .NET osztálytárat részben hozott létre.

  3. A Solution Explorer területen válassza a New Project lehetőséget, vagy a Parancskatalógusban válassza a .NET: Új projekt lehetőséget.

  4. Válassza az MSTest Test Project elemet, nevezze el "StringLibraryTest"-nek, válassza ki az alapértelmezett könyvtárat, és válassza a Projekt létrehozása lehetőséget.

    A projektsablon létrehozza a StringLibraryTest/Test1.cs a következő kóddal:

    namespace StringLibraryTest;
    
    [TestClass]
    public class Test1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    

    Az egységtesztsablon által létrehozott forráskód a következőket teszi:

    A [TestClass] címkével ellátott tesztosztályban a [TestMethod] címkével ellátott metódusok automatikusan futnak az egységteszt meghívásakor.

  1. Nyissa meg a terminált, és keresse meg a StringLibrary és a ShowCase projekteket tartalmazó oktatóanyagok mappát.

  2. Hozzon létre egy új MSTest tesztprojektet:

    dotnet new mstest -n StringLibraryTest
    

    A projektsablon létrehozza a StringLibraryTest/Test1.cs a következő kóddal:

    namespace StringLibraryTest;
    
    [TestClass]
    public class Test1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    

    Az egységtesztsablon által létrehozott forráskód a következőket teszi:

    A [TestClass] címkével ellátott tesztosztályban a [TestMethod] címkével ellátott metódusok automatikusan futnak az egységteszt meghívásakor.

Projekthivatkozás hozzáadása

Ahhoz, hogy a tesztprojekt működjön az StringLibrary osztálysal, adjon hozzá egy hivatkozást a StringLibraryTest projekthez StringLibrary .

  1. A Solution Explorer-ben kattintson a jobb gombbal a Dependencies csomópontjára a StringLibraryTest projektben, és válassza a Add Project Reference lehetőséget a helyi menüben.

  2. A Referenciakezelő párbeszédpanelen válassza a StringLibrary melletti jelölőnégyzetet.

    Adja hozzá a StringLibrary-t projekthivatkozásként a StringLibraryTesthez.

  3. Kattintson az OK gombra.

  1. A Solution Explorer jobb gombbal kattintson a StringLibraryTest projektre, és válassza a Projekthivatkozás hozzáadása lehetőséget.

  2. Válassza a "StringLibrary" lehetőséget.

  1. Lépjen a StringLibraryTest mappába, és adja hozzá a projekthivatkozást:

    cd StringLibraryTest
    dotnet add reference ../StringLibrary/StringLibrary.csproj
    

Egységtesztelési módszerek hozzáadása és futtatása

Amikor egy egységteszt fut, az TestMethodAttribute attribútummal megjelölt osztályban lévő összes metódus automatikusan végrehajtja az TestClassAttribute attribútumot. A tesztmetódus az első hiba vagy a metódusban található összes teszt sikeressége esetén ér véget.

A leggyakoribb tesztek az Assert osztály tagjait hívják meg. Számos érvényesítési módszer tartalmaz legalább két paramétert, amelyek közül az egyik a várt vizsgálati eredmény, a másik pedig a tényleges teszteredmény. Az Assert osztály leggyakrabban nevezett módszereinek némelyike az alábbi táblázatban látható:

Assertálási módszerek Funkció
Assert.AreEqual Ellenőrzi, hogy két érték vagy objektum egyenlő-e. Az állítás meghiúsul, ha az értékek vagy objektumok nem egyenlők.
Assert.AreSame Ellenőrzi, hogy két objektumváltozó ugyanarra az objektumra hivatkozik-e. Az állítás meghiúsul, ha a változók különböző objektumokra hivatkoznak.
Assert.IsFalse Ellenőrzi, hogy egy feltétel false-e. Az állítás meghiúsul, ha a feltétel true.
Assert.IsNotNull Ellenőrzi, hogy egy objektum nem null. Az állítás meghiúsul, ha az objektum null.

A metódust egy Assert.Throws tesztmetódusban is használhatja annak jelzésére, hogy milyen típusú kivétel várható. A teszt sikertelen, ha a megadott kivétel nincs dobva.

A StringLibrary.StartsWithUpper metódus tesztelése során több olyan karakterláncot szeretne megadni, amelyek nagybetűvel kezdődnek. Ezekben az esetekben a metódus várhatóan true ad vissza, így meghívhatja a Assert.IsTrue metódust. Hasonlóképpen több sztringet is meg szeretne adni, amelyek nem nagybetűvel kezdődnek. Ezekben az esetekben a metódus várhatóan false ad vissza, így meghívhatja a Assert.IsFalse metódust.

Mivel a kódtár metódusa sztringeket kezel, azt is meg kell győződnie arról, hogy sikeresen kezeli az üres sztringet (String.Empty) és egy sztringet null . Az üres sztring olyan, amelynek nincs karaktere, és amelynek Length értéke 0. A null sztring nem inicializálódott. Közvetlenül meghívhatja a StartsWithUpper statikus metódust és átadhat egyetlen String argumentumot. Vagy meghívhatja StartsWithUpper kiterjesztési metódusként egy null-hoz rendelt string változón.

Három metódust fog definiálni, amelyek mindegyike metódust Assert hív meg egy sztringtömb minden eleméhez. Egy metódus túlterhelését fogja meghívni, amely lehetővé teszi egy hibaüzenet megadását, amely teszthiba esetén jelenik meg. Az üzenet azonosítja a hibát okozó sztringet.

A tesztelési módszerek létrehozása:

  1. A Test1.cs vagy Test1.vb kódablakban cserélje le a kódot a következő kódra:

    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public sealed class Test1
        {
            [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {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
    

    A TestStartsWithUpper metódus nagybetűinek vizsgálata magában foglalja a görög alfa betűt (U+0391) és az EM cirill betűt (U+041C). A kisbetűk vizsgálata a TestDoesNotStartWithUpper metódusban a görög kis alfa betűt (U+03B1) és a cirill kis Ghe betűt (U+0433) tartalmazza.

  2. A menüsávon válassza a Fájl>mentése Test1.cs másként vagy Fájl>mentése Test1.vb másként lehetőséget. A Fájl mentése párbeszédpanelen kattintson a Mentés gomb melletti nyílra, majd válassza a Mentés kódolássallehetőséget.

  3. A Mentés megerősítése párbeszédpanelen kattintson az Igen gombra a fájl mentéséhez.

  4. A Speciális mentési beállítások párbeszédpanelen válassza Unicode (UTF-8 aláírással) – Codepage 65001 a Kódolás legördülő listából, és válassza OKlehetőséget.

    Ha nem tudja UTF8 kódolású fájlként menteni a forráskódot, Visual Studio ASCII-fájlként mentheti. Ha ez történik, a futtatókörnyezet nem tudja pontosan dekódolni az ASCII-tartományon kívüli UTF8 karaktereket, és a teszteredmények nem helyesek.

  5. A menüsávon válassza a Teszt>Az összes teszt futtatásalehetőséget. Ha a Test Explorer ablak nem nyílik meg, nyissa meg a Test>Test Explorerlehetőséget választva. A három teszt a Sikeres tesztek szakaszban található, míg a Összegzés szakasz jelenti a tesztfuttatás eredményét.

    Tesztböngésző ablaka az átmenő tesztekkel

  1. Nyissa meg a StringLibraryTest/Test1.cs elemet, és cserélje le az összes kódot a következő kódra.

    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public sealed class Test1
        {
            [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}");
                }
            }
        }
    }
    

    A TestStartsWithUpper metódus nagybetűinek vizsgálata magában foglalja a görög alfa betűt (U+0391) és az EM cirill betűt (U+041C). A kisbetűk vizsgálata a TestDoesNotStartWithUpper metódusban a görög kis alfa betűt (U+03B1) és a cirill kis Ghe betűt (U+0433) tartalmazza.

  2. Mentse a módosításokat.

Tesztek készítése és futtatása

  1. A Solution Explorer kattintson a jobb gombbal a megoldásra, és válassza a Build vagy a Parancskatalógusban válassza a .NET: Build lehetőséget.

  2. Válassza a Tesztelés ablakot, válassza a Tesztek futtatása vagy a Parancskatalógusban a Tesztelés: Az összes teszt futtatása lehetőséget.

    Visual Studio Code Test Explorer

  1. Nyissa meg a StringLibraryTest/Test1.cs elemet, és cserélje le az összes kódot a következő kódra:

    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public sealed class Test1
        {
            [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}");
                }
            }
        }
    }
    

    A TestStartsWithUpper metódus nagybetűinek vizsgálata magában foglalja a görög alfa betűt (U+0391) és az EM cirill betűt (U+041C). A kisbetűk vizsgálata a TestDoesNotStartWithUpper metódusban a görög kis alfa betűt (U+03B1) és a cirill kis Ghe betűt (U+0433) tartalmazza.

  2. Mentse a módosításokat, és futtassa a teszteket:

    dotnet test
    

    A teszteknek át kell menniük.

Teszthibák kezelése

Ha tesztalapú fejlesztést (TDD) végez, először teszteket kell írnia, és az első futtatáskor sikertelenek lesznek. Ezután kódot ad hozzá az alkalmazáshoz, amely sikeressé teszi a tesztet. Ebben az oktatóanyagban az alkalmazáskód megírása után hoztad létre a tesztet, amit érvényesítesz, így nem láttad, hogy a teszt megbukik. Annak ellenőrzéséhez, hogy egy teszt sikertelen lesz-e, amikor azt várja, adjon hozzá egy érvénytelen értéket a teszt bemenetéhez.

  1. Módosítsa a words tömböt a TestDoesNotStartWithUpper metódusban, hogy tartalmazza a "Hiba" sztringet.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  1. A teszt futtatásához válassza Teszt>Az összes teszt futtatása lehetőséget a menüsávon. A Test Explorer ablak azt jelzi, hogy két teszt sikeres volt, és egy sikertelen volt.

    Tesztkezelő ablak sikertelen tesztekkel

  2. Válassza ki a sikertelen tesztet, TestDoesNotStartWith.

    A Test Explorer ablak a következő állítás által létrehozott üzenetet jeleníti meg: "Assert.IsFalse failed. "Hiba" várható: hamis; tényleges: Igaz." A hiba miatt a tömb "Hiba" utáni sztringjei nem lettek tesztelve.

    az IsFalse állítási hiba esetén a Test Explorer ablak

  1. A tesztek futtatásához kattintson a teszt melletti zöld hibára a szerkesztőben.

    A kimenet azt mutatja, hogy a teszt sikertelen, és hibaüzenetet ad a sikertelen teszthez: "Assert.IsFalse failed. "Hiba" várható: hamis; tényleges: Igaz". A meghibásodás miatt a tömbben a "Hiba" utáni sztringek nem voltak tesztelve.

    Visual Studio Code Sikertelen teszt

  1. Futtassa a teszteket:

    dotnet test
    

    A kimenet azt mutatja, hogy a teszt sikertelen, és hibaüzenetet ad a sikertelen teszthez: "Assert.IsFalse failed. "Hiba" várható: hamis; tényleges: Igaz". A meghibásodás miatt a tömbben a "Hiba" utáni sztringek nem voltak tesztelve.

  1. Távolítsa el a hozzáadott "Hiba" sztringet.

  2. Futtassa újra a tesztet, és a tesztek sikeresek lesznek.

A kódtár kiadási verziójának tesztelése

Most, hogy az összes teszt sikeresen lefutott a kódtár hibakeresési buildjének futtatásakor, futtassa a teszteket még egyszer a kódtár kiadási buildjéhez. Számos tényező, köztük a fordító optimalizációk, néha eltérő viselkedést eredményezhetnek a hibakeresési és gyártási verziók között.

A kiadási build tesztelése:

  1. Az Visual Studio eszköztáron módosítsa a buildkonfigurációt Debug-ről Release értékre.

  2. A Solution Explorer kattintson a jobb gombbal a StringLibrary projektre, és válassza a Build lehetőséget a helyi menüből a kódtár újrafordításához.

  3. Az egységtesztek futtatásához válassza Teszt>Az összes teszt futtatása lehetőséget a menüsávon. A tesztek sikeresek.

Futtassa a teszteket a Release build-konfigurációjával.

dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release

A tesztek sikeresek.

Futtassa a teszteket a Release build-konfigurációjával.

dotnet test --configuration Release

A tesztek sikeresek.

Hibakeresési tesztek

Ha a Visual Studio-t használja fejlesztői környezetként, ugyanezt a folyamatot használhatja, mint amit a Oktatóanyag: Hibakeresés .NET konzolalkalmazásban részben megmutattak, hogy a kódot az egységteszt projekt segítségével hibakeresse. Ahelyett, hogy elindítja a ShowCase alkalmazásprojektet, kattintson a jobb gombbal a StringLibraryTests projektre, és válassza Hibakeresési tesztek lehetőséget a helyi menüből.

Visual Studio elindítja a tesztprojektet a hibakereső csatolásával. A végrehajtás leáll a tesztprojekthez vagy a mögöttes kódtár kódhoz hozzáadott bármely töréspontnál.

Ha a Visual Studio Code-ot használja IDE-ként, akkor ugyanazt a folyamatot követheti, amely a .NET konzolalkalmazás hibakeresése részben látható, hogy hibakeresést végezzen a kódban az egységteszt projekt használatával. A ShowCase alkalmazásprojekt indítása helyett nyissa meg a StringLibraryTest/Test1.cs fájlt, és válassza a Hibakeresési tesztek lehetőséget az aktuális fájlban a 7. és a 8. sor között. Ha nem találja, nyomja le a CtrlShift+P+ a parancskatalógus megnyitásához, és írja be az Újratöltés ablakot.

Visual Studio Code elindítja a tesztprojektet a hibakereső csatolásával. A végrehajtás leáll a tesztprojekthez vagy a mögöttes kódtár kódjához hozzáadott bármely töréspontnál.

További erőforrások

  • Egyenes tesztelés a .NET

Erőforrások törlése

GitHub 30 nap inaktivitás után automatikusan törli a Codespace-t. Ha további oktatóanyagokat tervez ebben a sorozatban, a Codespace üzembe helyezését elhagyhatja. Ha készen áll a .NET webhelyre a .NET SDK letöltéséhez, törölheti a Codespace-t. A Codespace törléséhez nyisson meg egy böngészőablakot, és menjen a a Codespaces felületére. Az ablakban megjelenik a kódterek listája. Válassza ki a három elemet (...) a learn oktatóanyag kódterének bejegyzésében. Ezután válassza a "Törlés" lehetőséget.

Következő lépések

Ebben az oktatóanyagban egy osztálykönyvtárat egységteszteltél. A kódtárat elérhetővé teheti mások számára, ha csomagként közzéteszi azt a NuGetben . Ha szeretné megtudni, hogyan, kövesse a NuGet-oktatóanyagot:

Ha NuGet-csomagként tesz közzé egy tárat, mások is telepíthetik és használhatják. Ha szeretné megtudni, hogyan, kövesse a NuGet-oktatóanyagot:

A kódtárakat nem kell csomagként terjeszteni. Az azt használó konzolalkalmazással együtt is csomagolható. A konzolalkalmazások közzétételének módjáról a sorozat korábbi oktatóanyagában olvashat: