Útmutató: Egységtesztek létrehozása és futtatása felügyelt kódhoz
Cikk
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
Nyissa meg a Visual Studiót.
A kezdési ablakban válassza az Új projekt létrehozásalehetőséget.
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.
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.
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);
}
}
}
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.
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
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.
Í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.
Nevezze el a projektet BankTests, 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 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.
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.
A Referenciakezelő párbeszédpanelen bontsa ki Projektek, válassza Megoldáslehetőséget, majd jelölje be a Bank elemet.
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
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.
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.
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:
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
A Build menüben válassza Megoldás létrehozása (vagy nyomja le Ctrl + SHIFT + B).
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).
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.
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.
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:
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:
Hozzon létre egy új, Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRangenevű tesztmetódust.
Másolja a metódus törzsét a(z) Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange-ból az új metódusba.
Á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 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:
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.
Kapcsolódó tartalom
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.
A C#-alkalmazások tesztelését a Visual Studio tesztelési eszközeivel kezdheti el. Megtudhatja, hogyan írhat teszteket, használhatja a Test Explorert, hozhat létre tesztcsomagokat, és alkalmazhatja a piros, zöld, újrabontási mintát a kód írásához.
Bemutatja, hogyan egyszerűsítheti, automatizálhatja és alakíthatja át az üzleti feladatokat és folyamatokat a Microsoft Power Platform Developer használatával.