Návod: Vývoj řízený testy pomocí Průzkumníka testů
Vytvářejte testy jednotek, které vám pomůžou zajistit správné fungování kódu prostřednictvím přírůstkových změn kódu. Existuje několik architektur, které můžete použít k zápisu testů jednotek, včetně některých vyvinutých třetími stranami. Některé testovací architektury jsou specializované pro testování v různých jazycích nebo platformách. Průzkumník testů poskytuje jedno rozhraní pro testy jednotek v některé z těchto architektur. Další informace o Průzkumníku testů najdete v tématu Spouštění testů jednotek pomocí Průzkumníka testů a Nejčastější dotazy k Průzkumníku testů.
Tento návod ukazuje, jak vyvíjet testovanou metodu v jazyce C# pomocí rozhraní Microsoft Test Framework (MSTest). Můžete ho snadno přizpůsobit pro jiné jazyky nebo jiné testovací architektury, jako je NUnit. Další informace naleznete v tématu Instalace rozhraní pro testování jednotek třetích stran.
Vytvoření testu a vygenerování kódu
Vytvořte projekt knihovny tříd jazyka C# pro .NET nebo .NET Standard. Tento projekt bude obsahovat kód, který chceme otestovat. Pojmenujte projekt MyMath.
Ve stejném řešení přidejte nový testovací projekt MSTest pro .NET.
V sadě Visual Studio 2019 verze 16.9 je název šablony projektu MSTest projekt unit test.
Pojmenujte testovací projekt MathTests.
Napište jednoduchou testovací metodu, která ověří výsledek získaný pro určitý vstup. Do třídy přidejte následující kód
UnitTest1
:[TestMethod] public void BasicRooterTest() { // Create an instance to test: Rooter rooter = new Rooter(); // Define a test input and output value: double expectedResult = 2.0; double input = expectedResult * expectedResult; // Run the method under test: double actualResult = rooter.SquareRoot(input); // Verify the result: Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 100); }
Vygenerujte typ z testovacího kódu.
Umístěte kurzor na
Rooter
a potom v nabídce žárovky zvolte Generovat typ Rooter> Generovat nový typ.V dialogovém okně Generovat typ nastavte Project na MyMath, projekt knihovny tříd a pak zvolte OK.
Vygenerujte metodu z testovacího kódu. Umístěte kurzor na
SquareRoot
a pak v nabídce žárovky zvolte Generate method 'Rooter.SquareRoot'.Spusťte test jednotek.
Otevřete Průzkumníka testů.
Pokud chcete otevřít Průzkumníka testů z nabídky Test , zvolte Průzkumníka testů.
Pokud chcete otevřít Průzkumníka testů z nabídky Test, zvolte Průzkumníka testů Systému Windows>.
V Průzkumníku testů zvolte tlačítko Spustit vše a spusťte test.
Řešení se sestaví a test se spustí a selže.
Vyberte název testu.
Podrobnosti testu se zobrazí v podokně Souhrn podrobností testu.
Výběrem horního odkazu v části Trasování zásobníku přejděte do umístění, kde se test nezdařil.
V tomto okamžiku jste vytvořili test a zástupný proceduru, které můžete upravit tak, aby test projde.
Ověření změny kódu
V souboru Class1.cs vylepšete kód
SquareRoot
:public double SquareRoot(double input) { return input / 2; }
V Průzkumníku testů zvolte Spustit vše.
Řešení se sestaví a test se spustí a projde.
Rozšíření rozsahu vstupů
Abychom zlepšili naši jistotu, že kód funguje ve všech případech, přidejte testy, které vyzkouší širší rozsah vstupních hodnot.
Tip
Vyhněte se změnám existujících testů, které projdou. Místo toho přidejte nové testy. Změnit existující testy pouze v případech, kdy se změní požadavky uživatelů. Tato zásada pomáhá zajistit, že při rozšiřování kódu nepřijdete o stávající funkce.
Do třídy testu přidejte následující test, který se pokusí o rozsah vstupních hodnot:
[TestMethod] public void RooterValueRange() { // Create an instance to test. Rooter rooter = new Rooter(); // Try a range of values. for (double expected = 1e-8; expected < 1e+8; expected *= 3.2) { RooterOneValue(rooter, expected); } } private void RooterOneValue(Rooter rooter, double expectedResult) { double input = expectedResult * expectedResult; double actualResult = rooter.SquareRoot(input); Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 1000); }
V Průzkumníku testů zvolte Spustit vše.
Nový test selže (i když první test stále projde). Pokud chcete najít bod selhání, vyberte neúspěšný test a pak se podívejte na podrobnosti v podokně Souhrn podrobností testu.
Zkontrolujte metodu pod testem a zjistěte, co může být špatně.
SquareRoot
Upravte kód následujícím způsobem:public double SquareRoot(double input) { double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = result - (result * result - input) / (2 * result); } return result; }
V Průzkumníku testů zvolte Spustit vše.
Oba testy teď projdou.
Přidání testů pro výjimečné případy
Přidejte nový test pro záporné vstupy:
[TestMethod] public void RooterTestNegativeInput() { Rooter rooter = new Rooter(); Assert.ThrowsException<ArgumentOutOfRangeException>(() => rooter.SquareRoot(-1)); }
V Průzkumníku testů zvolte Spustit vše.
Metoda v testovací smyčce a musí být zrušena ručně.
Na panelu nástrojů Průzkumníka testů zvolte Zrušit.
Test se zastaví.
SquareRoot
Opravte kód přidáním následujícíhoif
příkazu na začátek metody:public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } ...
V Průzkumníku testů zvolte Spustit vše.
Všechny testy jsou úspěšné.
Refaktoring kódu pod testem
Refaktorujte kód, ale neměňte testy.
Tip
Refaktoring je změna, která má kód zlepšit nebo usnadnit pochopení. Není určena ke změně chování kódu, a proto se testy nezmění.
Doporučujeme provádět kroky refaktoringu odděleně od kroků, které rozšiřují funkčnost. Zachování testů beze změny vám dává jistotu, že jste omylem nezanesli chyby při refaktoringu.
Řádek, který se počítá
result
vSquareRoot
metodě, změňte následujícím způsobem:public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = (result + input / result) / 2; //was: result = result - (result * result - input) / (2*result); } return result; }
Zvolte Spustit vše a ověřte, že všechny testy stále projdou.