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

  1. 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.

  2. 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.

    New code and test projects

    New code and test projects

  3. 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);
    }
    
  4. Vygenerujte typ z testovacího kódu.

    1. Umístěte kurzor na Rootera potom v nabídce žárovky zvolte Generovat typ Rooter> Generovat nový typ.

      Generate new type quick action

      Generate new type quick action

    2. V dialogovém okně Generovat typ nastavte Project na MyMath, projekt knihovny tříd a pak zvolte OK.

      Generate Type dialog box in Visual Studio 2019

      Generate Type dialog box in Visual Studio 2019

  5. Vygenerujte metodu z testovacího kódu. Umístěte kurzor na SquareRoota pak v nabídce žárovky zvolte Generate method 'Rooter.SquareRoot'.

  6. Spusťte test jednotek.

    1. 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>.

    2. 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.

  7. Vyberte název testu.

    Podrobnosti testu se zobrazí v podokně Souhrn podrobností testu.

    Test Detail Summary in Test Explorer

    Test Detail Summary in Test Explorer

  8. 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

  1. V souboru Class1.cs vylepšete kód SquareRoot:

    public double SquareRoot(double input)
    {
        return input / 2;
    }
    
  2. V Průzkumníku testů zvolte Spustit vše.

    Řešení se sestaví a test se spustí a projde.

    Test Explorer showing a passing test

    Test Explorer showing a passing test

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.

  1. 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);
    }
    
  2. 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.

  3. 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;
    }
    
  4. V Průzkumníku testů zvolte Spustit vše.

    Oba testy teď projdou.

Přidání testů pro výjimečné případy

  1. Přidejte nový test pro záporné vstupy:

    [TestMethod]
    public void RooterTestNegativeInput()
    {
        Rooter rooter = new Rooter();
        Assert.ThrowsException<ArgumentOutOfRangeException>(() => rooter.SquareRoot(-1));
    }
    
  2. V Průzkumníku testů zvolte Spustit vše.

    Metoda v testovací smyčce a musí být zrušena ručně.

  3. Na panelu nástrojů Průzkumníka testů zvolte Zrušit.

    Test se zastaví.

  4. SquareRoot Opravte kód přidáním následujícího if příkazu na začátek metody:

    public double SquareRoot(double input)
    {
        if (input <= 0.0)
        {
            throw new ArgumentOutOfRangeException();
        }
        ...
    
  5. 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.

  1. Řádek, který se počítá result v SquareRoot 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;
    }
    
  2. Zvolte Spustit vše a ověřte, že všechny testy stále projdou.

    Test Explorer showing 3 passed tests

    Test Explorer showing 3 passed tests