Freigeben über


Ausführen von Komponententests für systemeigenen Code mit dem Test-Explorer

In Visual Studio können Sie Komponententests für den nicht verwalteten Code erstellen, der in C++ geschrieben wird.Nicht verwalteter Code wird manchmal als systemeigener Code.

Die folgende Prozedur enthält die wichtigsten Informationen, die Sie von abrufen.Die späteren Abschnitte enthalten eine exemplarische Vorgehensweise, die die Schritte ausführlicher beschreibt.

So fügen Sie Komponententests für einen nicht verwalteten Code DLL schreiben

  1. Verwenden Sie die Systemeigenes Testprojekt Vorlage, um ein separates Visual Studio-Projekt für die Tests zu erstellen.

    Das Projekt enthält einen Beispieltestcode.

  2. Führen Sie die DLL zugreifen dem Testprojekt:

    • #include eine .h Datei, die Deklarationen der extern-zugreifbaren DLL-Funktionen enthält.

      Die .h Datei sollte die Funktionsdeklarationen enthalten, die mit _declspec(dllimport) gekennzeichnet werden.Alternativ können Sie die Methoden mit einer DEF-Datei exportieren.Weitere Informationen finden Sie unter Importieren und Exportieren.

      Komponententests können nur auf Funktionen zugreifen, die aus der DLL getesteten exportiert werden.

    • Fügen Sie das DLL-Projekt den Verweisen des Testprojekts hinzu:

      In Eigenschaften des Testprojekts, erweitern Sie Allgemeine Eigenschaften, Framework und Verweise, und wählen Sie Verweis hinzufügen aus.

  3. Im Testprojekt erstellen Sie Testklassen und Testmethoden, indem Sie die TESTmakros verwenden und Sie das Dienstkonto Klasse wie folgt:

    #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());
      }
    }
    
    • Assert enthält mehrere statische Funktionen, die Sie verwenden können, um das Ergebnis eines Tests zu überprüfen.

    • Der LINE_INFO()-Parameter ist optional.Bei keine PDB-Datei gibt, können sie dem Test Runner, um die Position eines Fehlers zu identifizieren.

    • Sie können Prüfaufbau auch schreiben und Methoden bereinigen.Weitere Informationen öffnen Sie die Definition des TEST_METHOD-Makros, und lesen Sie Kommentare in CppUnitTest.h

    • Sie können Testklassen nicht schachteln.

  4. Verwendungs-Test-Explorer, um die Tests auszuführen:

    1. Klicken Sie im Menü Ansicht wählen Sie Weitere Fenster, Test-Explorer aus.

    2. Erstellen Sie die Visual Studio-Projektmappe.

    3. im Test-Explorer wählen Sie Alle ausführen aus.

    4. Um einen Test im Test-Explorer ausführlicher untersuchen:

      1. Wählen Sie den Testnamen aus, um weitere Details wie eine Fehlermeldung und eine Stapelüberwachung zu finden.

      2. Öffnen Sie den Testnamen (beispielsweise durch Doppelklicken) um zum Fehlerort oder den Testcode zu wechseln.

      3. Klicken Sie im Kontextmenü für einen Test, wählen Sie Ausgewählten Test debuggen, um den Test im Debugger auszuführen.

Exemplarische Vorgehensweise: Entwickeln eines nicht verwalteten DLL mit Test-Explorer

Sie können diese exemplarische Vorgehensweise anpassen, um ein eigenes DLL zu entwickeln.Die wichtigsten Schritte sind, wie folgt:

  1. Erstellen Sie ein systemeigenes Testprojekt.Die Tests werden in einem separaten Projekt aus der DLL erstellt, die Sie entwickeln.

  2. Erstellen Sie ein DLL-Projekt.In dieser exemplarischen Vorgehensweise erstellt ein neues DLL, aber die Prozedur zum Testen eines vorhandenen DLL ist ähnlich.

  3. Führen Sie die DLL-Funktionen sichtbar mit Tests.

  4. Erweitern Sie iterativ die Tests.Es wird empfohlen RED-grün-umgestalten "" Zyklus, in dem Entwicklung des Codes durch die Tests gespeichert werden.

  5. Debug fehlgeschlagenen Tests.Sie können Tests im Debugmodus ausführen.

  6. Gestalten Sie beim Ausführen der Tests unverändert.Das Umgestaltung bedeutet Erhöhung der Struktur des Codes, ohne das externe Verhalten zu ändern.Sie können die Schritte, um die Leistung, die Erweiterbarkeit oder die Lesbarkeit des Codes zu verbessern.Da die Absicht nicht, das Verhalten zu ändern ist, ändern Sie nicht die Tests beim Vornehmen einer Umgestaltungsänderung am Code.Die Tests helfen, sicherzustellen, dass keine Fehler einführen, während Sie umgestalten.Sie können solche Änderungen im viel mehr als Vertrauen daher vornehmen, wenn Sie nicht die Tests ausgeführt wurden.

  7. Überprüfungsabdeckung.Komponententests sind hilfreich, wenn sie mehr des Codes berücksichtigt werden.Sie können bestimmen, das den Teilen des Codes durch die Tests verwendet wurden.

  8. Isolateinheiten von externen Ressourcen.In der Regel ist eine DLL von anderen Komponenten des Systems, dem Sie, wie andere DLL, Datenbanken entwickeln, oder der Remotedebugger Subsysteme abhängig.Es ist hilfreich, jede Einheit der zugehörigen Abhängigkeiten isoliert testen.Externe Komponenten können Tests langsamer ausgeführt werden können.Während der Entwicklung können die anderen Komponenten nicht vollständig.

Erstellen Sie ein systemeigenes Komponententestprojekt

  1. Wählen Sie im Menü Datei die Optionsfolge Neu, Projekt aus.

    Erweitern Sie im Dialogfeld Installiert, Vorlagen, Visual C++, Test.

    Wählen Sie die Vorlage aus. Systemeigenes Testprojekt

    In dieser exemplarischen Vorgehensweise wird das Testprojekt NativeRooterTest benannt.

    Erstellen eines C++-Komponententestprojekts

  2. im neuen Projekt überprüfen Sie unittest1.cpp

    Testprojekt mit TEST_CLASS und TEST_METHOD

    Beachten Sie:

    • Jeder Test wird definiert, indem TEST_METHOD(YourTestName){...} verwendet.

      Sie müssen eine herkömmliche Funktionssignatur nicht schreiben.Die Signatur wird durch das Makro TEST_METHOD erstellt.Das Makro generiert eine Instanzfunktion dass eine leere Rückgabe.Es generiert ebenfalls eine statische Funktion, die Informationen über die Testmethode zurückgibt.Diese Informationen ermöglichen dem Testexplorer, um die Methode zu suchen.

    • Testmethoden werden in Klassen gruppiert, indem TEST_CLASS(YourClassName){...} verwendet.

      Wenn die Tests ausgeführt werden, wird eine Instanz jeder Testklasse erstellt.Die Testmethoden werden in einer nicht angegebenen Reihenfolge aufgerufen.Sie können spezielle Methoden definieren, die vor und nach jedem Modul, Klasse oder Methode aufgerufen werden.Weitere Informationen finden Sie unter Organisieren von C++-Tests.

  3. Stellen Sie sicher, dass die Tests in Test-Explorer ausgeführt werden:

    1. Fügen Sie einen Testcode ein:

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

      Beachten Sie, dass die Assert-Klasse mehrere statische Methoden bereit, die Sie verwenden können, um Ergebnisse in den Testmethoden zu überprüfen.

    2. Klicken Sie im Menü Test wählen Sie Ausführen , Alle Tests aus.

      Die Testbuilds und ausgeführt.

      Test-Explorer angezeigt wird.

      Der Test wird unter Bestandene Tests.

      Komponententest-Explorer mit einem bestandenen Test

Erstellen Sie ein nicht verwaltetes DLL-Projekt

  1. Erstellen Sie ein Visual C++ Projekt, indem Sie die Win32-Projekt Vorlage verwenden.

    In dieser exemplarischen Vorgehensweise wird das Projekt RootFinder benannt.

    Erstellen eines C++-Win32-Projekts

  2. Ausgewähltes DLL und Symbole exportieren im Win32-Anwendungs-Assistenten.

    Die Option Symbole exportieren generiert ein komfortables Makro, das Sie verwenden können, um exportierte Methoden zu deklarieren.

    C++-Projektassistent mit den Einstellungen "DLL" und "Symbole exportieren"

  3. Deklarieren Sie eine exportierte Funktion in der wichtigsten H-Datei:

    Neues DLL-Codeprojekt und .h-Datei mit API-Makros

    Der Deklarator __declspec(dllexport) wird die öffentlichen und die geschützte Member der Klasse, außerhalb der DLL sichtbar zu machen.Weitere Informationen finden Sie unter Verwenden des dllimport und des dllexport in C++-Klassen.

  4. In der wichtigsten CPP-Datei fügen Sie einen minimalen Text für die Funktion hinzu:

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

Verknüpfen Sie das Testprojekt dem DLL-Projekt

  1. Fügen Sie das DLL-Projekt Projektverweisen des Testprojekts hinzu:

    1. Öffnen Sie die Eigenschaften des Testprojekts und wählen Sie Allgemeine Eigenschaften, Framework und Verweise aus.

      C++-Projekteigenschaften - Framework und Verweise

    2. Wählen Sie Neuen Verweis hinzufügen aus.

      Im Dialogfeld Verweis hinzufügen wählen Sie das DLL-Projekt aus und wählen Sie Hinzufügen aus.

      C++-Projekteigenschaften - Neuen Verweis hinzufügen

  2. In der wichtigsten Komponententestcpp-datei schließen Sie die Headerdatei des DLL-Codes ein:

    #include "..\RootFinder\RootFinder.h"
    
  3. Fügen Sie einen grundlegenden Test hinzu, der die exportierte Funktion verwendet:

    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. Erstellen Sie die Projektmappe.

    Der neue Test wird im Test-Explorer.

  5. im Test-Explorer wählen Sie Alle ausführen aus.

    Komponententest-Explorer - Einfachen Test bestanden

Sie haben den Test und die Codeprojekte installiert, und überprüft, ob Sie Tests ausführen können, die Funktionen im Codeprojekt ausführen.Jetzt können Sie beginnen, um echte Tests und Code zu schreiben.

Führen Sie die Tests erweitern und legen Sie sie übergeben

  1. Fügen Sie einen neuen Test hinzu:

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

    Es wird empfohlen, dass Sie keine Tests ändern, die erfolgreich abgeschlossen wurden.Stattdessen fügen Sie einen neuen Test hinzufügen, aktualisieren Sie den Code so ist der Test erfolgreich, und fügen Sie anschließend einen anderen Test, usw. hinzu.

    Wenn die Benutzer ihre Anforderungen ändern, deaktivieren Sie die Tests, die nicht mehr richtig sind.Schreiben Sie neue Tests und legen Sie sie, in der gleichen Weise inkrementellen einzeln arbeiten.

  2. Erstellen Sie die Projektmappe und dann im Test-Explorer, Alle ausführen auswählen.

    Der neue Test schlägt fehl.

    Fehler beim RangeTest

    TippTipp

    Stellen Sie sicher, dass jeder Versuch fehlschlägt, nachdem Sie ihn geschrieben haben.Dies hilft Ihnen, den einfachen Fehler zum Schreiben eines Versuchs zu vermeiden, der nie fehlschlägt.

  3. Vergrößern Sie den getesteten Code, sodass der neue Test übergeben werden:

    #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. Erstellen Sie die Projektmappe und dann im Test-Explorer, Alle ausführen auswählen.

    Erfolgreich beider Tests.

    Komponententest-Explorer - Bereichstest bestanden

    TippTipp

    Entwickeln von Code, indem Sie einzeln Tests hinzufügen.Überprüfen Sie die ob alle Tests nach jeder Iteration.

Debuggen Sie einen fehlgeschlagenen Test

  1. Fügen Sie einen anderen Test hinzu:

    #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. Erstellen Sie die Projektmappe und wählen Sie Alle ausführen aus.

  3. Öffnen Sie (oder) auf den fehlgeschlagenen Test.

    Der Assertionsfehler wird hervorgehoben.Die Fehlermeldung ist im Detailbereich des Test-Explorers sichtbar.

    Fehler bei NegativeRangeTests

  4. So finden, warum der Test fehlschlägt, durch die Funktion erfolgen:

    1. Legen Sie einen Haltepunkt am Anfang der SquareRoot-Funktion fest.

    2. Klicken Sie im Kontextmenü des fehlgeschlagenen Tests, wählen Sie Ausgewählte Tests debuggen aus.

      Wenn die Ausführung am Haltepunkt beendet wird, indem Sie den Code schrittweise durchlaufen.

  5. Fügen Sie Code in der Funktion ein, die Sie entwickeln:

    #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. Alle Tests jetzt übergeben.

    Alle Tests erfolgreich

Gestalten Sie den Code, ohne Tests zu ändern

  1. Vereinfachen Sie die zentrale Berechnung in der SquareRoot-Funktion:

    // old code:
    //   result = result - (result*result - v)/(2*result);
    // new code:
         result = (result + v/result)/2.0;
    
  2. Erstellen Sie die Projektmappe und wählen Sie Alle ausführen sicher, dass Sie keinen Fehler eingeführt haben.

    TippTipp

    Ein guter Satz von Komponententests gibt sicher, dass Sie keine Fehler eingeführt haben, wenn Sie den Code ändern.

    Halten Sie, getrennt von anderen Änderungen umzugestalten.

Nächste Schritte

  • Isolation Die meisten DLL ist von anderen Subsystemen wie Datenbanken und von anderen DLLs abhängig.Diese anderen Komponenten werden häufig parallel entwickelt.Um den auszuführenden Komponententests zu ermöglichen während andere Komponenten noch nicht verfügbar sind, müssen Sie Pseudo ersetzen oder

  • Buildüberprüfungstests. Sie können die Tests, die auf Buildserver des Teams in festgelegten Intervallen ausgeführt werden.Dadurch wird sichergestellt, dass Fehler nicht eingegeben werden, wenn die Arbeit einige Teammitglieder integriert ist.

  • Einchecktests. Sie können anfordern, dass einige Tests ausgeführt werden, bevor jedes Teammitglied Code in die Quellcodeverwaltung eingecheckt.In der Regel ist dies eine Teilmenge des vollständigen Satzes von Buildüberprüfungstests.

    Sie können eine Untergrenze der Codeabdeckung auch anfordern.

Siehe auch

Aufgaben

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

Konzepte

Importieren und Exportieren

Weitere Ressourcen

Eine Übersicht der verwalteten und Code-Interoperabilität

Debuggen von systemeigenem Code