Olvasás angol nyelven

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


Útmutató: Egységtesztek létrehozása és futtatása felügyelt kódhoz

Ez a cikk bemutatja, hogyan hozhat létre, futtathat és szabhat testre egységteszteket a Felügyelt kódhoz készült Microsoft egységteszt-keretrendszer és a Visual Studio Test Explorerhasználatával. Egy fejlesztés alatt álló C#-projekttel kezd, olyan teszteket hoz létre, amelyek a kódját használják, futtatják a teszteket, és megvizsgálják az eredményeket. Ezután módosítsa a projektkódot, és futtassa újra a teszteket. Ha a lépések elvégzése előtt szeretné áttekinteni ezeket a feladatokat, tekintse meg egységteszt alapjait. Ha automatikusan szeretne teszteket létrehozni a meglévő kódból, olvassa el Egységtesztelési metódus-csonkok létrehozásakódból.

Tesztprojekt létrehozása

  1. Nyissa meg a Visual Studiót.

  2. A kezdési ablakban válassza az Új projekt létrehozásalehetőséget.

  3. Keresse meg és jelölje ki a .NET-hez készült C# konzolalkalmazás projektsablont, majd kattintson a Továbbgombra.

    Megjegyzés

    Ha nem látja a Konzolalkalmazás sablont, telepítheti azt a Új projekt létrehozása ablakból. A Nem találja, amit keres? üzenetben válassza a További eszközök és szolgáltatások telepítése hivatkozást. Ezután a Visual Studio Installerben válassza ki a .NET asztali fejlesztési számítási feladatot.

  4. Nevezze el a projektet Bank, majd kattintson a Továbbgombra.

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

    A Bank projekt létrejön és megjelenik a Megoldáskezelőben, a kódszerkesztőben megnyitott Program.cs fájllal.

    Megjegyzés

    Ha Program.cs nincs megnyitva a szerkesztőben, kattintson duplán a fájlra Program.csMegoldáskezelő megnyitásához.

  5. Cserélje le a Program.cs tartalmát az osztályt definiáló következő C#-kódra, BankAccount:

    using System;
    
    namespace BankAccountNS
    {
        /// <summary>
        /// Bank account demo class.
        /// </summary>
        public class BankAccount
        {
            private readonly string m_customerName;
            private double m_balance;
    
            private BankAccount() { }
    
            public BankAccount(string customerName, double balance)
            {
                m_customerName = customerName;
                m_balance = balance;
            }
    
            public string CustomerName
            {
                get { return m_customerName; }
            }
    
            public double Balance
            {
                get { return m_balance; }
            }
    
            public void Debit(double amount)
            {
                if (amount > m_balance)
                {
                    throw new ArgumentOutOfRangeException("amount");
                }
    
                if (amount < 0)
                {
                    throw new ArgumentOutOfRangeException("amount");
                }
    
                m_balance += amount; // intentionally incorrect code
            }
    
            public void Credit(double amount)
            {
                if (amount < 0)
                {
                    throw new ArgumentOutOfRangeException("amount");
                }
    
                m_balance += amount;
            }
    
            public static void Main()
            {
                BankAccount ba = new BankAccount("Mr. Bryan Walton", 11.99);
    
                ba.Credit(5.77);
                ba.Debit(11.22);
                Console.WriteLine("Current balance is ${0}", ba.Balance);
            }
        }
    }
    
  6. Nevezze át a fájlt BankAccount.cs a Megoldáskezelőablakban úgy, hogy kattintson rá a jobb egérgombbal, majd válassza az Átnevezés parancsot.

  7. A Build menüben kattintson Megoldás létrehozása (vagy nyomja le Ctrl + SHIFT + B).

Most már rendelkezik egy tesztelhető módszerekkel rendelkező projekttel. Ebben a cikkben a tesztek a Debit metódusra összpontosítanak. A Debit metódust akkor hívjuk meg, ha pénzt vonunk ki egy számláról.

Egységtesztelési projekt létrehozása

  1. A Fájl menüben válassza >Új projekthozzáadása lehetőséget.

    Tipp.

    Kattintson a jobb gombbal a megoldásra Megoldáskezelő, és válassza a >Új projekt hozzáadásalehetőséget.

  2. Írja be tesztelési a keresőmezőbe, válassza C# nyelvként, majd válassza ki a .NET-sablonhoz tartozó C# MSTest Test Project, majd kattintson a Továbbgombra.

    Megjegyzés

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

  3. Nevezze el a projektet BankTests, 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.

    A Visual Studio 2022 17.10-es verziójától kezdve tesztfuttatót is választhat. A tesztfuttatóhoz választhatja a VSTest vagy a MSTestlehetőséget. További információ a tesztfuttatók közötti különbségről: Microsoft.Testing.Platform és VSTest összehasonlítási.

    A BankTests projekt hozzáadódik a Bank megoldáshoz.

  5. A BankTests projektben adjon hozzá egy hivatkozást a Bank projekthez.

    A Megoldáskezelőben, a BankTests projekt alatt válassza ki a Függőségek elemet, majd kattintson jobb gombbal, és válassza a Hivatkozás hozzáadása (vagy Projekthivatkozás hozzáadása) lehetőséget a megjelenő menüből.

  6. A Referenciakezelő párbeszédpanelen bontsa ki Projektek, válassza Megoldáslehetőséget, majd jelölje be a Bank elemet.

  7. Válassza OKlehetőséget.

A tesztosztály létrehozása

Hozzon létre egy tesztosztályt a BankAccount osztály ellenőrzéséhez. Használhatja a projektsablon által létrehozott UnitTest1.cs fájlt, de leíróbb neveket adhat a fájlnak és az osztálynak.

Fájl és osztály átnevezése

  1. A fájl átnevezéséhez Megoldáskezelőválassza ki a UnitTest1.cs fájlt a BankTests projektben. A jobb gombbal kattintva válassza a Átnevezés (vagy nyomja le F2) lehetőséget, majd nevezze át a fájlt BankAccountTests.cs.

  2. Az osztály átnevezéséhez helyezze a kurzort a UnitTest1 a kódszerkesztőben, kattintson a jobb gombbal, majd válassza Átnevezés (vagy nyomja le F2). Írja be BankAccountTests, majd nyomja le Enterbillentyűt.

A BankAccountTests.cs fájl a következő kódot tartalmazza:

// The 'using' statement for Test Tools is in GlobalUsings.cs
// using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BankTests
{
    [TestClass]
    public class BankAccountTests
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
}

Felhasználói utasítás hozzáadása

Adjon hozzá egy using utasítást, a tesztosztályhoz, hogy teljes név használata nélkül be tudjon hívni a teszt alatt álló projektbe. Az osztályfájl tetején adja hozzá a következőt:

using BankAccountNS;

A tesztosztály követelményei

A tesztosztály minimális követelményei a következők:

  • A [TestClass] attribútum minden olyan osztályhoz szükséges, amely a Test Explorerben futtatni kívánt egységtesztelési metódusokat tartalmazza.

  • Minden olyan tesztmetódusnak, amelyet a Test Explorer felismerni szeretne, rendelkeznie kell a [TestMethod] attribútummal.

A [TestClass] attribútummal nem rendelkező egységtesztelési projektben más osztályokat is használhat, és olyan tesztosztályokban is rendelkezhet más metódusokkal, amelyek nem rendelkeznek a [TestMethod] attribútummal. Ezeket a többi osztályt és metódust a tesztelési módszerekből hívhatja meg.

Az első tesztelési módszer létrehozása

Ebben az eljárásban egységtesztelési módszereket ír a Debit osztály BankAccount metódusának viselkedésének ellenőrzéséhez.

Legalább három viselkedést kell ellenőrizni:

  • A metódus ArgumentOutOfRangeException ad, ha a terhelés összege nagyobb, mint az egyenleg.

  • A metódus ArgumentOutOfRangeException ad, ha a terhelés összege nullánál kisebb.

  • Ha a terhelési összeg érvényes, a metódus kivonja a terhelés összegét a számla egyenlegéből.

Tipp.

Törölheti az alapértelmezett TestMethod1 metódust, mert ebben az útmutatóban nem fogja használni.

Tesztmetódus létrehozása

Az első teszt ellenőrzi, hogy egy érvényes összeg (vagyis a számlaegyenlegnél kisebb és nullánál nagyobb) a megfelelő összeget vonja-e ki a számláról. Adja hozzá a következő metódust az BankAccountTests osztályhoz:

[TestMethod]
public void Debit_WithValidAmount_UpdatesBalance()
{
    // Arrange
    double beginningBalance = 11.99;
    double debitAmount = 4.55;
    double expected = 7.44;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // Act
    account.Debit(debitAmount);

    // Assert
    double actual = account.Balance;
    Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly");
}

A módszer egyszerű: beállít egy új BankAccount objektumot egy kezdőegyenleggel, majd visszavon egy érvényes összeget. A Assert.AreEqual metódust használja annak ellenőrzésére, hogy a záró egyenleg a vártnak megfelelően van-e. A Assert.AreEqual, a Assert.IsTrueés más módszereket gyakran használják az egységtesztelésben. Az egységtesztek írásáról az A tesztek írásacímű témakörben talál további információt.

A vizsgálati módszer követelményei

A vizsgálati módszernek meg kell felelnie a következő követelményeknek:

  • Az [TestMethod] attribútummal van díszítve.

  • Visszaadja void.

  • Nem rendelkezhet paraméterekkel.

A teszt összeállítása és futtatása

  1. A Build menüben válassza Megoldás létrehozása (vagy nyomja le Ctrl + SHIFT + B).

  2. Ha Test Explorer nincs megnyitva, nyissa meg a Test>Test Explorer (vagy Test>Windows>Test Explorer) lehetőséget a felső menüsávon (vagy nyomja le Ctrl + E, T).

  3. A teszt futtatásához válassza a Mindet futtat lehetőséget (vagy nyomja le a Ctrl + R, majd Vbillentyűket).

    Amíg a teszt fut, a Test Explorer ablak tetején lévő állapotsor animált lesz. A tesztfuttatás végén a sáv zöld színűre változik, ha az összes vizsgálati módszer megfelel, vagy piros színnel, ha valamelyik teszt sikertelen.

    Ebben az esetben a teszt meghiúsul.

  4. Válassza ki a metódust Test Explorer a részletek megtekintéséhez az ablak alján.

A kód javítása és a tesztek újrafuttatása

A teszt eredménye egy üzenetet tartalmaz, amely leírja a hibát. Előfordulhat, hogy mélyebbre kell ásnia, hogy lássa ezt az üzenetet. A AreEqual metódus esetében az üzenet megjeleníti a várt és a ténylegesen kapott elemet. Azt vártad, hogy az egyenleg csökkenni fog, de az ahelyett a visszavonás összegével nőtt.

Az egységteszt hibát észlelt: a kifizetés összege hozzáadódott a számla egyenlegéhez, pedig kellene kivonni.

A hiba javítása

A hiba kijavításához a BankAccount.cs fájlban cserélje le a következő sort:

m_balance += amount;

val:

m_balance -= amount;

A teszt újrafuttatása

A Tesztkezelő válassza a Minden futtatása lehetőséget a teszt újrafuttatásához (vagy nyomja le Ctrl + R, V). A piros/zöld sáv zöldre változik, és jelzi, hogy a teszt sikeres volt.

Test Explorer a Visual Studio 2019-ben a sikeres tesztek megjelenítése

Test Explorer a Visual Studio 2019-ben a sikeres tesztek megjelenítése

Egységtesztek használata a kód fejlesztéséhez

Ez a szakasz azt ismerteti, hogy az elemzés, az egységtesztek fejlesztése és az újrabontás iteratív folyamata hogyan segítheti az éles kód robusztusabbá és hatékonyabbá tétele érdekében.

A problémák elemzése

Létrehozott egy tesztmetódust, amellyel meggyőződhet arról, hogy a Debit metódus helyesen von le egy érvényes összeget. Ekkor ellenőrizze, hogy a metódus dob egy ArgumentOutOfRangeException-t, ha a terhelés összege bármelyik a következő:

  • nagyobb, mint az egyenleg, vagy
  • kisebb, mint nulla.

Új tesztelési módszerek létrehozása és futtatása

Hozzon létre egy tesztmetódust, amely ellenőrzi a helyes viselkedést, ha a terhelés összege nullánál kisebb:

[TestMethod]
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
    // Arrange
    double beginningBalance = 11.99;
    double debitAmount = -100.00;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // Act and assert
    Assert.ThrowsException<System.ArgumentOutOfRangeException>(() => account.Debit(debitAmount));
}

A ThrowsException metódus használatával ellenőrizze, hogy a helyes kivétel történt-e. Ez a metódus a tesztet sikertelenné teszi, hacsak nem dob egy ArgumentOutOfRangeException-t. Ha ideiglenesen úgy módosítja a vizsgált metódust, hogy egy általánosabb ApplicationException-t dobjon, amikor a terhelési összeg kisebb, mint nulla, akkor a teszt megfelelően működik, azaz hibát jelez.

Az alábbi lépéseket követve tesztelje az esetet, ha a visszavont összeg nagyobb az egyenlegnél:

  1. Hozzon létre egy új, Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRangenevű tesztmetódust.

  2. Másolja a metódus törzsét a(z) Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange-ból az új metódusba.

  3. Állítsa a debitAmount az egyenlegnél nagyobb számra.

Futtassa a két tesztet, és ellenőrizze, hogy sikeresek-e.

Az elemzés folytatása

A tesztelt módszer tovább fejleszthető. A jelenlegi implementációval nem tudjuk, hogy melyik feltétel (amount > m_balance vagy amount < 0) vezetett a kivételhez a teszt során. Csak azt tudjuk, hogy egy ArgumentOutOfRangeException dobtak valahol a módszerbe. Jobb lenne, ha megállapíthatnánk, hogy BankAccount.Debit mely feltétel okozta a kivételt (amount > m_balance vagy amount < 0), hogy biztosak lehessünk abban, hogy a módszerünk helyesen ellenőrzi az argumentumait.

Tekintse meg újra a tesztelni kívánt metódust (BankAccount.Debit), és figyelje meg, hogy mindkét feltételes utasítás egy ArgumentOutOfRangeException konstruktort használ, amely csak paraméterként veszi fel az argumentum nevét:

throw new ArgumentOutOfRangeException("amount");

Létezik egy konstruktor, amely sokkal részletesebb információkat jelenít meg: ArgumentOutOfRangeException(String, Object, String) tartalmazza az argumentum nevét, az argumentum értékét és a felhasználó által megadott üzenetet. A tesztelt metódust átszervezheti, hogy ezt a konstruktort használja. Még jobb, ha a nyilvánosan elérhető típustagokat használja a hibák azonosítására.

A teszt alatt lévő kód újrabontása

Először határozzon meg két állandót a hibaüzenetekhez az osztály hatókörében. Helyezze a definíciókat a vizsgált osztályba, BankAccount:

public const string DebitAmountExceedsBalanceMessage = "Debit amount exceeds balance";
public const string DebitAmountLessThanZeroMessage = "Debit amount is less than zero";

Ezután módosítsa a két feltételes utasítást a Debit metódusban:

if (amount > m_balance)
{
    throw new System.ArgumentOutOfRangeException("amount", amount, DebitAmountExceedsBalanceMessage);
}

if (amount < 0)
{
    throw new System.ArgumentOutOfRangeException("amount", amount, DebitAmountLessThanZeroMessage);
}

A vizsgálati módszerek újrabontása

A tesztelési módszerek átszervezése a Assert.ThrowsExceptionhívásának eltávolításával. Csomagolja be a Debit() hívását egy try/catch blokkba, ragadja meg a várt kivételt, és ellenőrizze a társított üzenetet. A Microsoft.VisualStudio.TestTools.UnitTesting.StringAssert.Contains metódus lehetővé teszi két sztring összehasonlítását.

Most a Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange a következőképpen nézhet ki:

[TestMethod]
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
    // Arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // Act
    try
    {
        account.Debit(debitAmount);
    }
    catch (System.ArgumentOutOfRangeException e)
    {
        // Assert
        StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
    }
}

Újratesztelés, átírás és újraelemzés

A tesztmetódus jelenleg nem kezeli az összes olyan esetet, amelyre szükség van. Ha a vizsgált módszer, a Debit metódus nem tudott ArgumentOutOfRangeException dobni, ha a debitAmount nagyobb volt, mint az egyenleg (vagy kevesebb, mint nulla), a vizsgálati módszer sikeres lesz. Ez a forgatókönyv nem jó, mert azt szeretné, hogy a tesztmetódus meghiúsuljon, ha nincs kivétel.

Ez az eredmény egy hiba a tesztmetódusban. A probléma megoldásához adjon hozzá egy Assert.Fail állítást a tesztmetódus végén az eset kezeléséhez, ahol nincs kivétel.

A teszt újrafuttatása azt mutatja, hogy a teszt most sikertelen, ha a megfelelő kivételt kapják. A catch blokk elkapja a kivételt, de a metódus továbbra is fut, és az új Assert.Fail állításnál meghiúsul. A probléma megoldásához adjon hozzá egy return utasítást a StringAssert blokk catch után. A teszt újrafuttatása megerősíti, hogy megoldotta ezt a problémát. A Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange végleges verziója a következőképpen néz ki:

[TestMethod]
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
    // Arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // Act
    try
    {
        account.Debit(debitAmount);
    }
    catch (System.ArgumentOutOfRangeException e)
    {
        // Assert
        StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
        return;
    }

    Assert.Fail("The expected exception was not thrown.");
}

Következtetés

A tesztkód fejlesztései robusztusabb és informatívabb tesztelési módszereket eredményeztek. De ami még fontosabb, a tesztelt kódot is továbbfejlesztették.

Tipp.

Ez az útmutató a Microsoft egységtesztelési keretrendszerét használja a felügyelt kódhoz. Test Explorer olyan külső egységteszt-keretrendszerekből is futtathat teszteket, amelyek Test Exploreradapterekkel rendelkeznek. További információ: Harmadik féltől származó egységteszt-keretrendszerek telepítése.

A parancssori beállításokról (VSTest.Console.exe) szóló információkért, a tesztek parancssorból történő futtatásához, lásd.