Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
Ez a cikk azt ismerteti, hogyan hozhat létre manuálisan egységteszteket. Ha automatikusan szeretne teszteket létrehozni a meglévő kódból, tekintse meg az alábbi cikkeket:
Előfeltételek
A Visual Studiót a .NET asztali fejlesztési számítási feladattal együtt kell telepíteni.
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.
Ha nem látja a konzolalkalmazás-sablont , a Visual Studio Installer használatával telepítse a .NET asztali fejlesztési számítási feladatát.
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.
Jegyzet
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.
Borravaló
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.
Jegyzet
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
UnitTest1a 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.
Borravaló
Törölheti az alapértelmezett TestMethod1 metódust, mert ebben a cikkben 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
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:
[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:
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
debitAmountaz 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.
Borravaló
Ez a cikk a Microsoft egységtesztelési keretrendszerét használja 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.