Udostępnij za pośrednictwem


Badania kodu macierzystego Eksploratorem Test jednostki

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

Poniższa procedura zawiera istotne informacje, które możesz zacząć.Później sekcje zawierają instruktażu, który opisuje kroki bardziej szczegółowo.

Pisać testy jednostkowe dla niezarządzanego kodu biblioteki DLL

  1. Użycie Macierzystego projektu testowego szablon, aby stworzyć osobny projekt programu Visual Studio dla testów.

    Projekt zawiera przykładowy kod testu.

  2. Udostępnić bibliotekę DLL dla tego projektu:

    • #include.h pliku, który zawiera deklaracje zewnętrznie dostępnych funkcji biblioteki DLL.

      .h Plik powinien zawierać deklaracje funkcji, oznaczonych _declspec(dllimport).Alternatywnie można wyeksportować metod, za pomocą pliku DEF.Aby uzyskać więcej informacji, zobacz Importowanie i eksportowanie.

      Testy jednostkowe można uzyskać dostęp tylko te funkcje, które są wywożone z biblioteki DLL badanego.

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

      W Właściwości projektu testowego, rozwiń węzeł Często używanych właściwości, Framework i odwołania doi wybierz polecenie Dodaj odwołanie.

  3. W projekcie badania tworzyć test klasy i metody badań za pomocą testu makra i klasy Assert 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 przypadkach w przypadku, gdy nie ma pliku PDB, pozwala programie test runner do identyfikowania lokalizacji awarii.

    • Można także napisać test metod instalacji i oczyszczania.Aby uzyskać więcej informacji, otwórz definicji TEST_METHOD makro, a komentarze znajdują się w CppUnitTest.h

    • Nie można zagnieździć test klas.

  4. Za pomocą Eksploratora Test uruchomić testy:

    1. W menu Widok wybierz Inne okna, Eksplorator testów.

    2. Tworzenie rozwiązania Visual Studio.

    3. W Eksploratorze testów, wybierz Uruchom wszystkie.

    4. Aby zbadać każde badanie bardziej szczegółowo w Eksploratorze Test:

      1. Wybierz nazwę test, aby zobaczyć więcej szczegółów, takich jak śledzenie wiadomości i stosu awarii.

      2. Otwórz nazwie test (na przykład przez dwukrotne kliknięcie), aby przejść do lokalizacji awarii lub do testowania kodu.

      3. W menu skrótów do badania, wybierz polecenie Program Debug: polecenie zaznaczone Test testu diagnostycznego w debugerze.

Przewodnik: Rozwijanie niezarządzanego DLL z Eksploratorem testu

Można dopasować w tym instruktażu stworzyć własną bibliotekę DLL.Główne kroki są następujące:

  1. Utwórz macierzystego Projekt Test.Testy są tworzone z biblioteki DLL, która w wypadku opracowywania projektu.

  2. Utwórz projekt DLL.W tym instruktażu powoduje utworzenie nowej biblioteki DLL, ale procedura testowania istniejących DLL jest podobny.

  3. Uwidocznienie funkcje biblioteki DLL dla testów.

  4. Wielokrotnie powtarzane uzupełniają testy.Zaleca się cyklu "czerwony zielony refactor", w którym rozwoju kodu jest prowadzony przez testy.

  5. Program Debug: polecenie w przypadku braku testów.W trybie debugowania, można uruchomić testy.

  6. Refaktoringu, podczas gdy prowadzenie badań bez zmian.Refaktoryzacja środków poprawy struktury kodu bez zmiany jego zachowanie zewnętrznych.Można to aby zwiększyć wydajność, rozszerzalności lub czytelność kodu.Ponieważ intencją jest nie, aby zmienić to zachowanie, nie należy zmieniać testów przy jednoczesnym wprowadzeniu refaktoryzacji zmiany do kodu.Testy pomoc, upewnij się, że użytkownik nie wprowadzają błędów podczas refaktoringu.Dlatego można wprowadzać takie zmiany z pewnością znacznie więcej niż Jeśli nie posiadasz testy.

  7. Sprawdź zakres.Testy są bardziej przydatne, gdy korzystają oni więcej kodu.Można wykryć, które fragmenty kodu zostały wykorzystane w badaniach.

  8. Izolowanie jednostki z zewnętrznych zasobów,.Zazwyczaj biblioteki DLL jest zależna od innych składników systemu, który tworzysz, takich jak inne biblioteki DLL, baz danych lub zdalnego podsystemów.Warto przetestować każdej jednostki w oderwaniu od jego zależności.Składników zewnętrznych można wprowadzać testy działają wolno.Podczas programowania inne składniki może być pełny.

Utwórz projekt testu jednostki macierzystego

  1. Na pliku menu, wybierz polecenie New, Projekt.

    W oknie dialogowym Rozwiń Installed, Szablony, Visual C++, Test.

    Wybierz polecenie Macierzystego projektu testowego szablonu.

    W tym instruktażu nosi nazwę tego projektu NativeRooterTest.

    Tworzenie projektu C++ jednostki badań

  2. W nowym projekcie inspekcjiunittest1.cpp

    Projekt badania z TEST_CLASS i TEST_METHOD

    Należy zauważyć, że:

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

      Nie musisz zapisać podpis konwencjonalnych funkcji.Podpis jest tworzony za pomocą makra TEST_METHOD.Makro generuje funkcję instancji, która zwraca void.Powoduje to także funkcja statyczna, która zwraca informacje o metodzie badania.Informacje te pozwalają explorer test znaleźć metody.

    • Metody badań są grupowane w klasach za pomocą TEST_CLASS(YourClassName){...}.

      Po uruchomieniu testów są tworzone jest wystąpienie klasy każdego testu.Metody badań są nazywane w nieokreślonej kolejności.Można zdefiniować specjalne metody, które są wywoływane przed i po zakończeniu każdego modułu, klasy lub metody.Aby uzyskać więcej informacji, zobacz Organizowanie testów C++.

  3. Sprawdź, że testy działają w programie Explorer testu:

    1. Wstaw jakiś kod testu:

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

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

    2. Na Test menu, wybierz polecenie uruchomić , Wszystkie testy.

      Badanie tworzenia i uruchamiania.

      Zostanie wyświetlony Eksplorator test.

      Badanie jest wyświetlany w obszarze Przeszedł testy.

      Explorer Test jednostki z jednego testu przekazany

Tworzenie projektu DLL niezarządzane

  1. Tworzenie Visual C++ projektu za pomocą Projekt systemu Win32 szablonu.

    W tym instruktażu nosi nazwę projektu RootFinder.

    Tworzenie projektu C++ Win32

  2. Wybierz DLL i Eksportowanie symboli w Kreatorze aplikacji Win32.

    Wyeksportować symbole opcja generuje wygodny makro, które służy do deklarowania metod eksportowanych.

    Kreator projektu C++ dla biblioteki DLL i eksportowanie symboli

  3. Zadeklarować funkcję wyeksportowaną w pliku .h główny:

    Nowy kod projektu i .h pliku DLL z makrami API

    Oświadczenie __declspec(dllexport) powoduje, że publiczne i chronione członkowie klasy mają być widoczne na zewnątrz biblioteki DLL.Aby uzyskać więcej informacji, zobacz Za pomocą elementu dllimport i dllexport w klasach C++.

  4. W pliku .cpp główny należy dodać ciała minimalne dla funkcji:

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

Odcinek testowy projekt do projektu biblioteki DLL

  1. Dodaj projekt DLL do odwołania tego projektu:

    1. Otwórz właściwości tego projektu i wybierz polecenie Często używanych właściwości, Framework i odwołania do.

      Właściwości projektu C++ - RAM i odwołania

    2. Wybierz polecenie dodać nowe odwołanie do.

      W Dodaj odwołanie okno dialogowe Wybierz projekt biblioteki DLL, a następnie wybierz polecenie Dodaj.

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

  2. W pliku .cpp testu jednostki główne należy dołączyć plik .h kodu biblioteki DLL:

    #include "..\RootFinder\RootFinder.h"
    
  3. Dodaj podstawowy test, który korzysta z funkcji eksportowanych:

    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. Tworzenie rozwiązania.

    Nowy test jest widoczny w Eksploratorze przetestować.

  5. W Eksploratorze testów, wybierz Uruchom wszystkie.

    Przekazany podstawowy Test Explorer Test jednostki —

Masz badania i projekty kodu i zweryfikować, że można uruchomić testy, które działają funkcje kod projektu.Teraz możesz zacząć pisać testy prawdziwe i kodu.

Wielokrotnie powtarzane rozszerzające testy i ich

  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ę niezmienianie testów, które minęły.Zamiast tego dodać nowe badanie, zaktualizować kod, tak aby test zakończył się pomyślnie i następnie dodać inny test i tak dalej.

    Gdy użytkownicy zmienią ich wymagania, należy wyłączyć testów, które nie są już prawidłowe.Napisz nowe testy i ich pracy po kolei, w taki sam sposób przyrostowy.

  2. Tworzenie rozwiązania, a następnie w Eksploratorze Test, należy wybrać Uruchomić wszystkie.

    Nowy test zakończy się niepowodzeniem.

    RangeTest nie powiedzie się.

    PoradaPorada

    Zweryfikuj, że każdy test nie powiedzie się natychmiast, po zredagowaniu go.Zapobiega to łatwe błąd pisaniem testu, który nigdy nie kończy się niepowodzeniem.

  3. Tak, aby nowy test zakończył się pomyślnie, należy stosować kod badanego:

    #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. Skompilować projekt, a następnie w Eksploratorze Test, należy wybrać Uruchomić wszystkie.

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

    Przeszedł Test zakresu Explorer Test jednostki —

    PoradaPorada

    Opracowanie kodu przez dodanie testy jeden na raz.Upewnij się, że wszystkie testy przechodzą po każdej iteracji.

Program Debug: polecenie test obawy o błędy

  1. Dodaj kolejny 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 rozwiązania i wybierz polecenie Uruchomić wszystkie.

  3. Otwórz (lub kliknij dwukrotnie) nieudany test.

    Nieudane assertion zostanie wyróżniony.Komunikat o niepowodzeniu jest widoczna w okienku szczegółów Eksploratora Test.

    NegativeRangeTests nie powiodło się.

  4. Aby zobaczyć, dlaczego jest fałszywe, krok za pośrednictwem funkcji:

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

    2. W menu skrótów nieudany test, wybierz polecenie Debug wybrane testy.

      Uruchom przerywa przy punkcie przerwania, przetwarzać przy użyciu kodu.

  5. Wstaw kod w funkcji która w wypadku opracowywania:

    #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. Wszystkie testy zostały teraz zakończone pomyślnie.

    Wszystkie testy zostały zakończone pomyślnie

Refaktoringu kodu bez zmiany testy

  1. Uproszczenia obliczeń centralnej w funkcji SquareRoot:

    // old code:
    //   result = result - (result*result - v)/(2*result);
    // new code:
         result = (result + v/result)/2.0;
    
  2. Tworzenie rozwiązania i wybierz polecenie Uruchomić wszystkie, aby upewnić się, że nie wprowadziły błąd.

    PoradaPorada

    Dobry zestaw testów daje pewność, że użytkownik nie wprowadziły błędów po zmianie kodu.

    Zachowaj Refaktoryzacja oddzielnie od innych zmian.

Kolejne 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.Aby zezwolić na jednostkę przetestowania, które można wykonać, gdy inne składniki nie są jeszcze dostępne, trzeba zastąpić modelowej lub

  • Budowanie badań weryfikacyjnych. Program może badań wykonywanych na serwerze budowania zespołu w ustalonych odstępach czasu.Gwarantuje to, że błędy nie są wprowadzane podczas pracy w kilku członków zespołu jest zintegrowany.

  • Ewidencjonowanie badań. Aby mandatu, że niektóre testy są wykonywane przed każdy członek zespołu sprawdza kod w kontroli źródła.Zazwyczaj jest podzestawem pełnego zestawu badań weryfikacyjnych kompilacji.

    Można również mandatu minimalny poziom pokrycia kodu.

Zobacz też

Zadania

Walkthrough: Creating and Using a Dynamic Link Library (C++)

Koncepcje

Importowanie i eksportowanie

Inne zasoby

Przegląd zarządzanych/niezarządzanych interoperacyjności kodu

Debugowanie kodu macierzystego