Udostępnij za pośrednictwem


Framework testów jednostkowych firmy Microsoft dla języka C++ pozwala pisać testy jednostkowe dla projektów języka C++.

W programie Visual Studio można utworzyć testów jednostkowych dla niezarządzanego kodu w języku C++.Kod niezarządzany jest czasami nazywane kodu macierzystego.

Poniższa procedura zawiera istotne informacje, które należy zacząć.Później sekcje stanowią przewodnik opisujące kroki bardziej szczegółowo.

Aby zapisać testów jednostkowych dla kodu niezarządzanego DLL

  1. Użyj macierzystego projektu testowego szablon, aby utworzyć oddzielne projekt programu Visual Studio dla testów.

    Projekt zawiera niektóre przykładowego kodu testu.

  2. Udostępnić biblioteki DLL dla projektu testowego:

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

      .h Plik powinien zawierać deklaracji funkcji oznaczona za pomocą _declspec(dllimport).Alternatywnie można wyeksportować metody przy użyciu pliku rozdzielczości.Aby uzyskać więcej informacji, zobacz Importowanie i eksportowanie.

      Testy jednostek, dostępny tylko funkcje, które zostaną wyeksportowane z biblioteki DLL w obszarze testu.

    • Dodaj ten projekt biblioteki DLL z odwołaniami do projektu testowego:

      W właściwości projektu testowego, rozwiń węzeł wspólne właściwości, Framework i odwołuje się doi wybierz polecenie Dodaj odwołanie.

  3. W projekcie testu Utwórz test klasy i metody testów przy użyciu testów makra i klasy potwierdzenia w następujący sposób:

    #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());
      }
    }
    
    • Assertzawiera kilka funkcji statycznych, których można użyć, aby sprawdzić wynik testu.

    • LINE_INFO() Parametr jest opcjonalny.W przypadku jeżeli nie ma pliku PDB, możliwe jest narzędzie test runner do identyfikowania lokalizacji awarii.

    • Można także napisać metody instalacji i oczyszczanie testu.Aby uzyskać więcej informacji, otwórz definicji TEST_METHOD makra i komentarze znajdują się w CppUnitTest.h

    • Nie można zagnieżdżać klasy testu.

  4. Użyj Eksploratora testów, aby uruchomić te testy:

    1. Na widoku menu, wybierz polecenie inne okna, Eksploratora testów.

    2. Twórz rozwiązania Visual Studio.

    3. W Eksploratorze testów, wybierz polecenie Uruchom wszystko.

    4. Do sprawdzania, czy któregoś z testów szczegółowo Eksploratora testów:

      1. Wybierz nazwę testu, aby zobaczyć więcej szczegółów, takich jak Błąd śledzenia wiadomości i stosu.

      2. Otwórz nazwa testu (na przykład klikając dwukrotnie), aby przejść do lokalizacji awarii lub do kodu testu.

      3. W menu skrótów, dla testu, wybierz polecenie debugowanie wybrane testowanie do uruchomienia testu debugera.

Instruktaż: Tworzenie niezarządzane DLL z Eksploratora testów

Istnieje możliwość dostosowania tej procedury do tworzenia własnych DLL.Główne etapy są następujące:

  1. Utwórz projekt testu macierzystego.Testy są tworzone w osobnym projekcie z biblioteki DLL, którego tworzysz.

  2. Utwórz projekt biblioteki DLL.Niniejszy przewodnik tworzy nowy DLL, ale procedura testowania istniejących DLL jest podobny.

  3. Zwiększyć funkcji DLL testy.

  4. Wielokrotnie powtarzane rozszerzać testy.Firma Microsoft zaleca cykl "czerwony zielony refactor", w którym tworzenia kodu jest spowodowało przez testy.

  5. Debugowanie w przypadku braku testów.Można uruchomić testy w trybie debugowania.

  6. Refactor podczas zachowuje testy niezmienionych.Refaktoryzacji oznacza, że poprawy struktury kodu bez zmiany jego zachowania zewnętrznych.Można zrobić, aby zwiększyć wydajność, rozszerzania lub czytelność kodu.Ponieważ jest nie, aby zmienić to zachowanie, nie należy zmieniać testy podczas wprowadzania refaktoryzacji zmiany w kodzie.Testy pomocy, upewnij się, że nie wprowadzają usterki podczas są refaktoryzacji.Dlatego można dokonać tych zmian z pewnością wiele innych niż Jeśli nie masz testy.

  7. Sprawdź pokrycia.Testy jednostek są inne przydatne, gdy wykonują więcej kodu.Można odkryć części kodu, które były używane przez testy.

  8. Izoluj jednostki z zasobów zewnętrznych.Zwykle biblioteki DLL jest zależna od innych składników systemu, które tworzysz, takich jak inne biblioteki DLL baz danych i podsystemy zdalnego.Program jest przydatny do testowania każdej jednostki w izolacji od jego zależności.Składniki zewnętrzne mogą wysyłać testy działać wolniej.Podczas tworzenia aplikacji inne składniki mogą być niepełne.

Utwórz projekt testu jednostki macierzystego

  1. Na pliku menu, wybierz polecenie nowy, projektu.

    W oknie dialogowym Rozwiń zainstalowane, szablony, Visual C++, testu.

    Wybierz macierzystego projektu testowego szablonu.

    W tym przykładzie projektu testowego o nazwie NativeRooterTest.

    Tworzenie projektu testu jednostki C++

  2. W nowy projekt Sprawdźunittest1.cpp

    Projekt testu z TEST_CLASS i TEST_METHOD

    Należy zauważyć, że:

    • Każdego testu jest definiowana za pomocą TEST_METHOD(YourTestName){...}.

      Nie trzeba zapisać podpis konwencjonalna funkcji.Podpis jest tworzony za pomocą makra TEST_METHOD.Makra generuje funkcję wystąpienia, która zwraca wartość void.Generuje on również statyczny funkcję, która zwraca informacje o metodzie testu.Informacje te pozwalają Eksploratora testów można znaleźć metody.

    • Metody testu są podzielone na klasy przy użyciu TEST_CLASS(YourClassName){...}.

      Uruchomienie testy tworzone jest wystąpienie klasy każdego testu.Metody testu są wywoływane w nieokreślonej kolejności.Można określić specjalne metody, które są wywoływane przed i po każdym modułu, klasy lub metody.Aby uzyskać więcej informacji, zobacz organizowanie testów C++.

  3. Należy sprawdzić, czy uruchomione testy w Eksploratorze testów:

    1. Wstaw kod testu:

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

      Należy zauważyć, że Assert udostępnia kilka metod statycznych, których można użyć, aby zweryfikować wyniki w metodach.

    2. Na testu menu, wybierz polecenie Uruchom , wszystkich testów.

      Test tworzenia i uruchamiania.

      Zostanie wyświetlony Eksploratora testów.

      Test jest wyświetlany w obszarze przekazany testów.

      Eksploratora testów jednostkowych z jednego testu przekazane

Utwórz projekt biblioteki DLL niezarządzane

  1. Utwórz Visual C++ projektu za pomocą projektu Win32 szablonu.

    W tym przykładzie projekt o nazwie RootFinder.

    Tworzenie projektu C++ Win32

  2. Wybierz biblioteki DLL i eksportowanie symboli w Kreatorze aplikacji Win32.

    Wyeksportować symbole opcja generuje wygodny makra, który służy do deklarowania wyeksportowanych metod.

    Kreator projektu C++ ustawić DLL i eksportowanie symboli

  3. Deklaruje wyeksportowane funkcji w pliku .h główna:

    Nowy kod projektu i .h plik DLL z makrami interfejsu API

    Declarator __declspec(dllexport) powoduje, że publicznego i ochrony elementów członkowskich klasy mają być wyświetlane poza biblioteki DLL.Aby uzyskać więcej informacji, zobacz Korzystanie z dllimport i dllexport w klasach C++.

  4. W pliku główna CPP dodać minimalne treści dla funkcji:

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

Kilka projektu testowego w projekcie biblioteki DLL

  1. Dodaj ten projekt biblioteki DLL do odwołaniami do projektów projektu testowego:

    1. Otwórz właściwości projektu testowego i wybierz polecenie wspólne właściwości, Framework i odwołuje się do.

      Właściwości projektu C++ — struktury i odwołania

    2. Wybierz Dodaj nowe odwołanie.

      W Dodaj odwołanie okna dialogowego pole, wybierz projekt biblioteki DLL i wybierz opcję Dodaj.

      Właściwości projektu C++ — Dodaj nowe odwołanie

  2. W pliku CPP testu jednostki główna między innymi w pliku .h kodu DLL:

    #include "..\RootFinder\RootFinder.h"
    
  3. Dodaj test podstawowe, który jest używana funkcja wyeksportowane:

    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. Skompiluj rozwiązanie.

    Zostanie wyświetlony nowy test Eksploratora testów.

  5. W Eksploratorze testów, wybierz polecenie Uruchom wszystko.

    Przekazany podstawowy Test Eksploratora testów jednostki —

Konfigurowanie badania i projekty kodu, a zweryfikowano, że możesz uruchamiać testy z systemem funkcje w projekt kodu.Teraz możesz zacząć pisanie kodu i testy rzeczywistych.

Wielokrotnie powtarzane rozszerzać testy i je przekazać

  1. Dodaj nowy test:

    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);
      }
    }
    
    PoradaPorada

    Zaleca się, że nie należy zmieniać testy, które zostały zakończone pomyślnie.Zamiast tego należy dodać nowy test, zaktualizować kod, tak aby test zakończy się pomyślnie, a następnie dodaj inny test i tak dalej.

    Jeśli użytkownicy zmienić ich wymagania, wyłącz testy, które nie są już prawidłowe.Napisz nowe testy i je pojedynczo, działa w taki sam sposób przyrostowe.

  2. Twórz rozwiązania, a następnie w Eksploratorze testów, wybierz Uruchom wszystko.

    Nowy test nie powiedzie się.

    RangeTest nie powiodło się.

    PoradaPorada

    Upewnij się, że każdego testu nie powiedzie się, od razu, po jego zaprojektowało.Pozwala to uniknąć łatwe błąd zapisu test, który nigdy nie powiedzie się.

  3. Podnieś poziom testowanego kodu, tak aby nowy test zakończy się pomyślnie:

    #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. Twórz rozwiązania, a następnie w Eksploratorze testów, wybierz Uruchom wszystko.

    Oba testy zostały zakończone pomyślnie.

    Przekazany zakresu testów Eksploratora testów jednostki —

    PoradaPorada

    Tworzenie kodu przez dodanie testy, co w danym czasie.Upewnij się, że wszystkie testy przekazywania po każdej iteracji.

Debugować test niepowodzeniem

  1. Dodaj inny test:

    #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. Tworzenie to rozwiązanie i wybierz polecenie Uruchom wszystko.

  3. Otwórz lub kliknij dwukrotnie test nie powiodło się.

    Niepowodzenie assertion jest wyróżniony.Komunikat o błędzie jest widoczna w okienku szczegółów Eksploratora testów.

    NegativeRangeTests nie powiodło się.

  4. Aby zobaczyć, dlaczego test nie powiedzie się, krok za pośrednictwem funkcji:

    1. Ustaw punkt przerwania na początku funkcji SquareRoot.

    2. Menu skrótów niepowodzenie testu, wybierz debugowanie wybrane testy.

      Po zatrzymaniu Uruchom na punkt przerwania, krok po kroku kod.

  5. Wstaw kod w funkcji, które tworzysz:

    #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. Teraz należy przekazać wszystkich testów.

    Wszystkie testy zostały zakończone pomyślnie

Refactor kod bez zmiany testów

  1. Uprość centralnej obliczeń w funkcji SquareRoot:

    // old code:
    //   result = result - (result*result - v)/(2*result);
    // new code:
         result = (result + v/result)/2.0;
    
  2. Tworzenie to rozwiązanie i wybierz polecenie Uruchom wszystko, aby upewnić się, że nie zostały wprowadzone wystąpił błąd.

    PoradaPorada

    Dobry zestaw testów jednostkowych daje pewność, że nie użyto usterek po zmianie kodu.

    Zachowaj refaktoryzacji oddzielnie od innych zmian.

Następne kroki

  • **Izolacja.**Większość bibliotek DLL są zależne od innych podsystemów, takich jak bazy danych i inne biblioteki dll.Te inne składniki są często rozwijane równolegle.Umożliwia testowanie jest wykonywana, podczas gdy inne składniki nie są jeszcze dostępne jednostki, należy zastąpić mock lub

  • **Twórz testy weryfikacji.**Może mieć testy wykonywane na serwerze kompilacji zespołu w ustalonych odstępach czasu.Dzięki temu usterki nie są wprowadzane podczas pracy z kilku członków zespołu jest zintegrowany.

  • **Ewidencjonowanie testów.**Mogą nakazywać, że niektóre testy są wykonywane przed każdym członku zespołu sprawdza, czy kod do kontroli źródła.Zazwyczaj jest to podzbiór kompletny zestaw testów weryfikacji kompilacji.

    Można również przesądza minimalny poziom pokrycie kodu.

Zobacz też

Zadania

Wskazówki: tworzenie i używanie biblioteki dołączanej dynamicznie (C++)

Koncepcje

Testy jednostkowe istniejących aplikacji C++ za pomocą narzędzia Eksplorator testów

Korzystanie z Microsoft.VisualStudio.TestTools.CppUnitTestFramework

Importowanie i eksportowanie

Inne zasoby

Przegląd kodu zarządzanego niezarządzanych współpracy

Debugowanie kodu natywnego