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


Az élő egység tesztelésének első lépései

Ha engedélyezi az élő egység tesztelését egy Visual Studio-megoldásban, az vizuálisan ábrázolja a teszt lefedettségét és a tesztek állapotát. Az Élő egység tesztelése emellett dinamikusan hajtja végre a teszteket, amikor módosítja a kódot, és azonnal értesíti, ha a módosítások a tesztek sikertelenségét okozzák.

Az élő egységtesztelés a .NET-keretrendszert, a .NET Core-t vagy a .NET 5+-t célzó megoldások tesztelésére használható. Ebben az oktatóanyagban megtanulhatja, hogyan használhatja az élő egységtesztelést egy egyszerű osztálykönyvtár létrehozásával, amely a .NET-et célozza, és létrehoz egy MSTest-projektet, amely a .NET-et célozza a teszteléshez.

A teljes C#-megoldás letölthető a GitHubon található MicrosoftDocs/visualstudio-docs adattárból.

Előfeltételek

Ehhez az oktatóanyaghoz telepítenie kell a Visual Studio Enterprise verziót a .NET asztali fejlesztési munkaterheléssel.

A megoldás és az osztálytár projekt létrehozása

Először hozzon létre egy UtilityLibraries nevű Visual Studio-megoldást, amely egyetlen .NET-osztálytárprojektből, a StringLibrary-ből áll.

A megoldás csak egy tároló egy vagy több projekthez. Üres megoldás létrehozásához nyissa meg a Visual Studiót, és tegye a következőket:

  1. Válassza a Fájl>Új>projekt lehetőséget a Visual Studio menü felső szintjéről.

  2. Írja be megoldás a sablon keresőmezőbe, majd válassza ki az Üres megoldás sablont. Nevezze el a projektet UtilityLibraries.

  3. Fejezze be a megoldás létrehozását.

Most, hogy létrehozta a megoldást, létre fog hozni egy StringLibrary nevű osztálytárat, amely számos kiterjesztési metódust tartalmaz a sztringek használatához.

  1. A Megoldáskezelőkattintson a jobb gombbal az UtilityLibraries megoldásra, és válassza >Új projekthozzáadása lehetőséget.

  2. Írja be osztálytár a sablon keresőmezőbe, és válassza ki a Osztálytár sablont, amely a .NET-et vagy a .NET Standardot célozza. Kattintson a Továbbgombra.

  3. Nevezze el a projektet StringLibrary.

  4. Kattintson a projekt létrehozásához a létrehozása gombra.

  5. Cserélje le a kódszerkesztőben lévő összes meglévő kódot a következő kódra:

    using System;
    
    namespace UtilityLibraries
    {
        public static class StringLibrary
        {
            public static bool StartsWithUpper(this string s)
            {
                if (String.IsNullOrWhiteSpace(s))
                    return false;
    
                return Char.IsUpper(s[0]);
            }
    
            public static bool StartsWithLower(this string s)
            {
                if (String.IsNullOrWhiteSpace(s))
                    return false;
    
                return Char.IsLower(s[0]);
            }
    
            public static bool HasEmbeddedSpaces(this string s)
            {
                foreach (var ch in s.Trim())
                {
                    if (ch == ' ')
                        return true;
                }
                return false;
            }
        }
    }
    

    A StringLibrary három statikus metódust tartalmaz:

    • StartsWithUpper visszaadja true, ha egy karakterlánc nagybetűvel kezdődik; ellenkező esetben falsead vissza.

    • StartsWithLower true ad vissza, ha egy karakterlánc kisbetűvel kezdődik; egyébként falsead vissza.

    • HasEmbeddedSpaces true-et ad vissza, ha egy sztring beágyazott szóköz karaktert tartalmaz; ellenkező esetben false-t ad vissza.

  6. Válassza Build>Build Solution lehetőséget a felső szintű Visual Studio menüből. A buildnek sikeresnek kell lennie.

A tesztprojekt létrehozása

A következő lépés az egységtesztelési projekt létrehozása a StringLibrary-kódtár teszteléséhez. Hozza létre az egységteszteket az alábbi lépések végrehajtásával:

  1. A Megoldáskezelőbenkattintson a jobb gombbal az UtilityLibraries megoldásra, és válassza az Új projekt hozzáadása>lehetőséget.

  2. Írja be egységteszt a sablon keresőmezőbe, válassza ki a C# nyelvet, majd válassza ki a .NET-sablonhoz tartozó MSTest Unit Test Project. Kattintson a Továbbgombra.

    Jegyzet

    A Visual Studio 2019 16.9-es verziójában az MSTest projektsablon neve Unit Test Project.

  3. Nevezze el a projektet StringLibraryTests, majd kattintson a Továbbgombra.

  4. Válassza ki az ajánlott cél keretrendszert vagy a .NET 8-at, majd válassza a Létrehozáslehetőséget.

    Jegyzet

    Ez az első lépések oktatóanyaga az MSTest tesztelési keretrendszerrel végzett élő egységtesztelést használja. Az xUnit és az NUnit tesztelési keretrendszereket is használhatja.

  5. Az egységtesztelési projekt nem tud automatikusan hozzáférni a tesztelt osztálytárhoz. A teszttárhoz úgy adhat hozzáférést, hogy hozzáad egy hivatkozást az osztálytár projekthez. Ehhez kattintson a jobb gombbal a StringLibraryTests projektre, és válassza a >Projekthivatkozás hozzáadásalehetőséget. A Reference Manager párbeszédpanelen győződjön meg arról, hogy a Megoldás lap ki van jelölve, és válassza ki a StringLibrary projektet az alábbi ábrán látható módon.

    Referenciakezelő párbeszédpanel

    Referenciakezelő párbeszédpanel

  6. Cserélje le a sablon által biztosított kazánlemezegység-tesztkódot a következő kódra:

    using System;
    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,
                                  $"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 ? "<null>" : word)}': " +
                                   $"false; Actual: {result}");
                }
            }
        }
    }
    
  7. Mentse a projektet az eszköztár Mentés ikonjára kattintva.

    Mivel az egységteszt kódja tartalmaz néhány nem ASCII-karaktert, az alábbi párbeszédpanel figyelmezteti, hogy egyes karakterek elvesznek, ha a fájlt az alapértelmezett ASCII formátumban menti.

  8. Válassza a Mentés más kódolással gombot.

    Fájlkódoló kiválasztása

    Fájlkódoló kiválasztása

  9. A Kódolási legördülő lista a Advance Save Options párbeszédpanelen belül válassza a Unicode (UTF-8 aláírás nélkül) – Codepage 65001lehetőséget, ahogy az alábbi ábrán látható.

    Az UTF-8 kódolási kiválasztása

  10. Állítsa össze az egységtesztelési projektet a felső szintű Visual Studio menü Build>Rebuild Solution kiválasztásával.

Létrehozott egy osztálykönyvtárat, valamint néhány egységtesztet is hozzá. Ezzel befejezte az élő egységtesztelés használatához szükséges előtagokat.

Élő egység tesztelésének engedélyezése

Eddig, bár megírta a StringLibrary osztály könyvtárának tesztjeit, még nem hajtotta végre őket. Az élő egységtesztelés automatikusan végrehajtja őket, miután engedélyezte. Ehhez tegye a következőket:

  1. Ha szeretné, válassza ki a StringLibrary kódját tartalmazó kódszerkesztő ablakot. Ez vagy egy C#-projekthez Class1.cs, vagy egy Visual Basic-projekthez Class1.vb. (Ez a lépés lehetővé teszi, hogy vizuálisan megvizsgálja a tesztek eredményét és a kódlefedettség mértékét az élő egység tesztelésének engedélyezése után.)

  2. Válassza Teszt>Élő egység tesztelése> indítása a felső szintű Visual Studio menüből.

  3. Ellenőrizze az élő egység tesztelésének konfigurációját úgy, hogy az adattár gyökérkönyvtára tartalmazza a forrásfájlok elérési útját mind a segédprogramprojekthez, mind a tesztprojekthez. Válassza a(z) Következő, majd a(z) Befejezéslehetőséget.

  1. Az Élő egység tesztelése ablakban válassza ki a tartalmazza az összes tesztet hivatkozást (Másik lehetőségként válassza a Lejátszási lista gomb ikont, majd válassza a StringLibraryTest, amely az alatta lévő összes tesztet kiválasztja. Ezután törölje a lejátszási lista gomb kijelölését a szerkesztési módból való kilépéshez.)

  2. A Visual Studio újraépíti a projektet, és elindítja az élő egységtesztet, amely automatikusan futtatja az összes tesztet.

  1. A Visual Studio újraépíti a projektet, és elindítja az élő egységtesztet, amely automatikusan futtatja az összes tesztet.

Amikor befejezi a tesztek futtatását, Élő egység tesztelése megjeleníti az összesített eredményeket és az egyes tesztek eredményét. Emellett a kódszerkesztő ablaka grafikusan megjeleníti a tesztkód lefedettségét és a tesztek eredményét is. Ahogy az alábbi ábrán látható, mindhárom teszt sikeresen lefutott. Azt is megmutatja, hogy a teszteink lefedték az StartsWithUpper metódus összes kódútvonalát, és az összes teszt sikeresen végrehajtotta őket (amit a "✓" zöld pipa jelez). Végül azt mutatja, hogy a StringLibrary többi metódusa egyik sem rendelkezik kódlefedettségekkel (amelyet kék vonal jelez, "➖").

Az Élő Teszt Böngésző és a kódszerkesztő ablaka az Élő egységteszt indítása után

Az Élő tesztkezelő és a kódszerkesztő ablaka az Élő egység tesztelésének indítása után

A tesztlefedettségről és a teszteredményekről a kódszerkesztő ablakában egy adott kódlefedettségi ikon kiválasztásával részletesebb információkat is kaphat. A részletek vizsgálatához tegye a következőket:

  1. Kattintson a zöld pipára annál a sornál, amely if (String.IsNullOrWhiteSpace(s))-ként van jelölve a StartsWithUpper metódusban. Ahogy az alábbi ábrán látható, az Élő egység tesztelése azt jelzi, hogy három teszt fedi le ezt a kódsort, és mindegyik sikeresen végrehajtotta.

    feltételes utasítás 'if' kódlefedettsége

    az if feltételes utasítás kódlefedettsége

  2. Kattintson a zöld pipára azon a vonalon, amely return Char.IsUpper(s[0])-t tartalmaz a StartsWithUpper metódusban. Ahogy az alábbi ábrán látható, az Élő egység tesztelése azt jelzi, hogy csak két teszt fedi le ezt a kódsort, és hogy mindegyik sikeresen végrehajtotta.

    A visszatérési utasítás kódlefedettsége

    A visszatérési utasítás kódlefedettsége

Az Élő egység tesztelése által azonosított fő probléma a hiányos kódlefedettség. A következő szakaszban majd te foglalkozol vele.

A tesztlefedettség bővítése

Ebben a szakaszban az egységteszteket a StartsWithLower metódusra fogja kiterjeszteni. Amíg ezt teszi, az élő egység tesztelése dinamikusan folytatja a kód tesztelését.

A kódlefedettség StartsWithLower metódusra való kiterjesztéséhez tegye a következőket:

  1. Adja hozzá a következő TestStartsWithLower és TestDoesNotStartWithLower metódusokat a projekt teszt forráskódfájljához:

    // Code to add to UnitTest1.cs
    [TestMethod]
    public void TestStartsWithLower()
    {
        // Tests that we expect to return true.
        string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство" };
        foreach (var word in words)
        {
            bool result = word.StartsWithLower();
            Assert.IsTrue(result,
                          $"Expected for '{word}': true; Actual: {result}");
        }
    }
    
    [TestMethod]
    public void TestDoesNotStartWithLower()
    {
        // Tests that we expect to return false.
        string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва",
                           "1234", ".", ";", " "};
        foreach (var word in words)
        {
            bool result = word.StartsWithLower();
            Assert.IsFalse(result,
                           $"Expected for '{word}': false; Actual: {result}");
        }
    }
    
  2. Módosítsa a DirectCallWithNullOrEmpty metódust úgy, hogy közvetlenül a hívás után hozzáadja a következő kódot a Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsFalse metódushoz.

    // Code to add to UnitTest1.cs
    result = StringLibrary.StartsWithLower(word);
    Assert.IsFalse(result,
                   $"Expected for '{(word == null ? "<null>" : word)}': " +
                   $"false; Actual: {result}");
    
  3. Az Élő egység tesztelése automatikusan végrehajtja az új és módosított teszteket a forráskód módosításakor. Ahogy az alábbi ábrán látható, az összes teszt sikeres volt, beleértve a hozzáadott kettőt és a módosított teszteket is.

    Az Élő Teszt Explorer a tesztlefedettség bővítése után

    Az Élő Tesztfelfedező a tesztlefedettség kibővítése után

  4. Váltson arra az ablakra, amely a StringLibrary osztály forráskódját tartalmazza. Az élő egység tesztelése most azt mutatja, hogy a kódlefedettség ki van terjesztve a StartsWithLower metódusra.

    StartsWithLower metódus kódlefedettségi

    A StartsWithLower metódus kódlefedettségének vizsgálata

Bizonyos esetekben előfordulhat, hogy az Test Explorer sikeres tesztjei szürkítve jelennek meg. Ez azt jelzi, hogy egy teszt végrehajtása folyamatban van, vagy hogy a teszt nem futott újra, mert nem történt olyan kódmódosítás, amely hatással lenne a tesztre a legutóbbi végrehajtás óta.

Eddig minden tesztünk sikeres volt. A következő szakaszban megvizsgáljuk, hogyan kezelheti a teszthibát.

Teszthiba kezelése

Ebben a szakaszban megtudhatja, hogyan használhatja az élő egységtesztelést a tesztelési hibák azonosítására, hibaelhárítására és elhárítására. Ezt úgy teheti meg, hogy kibővíti a tesztelési lefedettséget a HasEmbeddedSpaces metódusra.

  1. Adja hozzá a következő metódust a tesztfájlhoz:

    [TestMethod]
    public void TestHasEmbeddedSpaces()
    {
        // Tests that we expect to return true.
        string[] phrases = { "one car", "Name\u0009Description",
                             "Line1\nLine2", "Line3\u000ALine4",
                             "Line5\u000BLine6", "Line7\u000CLine8",
                             "Line0009\u000DLine10", "word1\u00A0word2" };
        foreach (var phrase in phrases)
        {
            bool result = phrase.HasEmbeddedSpaces();
            Assert.IsTrue(result,
                          $"Expected for '{phrase}': true; Actual: {result}");
        }
    }
    
  2. A teszt végrehajtásakor az Élő egység tesztelése azt jelzi, hogy a TestHasEmbeddedSpaces metódus sikertelen volt, ahogy az alábbi ábrán látható:

    Az Élő Teszt Felfedező azt jelenti, hogy egy teszt sikertelen

    Az Élő Tesztfelfedező jelenti, hogy egy teszt sikertelen

  3. Jelölje ki a kódtár kódját megjelenítő ablakot. A Live Unit Testing kiterjesztette a kódlefedettséget a HasEmbeddedSpaces metódusra. A teszthibát úgy is bejelenti, hogy a piros „🞩” hozzáadva jelenik meg a sikertelen tesztek által érintett sorokon.

  4. Vigye az egeret a HasEmbeddedSpaces metódus aláírását tartalmazó sor fölé. Az Élő egység tesztelése egy elemleírást jelenít meg, amely azt jelenti, hogy a metódust egy teszt fedi le, ahogy az alábbi ábrán látható:

    Sikertelen tesztről szóló információk az élő egységtesztelésnél

    Élő tesztegység adatai sikertelen tesztről

  5. Válassza ki a sikertelen TestHasEmbeddedSpaces tesztet. Az élő egység tesztelése néhány lehetőséget kínál, például az összes teszt futtatását és az összes teszt hibakeresését, ahogyan az alábbi ábrán látható:

    Élő egységtesztelési beállítások sikertelen teszt esetén

    Élő egységtesztelés lehetőségei sikertelen teszthez

  6. Válassza a Összes teszt hibakeresése lehetőséget a sikertelen teszt hibakereséséhez.

  7. A Visual Studio hibakeresési módban hajtja végre a tesztet.

    A teszt hozzárendeli egy tömb minden sztringét egy phrase nevű változóhoz, és átadja azt a HasEmbeddedSpaces metódusnak. A program végrehajtása szünetel, és meghívja a hibakeresőt az első alkalommal, amikor az ellenőrző kifejezés false. A Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue metódus hívása során fellépő váratlan értékből eredő kivételdialógus az alábbi ábrán látható.

    Élő egységtesztelés kivétel párbeszédablak

    Élő egység tesztelés kivételdialógus

    Emellett a Visual Studio által biztosított összes hibakeresési eszköz elérhető a sikertelen teszt hibáinak elhárításához, ahogyan az alábbi ábrán látható:

    Visual Studio hibakeresési eszközei

    Visual Studio hibakeresési eszközei

    Az Automatikus ablakban vegye figyelembe, hogy a phrase változó értéke "Name\tDescription", amely a tömb második eleme. A tesztelési módszer azt várja, hogy amikor ez a sztring átadásra kerül, HasEmbeddedSpaces visszaadja true-et; ehelyett falsekerül visszaadásra. Nyilvánvaló, hogy nem ismeri fel a "\t" karaktert, a tabulátorjelet beágyazott szóközként.

  8. Válassza Hibakeresés>Folytatás, nyomja le F5, vagy kattintson az eszköztár Folytatás gombjára a tesztprogram végrehajtásának folytatásához. Mivel nem kezelt kivétel történt, a teszt leáll. Ez elegendő információt nyújt a hiba előzetes vizsgálatához. Vagy TestHasEmbeddedSpaces (a tesztelési rutin) helytelen feltételezést tett, vagy HasEmbeddedSpaces nem ismeri fel megfelelően az összes beágyazott szóközt.

  9. A probléma diagnosztizálásához és javításához kezdje a StringLibrary.HasEmbeddedSpaces metódussal. Tekintse meg az összehasonlítást a HasEmbeddedSpaces metódusban. A beágyazott területet U+0020-nak tekinti. A Unicode Standard azonban számos más szóközkaraktert is tartalmaz. Ez arra utal, hogy a könyvtárkód helytelenül vizsgált egy szóköz karakter meglétét.

  10. Cserélje le az egyenlőségi összehasonlítást egy hívásra a System.Char.IsWhiteSpace metódushoz.

    if (Char.IsWhiteSpace(ch))
    
  11. Az élő egység tesztelése automatikusan újrafuttatja a sikertelen tesztelési módszert.

    Az élő egységtesztelés megjeleníti a frissített eredményeket, amelyek a kódszerkesztő ablakban is megjelennek.