Sdílet prostřednictvím


Zápis testů částí pro C/C++ s infrastrukturou testování částí Microsoft Unit Testing Framework pro C++

V sadě Visual Studio můžete vytvořit testy částí pro nespravované kód napsaný v jazyce C++.Nespravovaný kód se někdy nazývá nativního kódu.

Následující postup obsahuje základní informace, které vám umožní začít.Návod, který popisuje kroky, které podrobněji později částech.

K zápisu testování částí pro nespravované kód knihovny DLL

  1. Použití nativní testovací projekt šablonu pro vytvoření samostatného projektu sady Visual Studio pro testů.

    Projekt, který obsahuje ukázkový kód test.

  2. Zpřístupnit knihovny DLL testovací projekt:

    • #include a .h file that contains declarations of the DLL’s externally-accessible functions.

      .h Soubor by měl obsahovat deklarace funkcí, které jsou označeny _declspec(dllimport).Alternativně můžete exportovat metody pomocí DEF souboru.Další informace naleznete v tématu Import a export.

      Testování částí má přístup pouze funkce, které jsou exportovány z knihovny DLL testovaný.

    • Přidáte projekt knihovny DLL s odkazy na testu projektu:

      V vlastnosti testu projektu, rozbalte položku běžné vlastnosti, architektura a odkazy naa zvolte možnost přidat odkaz.

  3. V projektu pro test vytvořit testovací třídy a zkušební metody pomocí makra testování a vyhodnocení třídy následujícím způsobem:

    #include "stdafx.h"
    #include <CppUnitTest.h>
    #include "..\MyProjectUnderTest\MyCodeUnderTest.h"
    using namespace Microsoft::VisualStudio::CppUnitTestFramework;
    TEST_CLASS(TestClassName)
    {
    public:
      TEST_METHOD(TestMethodName)
      {
        // Run a function under test here.
        Assert::AreEqual(expectedValue, actualValue, L"message", LINE_INFO());
      }
    }
    
    • Assertobsahuje několik statické funkce, které můžete použít k ověření výsledek testu.

    • LINE_INFO() Parametr je volitelný.V případech, kde neexistuje žádný soubor PDB, je to umožňuje používat nástroje test runner k identifikaci umístění selhání.

    • Můžete také napsat zkušební instalační program a vyčištění metody.Další informace, otevřete definici TEST_METHOD makra a číst komentáře v CppUnitTest.h

    • Nelze vnořit test třídy.

  4. Pomocí Průzkumníka testů pro spuštění testů:

    1. Na zobrazení nabídce zvolte ostatní okna, Průzkumníka testů.

    2. Vytváření řešení pro Visual Studio.

    3. V Průzkumníku testů, zvolte spustit všechny.

    4. Chcete-li prozkoumat všechny testy podrobněji Průzkumníka testů:

      1. Vyberte název testovacího bližší informace, jako je například selhání zprávu a zásobníku trasování.

      2. Název testovacího (například poklepáním otevřete) přejděte do umístění selhání nebo do kódu test.

      3. V místní nabídce pro test, zvolte ladění vybraný Test ke spuštění testu v ladicí program.

Návod: Vývoj nespravované knihovně DLL s Průzkumníka testů

V tomto návodu vyvíjet vlastní knihovny DLL, můžete upravit.Hlavní kroky jsou následující:

  1. Vytvořte projekt pro Test nativní.Testy jsou vytvářeny v samostatném projektu z knihovny DLL, která při vývoji.

  2. Vytvořte projekt knihovny DLL.Tento průvodce vytvoří nové knihovny DLL, ale je podobný jako postup testování existující knihovny DLL.

  3. Zpřístupněte funkcí knihovny DLL pro testy.

  4. Opakované rozšířit testy.Doporučujeme, abyste cyklický odkaz "červená zelená refactor", ve kterém je vývoj kódu vedené testy.

  5. Ladění není-li testy.Testy můžete spustit v režimu ladění.

  6. Refaktorovat při zachování testy beze změny.Refaktoring prostředky zlepšit strukturu kódu beze změny jeho externí chování.Můžete to provést ke zlepšení výkonu, rozšiřitelnosti nebo čitelnost kódu.Vzhledem k tomu, že záměrem není možné zmìnit, se nezmění testy při provedení refaktoring změny kódu.Testy pomoci, ujistěte se, když jsou refaktoring není zavést chyby.Proto můžete provádět tyto změny s jistotou víc než pokud nemáte testy.

  7. Zkontrolujte pokrytí.Testování částí jsou další užitečné, pokud využijí více kódu.Můžete zjistit, jaké části kódu byly použity testy.

  8. Zjištění jednotky z externího zdroje.Obvykle je závislá na další součásti systému, který vyvíjíte, například dalších knihoven DLL, databáze nebo vzdálené subsystémy knihovny DLL.Je vhodné k testování jednotlivých jednotek izolovaně od jeho závislé součásti.Externí komponenty budou moci provádět testy pracovat pomalu.Během vývoje nemusí být kompletní další součásti.

Vytvořte projekt testování částí nativní

  1. Na soubor nabídce zvolte nový, projektu.

    V dialogovém okně, rozbalte položku nainstalované, šablony, Visual C++, Test.

    Zvolte nativní testovací projekt šablony.

    V tomto návodu je testovací projekt s názvem NativeRooterTest.

    Vytváření projekt testování částí C++

  2. V novém projektu zkontrolovatunittest1.cpp

    Testování projektu s TEST_CLASS a TEST_METHOD

    Všimněte si, že:

    • Každý testovací je definován pomocí TEST_METHOD(YourTestName){...}.

      Nemáte k zápisu podpisu konvenční funkce.Podpis je vytvořen makra TEST_METHOD.Makra generuje funkce jazyka instance, který vrátí prázdnou hodnotu.Vytvoří také statické funkce, která vrací informace o metodě test.Tyto informace umožňují Průzkumníka testů k nalezení metody.

    • Zkušební metody jsou seskupeny do třídy pomocí TEST_CLASS(YourClassName){...}.

      Při spuštění testů, je vytvořena instance jednotlivých tříd test.Zkušební metody se nazývají v neurčené pořadí.Můžete zadat speciální metody, které jsou vyvolány před a po jednotlivých modulu, třída nebo metody.Další informace naleznete v tématu uspořádání testy C++.

  3. Ověřte, že testy spuštěny v Průzkumníku testů:

    1. Vložte kód některé testu:

      TEST_METHOD(TestMethod1)
      {
      Assert::AreEqual(1,1);
      }
      

      Všimněte si, že Assert třída poskytuje několik statické metody, které slouží k ověření má za následek zkušební metody.

    2. Na Test nabídce zvolte spustit , všechny testy.

      Test vytvoří a spustí.

      Zobrazí se Průzkumníka testů.

      Tento test se zobrazí pod předána testy.

      Jednotky Průzkumníka testů s jeden předané test

Vytvoření projektu nespravovaných DLL

  1. Vytvořit Visual C++ projektu s použitím projekt Win32 šablony.

    V tomto návodu projekt se jmenuje RootFinder.

    Vytvoření projektu C++ Win32

  2. Vyberte DLL a Export symbolů v Průvodci aplikací Win32.

    Exportovat symboly možnost generuje jediné makra, které vám pomohou deklarovat exportovaných metod.

    Průvodce projektu C++ pro knihovny DLL a exportovat symboly

  3. Deklarujte exportované funkce v souboru hlavní h:

    Nový soubor knihovny DLL kódu projektu a hlaviček s makry rozhraní API

    Deklarátor __declspec(dllexport) způsobí, že veřejné, tak i chráněné členy třídy mají být zobrazeny mimo knihovnu DLL.Další informace naleznete v tématu Používání příkazů dllimport a dllexport ve třídách jazyka C++.

  4. V souboru hlavní cpp přidejte minimální textu pro funkci:

    // Find the square root of a number.
    double CRootFinder::SquareRoot(double v)
    {
      return 0.0;
    }
    

Několik testovací projekt do projektu knihovny DLL

  1. Přidáte projekt knihovny DLL s odkazy na projekt testu projektu:

    1. Otevřete dialogové okno Vlastnosti projektu test a zvolte možnost běžné vlastnosti, architektura a odkazy na.

      Vlastnosti projektu C++ – architektura a odkazy

    2. Zvolte přidat nový odkaz.

      V přidat odkaz dialogové okno pole, vyberte projekt knihovny DLL a zvolte přidat.

      Vlastnosti projektu C++ – přidat nový odkaz

  2. V souboru CPP test hlavní jednotka zahrnují souboru h DLL kódu:

    #include "..\RootFinder\RootFinder.h"
    
  3. Přidáte základní test, který používá funkci exportované:

    TEST_METHOD(BasicTest)
    {
    CRootFinder rooter;
    Assert::AreEqual(
    // Expected value:
    0.0, 
    // Actual value:
    rooter.SquareRoot(0.0), 
    // Tolerance:
    0.01,
    // Message:
    L"Basic test failed",
    // Line number - used if there is no PDB file:
    LINE_INFO());
    }
    
  4. Sestavte řešení.

    Nový test se zobrazí v Průzkumníka testů.

  5. V Průzkumníku testů, zvolte spustit všechny.

    Předána základní testování částí Průzkumníka testů-

Mít nastavit test a kódu projektů a ověřeno, že lze spouštět testy, které spouštět funkce v kódu projektu.Nyní můžete začít psát reálné testy a kódu.

Opakované rozšířit testy a jejich předání

  1. Přidáte nové testovací:

    TEST_METHOD(RangeTest)
    {
      CRootFinder rooter;
      for (double v = 1e-6; v < 1e6; v = v * 3.2)
      {
        double actual = rooter.SquareRoot(v*v);
        Assert::AreEqual(v, actual, v/1000);
      }
    }
    

    Tip

    Doporučujeme, abyste testy, které byly úspěšně neměňte.Místo toho přidejte nový test, aktualizujte kód tak, aby test je úspěšný a pak přidejte další testovací a tak dále.

    Pokud uživatelé změnit své požadavky, zakažte testy, které již nejsou správné.Zápis nových testů a je jeden po druhém, pracovat stejným způsobem jako přírůstkové provést.

  2. Sestavte řešení a poté v Průzkumníku testů, vyberte spustit všechny.

    Nový test se nezdaří.

    RangeTest nezdaří

    Tip

    Ověřte, že každou test nezdaří okamžitě poté, co jste napsali ji.To umožňuje vyhnout se snadno chybu zápisu test, který nikdy nezdaří.

  3. Vylepšete testovaný kód tak, aby nové testovací předá:

    #include <math.h>
    ...
    double CRootFinder::SquareRoot(double v)
    {
      double result = v;
      double diff = v;
      while (diff > result/1000)
      {
        double oldResult = result;
        result = result - (result*result - v)/(2*result);
        diff = abs (oldResult - result);
      }
      return result;
    }
    
  4. Sestavte řešení a poté v Průzkumníku testů, vyberte spustit všechny.

    Předat oba testy.

    Předána rozsahu testování částí Průzkumníka testů-

    Tip

    Vyvíjejte kód přidáním testy jedna po druhé.Ujistěte se, že všechny testy předat po každé iteraci.

Ladění neúspěšného testu

  1. Přidejte další testovací:

    #include <stdexcept>
    ...
    // Verify that negative inputs throw an exception.
    TEST_METHOD(NegativeRangeTest)
    {
      wchar_t message[200];
      CRootFinder rooter;
      for (double v = -0.1; v > -3.0; v = v - 0.5)
      {
        try 
        {
          // Should raise an exception:
          double result = rooter.SquareRoot(v);
    
          _swprintf(message, L"No exception for input %g", v);
          Assert::Fail(message, LINE_INFO());
        }
        catch (std::out_of_range ex)
        {
          continue; // Correct exception.
        }
        catch (...)
        {
          _swprintf(message, L"Incorrect exception for %g", v);
          Assert::Fail(message, LINE_INFO());
        }
      }
    }
    
  2. Sestavte řešení a zvolte možnost spustit všechny.

  3. Otevření (nebo dvakrát klikněte na položku) se nezdařila test.

    Selhání kontrolního výrazu je zvýrazněný.Zpráva o selhání je zobrazen v podokně podrobností Průzkumníka testů.

    NegativeRangeTests se nezdařilo.

  4. Chcete-li zjistit, proč se test nezdaří, kroku prostřednictvím funkce:

    1. Nastavení zarážky na začátku SquareRoot funkce.

    2. V místní nabídce testu se nezdařila, zvolte ladění vybrané testy.

      Při spuštění zastaví u zarážky, kód krokovat.

  5. Vložte kód ve funkci, která při vývoji:

    #include <stdexcept>
    ...
    double CRootFinder::SquareRoot(double v)
    {
        // Validate parameter:
        if (v < 0.0) 
        {
          throw std::out_of_range("Can't do square roots of negatives");
        }
    
  6. Všechny testy nyní předat.

    Všechny testy úspěšné

Refaktorovat kód beze změny testy

  1. Zjednodušení centrální výpočtu ve funkci SquareRoot:

    // old code:
    //   result = result - (result*result - v)/(2*result);
    // new code:
         result = (result + v/result)/2.0;
    
  2. Sestavte řešení a zvolte možnost spustit všechny, abyste měli jistotu, že nebyla zavedena k chybě.

    Tip

    Dobrý sadu testování částí přiřadí jistotou chyby při změně kódu nebyla zavedena.

    Zachovat refaktoring odděleně od jiných změn.

Další kroky

  • **Izolace.**Většina knihovny DLL jsou závislé na jiných subsystémy, jako jsou databáze a další knihovny DLL.Tyto další součásti jsou často rozvíjet souběžně.Pokud chcete povolit má být provedena při další součásti ještě nejsou k dispozici testování částí, je třeba nahradit mock nebo

  • **Vytvořte ověřovací testy.**Může mít testy provést na serveru sestavení týmu ve stanovených intervalech.To zajistí, že chyby nejsou zavedena při práci několik členů týmu je integrován.

  • **Testy vrácení se změnami.**Můžete pověřit, že některé zkoušek před každého člena týmu zkontroluje kód do správy zdrojového kódu.Toto je obvykle podmnožinu úplné sady příkazů sestavení ověřovací testy.

    Můžete také pověřit minimální úroveň pokrytí kódu.

Viz také

Úkoly

Návod: Vytvoření a použití dynamické knihovny (C++)

Koncepty

Testování částí stávajících aplikací C++ pomocí Průzkumníka testů

Používání atributu Microsoft.VisualStudio.TestTools.CppUnitTestFramework

Import a export

Další zdroje

Přehled Interoperability spravované nespravované kódu

Ladění nativního kódu