So richten Sie Google C ++ Testing Framework (gtest) mit Visual Studio 2005 ein

82

Es ist nicht auf der Website dokumentiert und die Leute scheinen Probleme beim Einrichten des Frameworks zu haben. Kann jemand bitte eine schrittweise Einführung für ein Beispielprojekt-Setup zeigen?

Knaser
quelle
Ich bin froh, dass jemand gefragt hat ...
Boyang

Antworten:

44

Was Arlaharen sagte, war im Grunde richtig, außer dass er den Teil weggelassen hat, der Ihre Linkerfehler erklärt. Zunächst müssen Sie Ihre Anwendung ohne CRT als Laufzeitbibliothek erstellen . Sie sollten dies sowieso immer tun, da dies die Verteilung Ihrer Anwendung wirklich vereinfacht. Wenn Sie dies nicht tun, muss auf allen Benutzern die Visual C ++ - Laufzeitbibliothek installiert sein, und diejenigen, die sich nicht über mysteriöse DLLs beschweren, die auf ihrem System fehlen ... für die zusätzlichen paar hundert Kilobyte, die das Verknüpfen kostet Mit der CRT sparen Sie sich statisch viel Kopfschmerzen später bei der Unterstützung (vertrauen Sie mir in diesem Fall - ich habe es auf die harte Tour gelernt!).

Um dies zu tun, gehen Sie zu den Eigenschaften des Ziels -> C / C ++ -> Codegenerierung -> Laufzeitbibliothek, und es muss für Ihren Release-Build als "Multi-Threaded" und für "Multi-Threaded-Debug" für festgelegt werden Ihr Debug-Build.

Da die Gtest Bibliothek in der gleichen Art und Weise aufgebaut ist, müssen Sie sicherstellen, dass Sie eine Verknüpfung gegen die richtige Version es , oder aber der Linker in einer anderen Kopie der Laufzeitbibliothek ziehen, die der Fehler Sie btw sah (dieses sollte keinen Unterschied machen, ob Sie MFC verwenden oder nicht). Sie müssen gtest sowohl als Debug- als auch als Release- Modus erstellen und beide Kopien behalten. Anschließend verknüpfen Sie gtest.lib / gtest_main.lib in Ihrem Release-Build und gtestd.lib / gtest_maind.lib in Ihrem Debug-Build.

Außerdem müssen Sie sicherstellen, dass Ihre Anwendung auf das Verzeichnis verweist, in dem die gtest-Headerdateien gespeichert sind (in den Eigenschaften -> C / C ++ -> Allgemein -> Zusätzliche Include-Verzeichnisse). Wenn Sie jedoch auf den Linker-Fehler stoßen, gehe ich davon aus dass Sie es bereits geschafft haben, diesen Teil korrekt zu machen, sonst hätten Sie viel mehr Compilerfehler, die Sie zuerst behandeln müssten.

Nik Reiman
quelle
Ich habe das auf die "harte Tour" gelernt und den ganzen Tag verbracht. Endlich habe ich es zum Laufen gebracht, nachdem ich beide auf die gleiche Weise gebaut hatte. Vielen Dank für Ihre Antwort, aber es ist spät. : / Und übrigens, Ihr CRT-Vorschlag ist falsch, aber ich habe nicht genug Platz, um darüber zu diskutieren. Siehe tinyurl.com/dj5k7k
Knaser
Nun, wenn Sie es auf die "harte Tour" gelernt haben, werden Sie möglicherweise vergessen, dass die CRT-Laufzeit-DLLs als "weiterverteilbar" bezeichnet werden. Es ist also klar, dass Sie sie selbst neu verteilen müssen ... entweder indem Sie das Redist-Installationsprogramm in Ihr eigenes Installationsprogramm aufnehmen , oder indem Sie einfach die benötigten DLLs in Ihren eigenen Installationsordner extrahieren ... (ggf. einschließlich einer Manifestdatei)
smerlin
1
Die statische Verknüpfung der CRT bedeutet, dass Ihre Anwendung keine
Exploit-
106

(Mit diesen Anweisungen funktioniert das Testframework für die Debug-Konfiguration. Es sollte ziemlich trivial sein, denselben Prozess auf die Release-Konfiguration anzuwenden.)

Holen Sie sich das Google C ++ Testing Framework

  1. Laden Sie das neueste gtest-Framework herunter
  2. Entpacken nach C:\gtest

Erstellen Sie die Framework-Bibliotheken

  1. Öffnen Sie C:\gtest\msvc\gtest.slnin Visual Studio
  2. Setzen Sie die Konfiguration auf "Debug"
  3. Lösung erstellen

Erstellen und konfigurieren Sie Ihr Testprojekt

  1. Erstellen Sie eine neue Lösung und wählen Sie die Vorlage Visual C ++> Win32> Win32 Console Application
  2. Klicken Sie mit der rechten Maustaste auf das neu erstellte Projekt und wählen Sie Eigenschaften
  3. Ändern Sie die Konfiguration in Debug.
  4. Konfigurationseigenschaften> C / C ++> Allgemein> Zusätzliche Include-Verzeichnisse: Hinzufügen C:\gtest\include
  5. Konfigurationseigenschaften> C / C ++> Codegenerierung> Laufzeitbibliothek: Wenn Ihr Code mit einer Laufzeit-DLL verknüpft ist, wählen Sie Debug-DLL mit mehreren Threads (/ MDd). Wenn nicht, wählen Sie Multi-Threaded Debug (/ MTd).
  6. Konfigurationseigenschaften> Linker> Allgemein> Zusätzliche Bibliotheksverzeichnisse: Fügen Sie C:\gtest\msvc\gtest\Debugoder C:\gtest\msvc\gtest-md\Debug, abhängig vom Speicherort von gtestd.lib, hinzu
  7. Konfigurationseigenschaften> Linker> Eingabe> Zusätzliche Abhängigkeiten: Hinzufügen gtestd.lib

Überprüfen, ob alles funktioniert

  1. Öffnen Sie die CPP in Ihrem Testprojekt, das die main()Funktion enthält.
  2. Fügen Sie den folgenden Code ein:

    #include "stdafx.h"  
    #include <iostream>
    
    #include "gtest/gtest.h"
    
    TEST(sample_test_case, sample_test)
    {
        EXPECT_EQ(1, 1);
    }
    
    int main(int argc, char** argv) 
    { 
        testing::InitGoogleTest(&argc, argv); 
        RUN_ALL_TESTS(); 
        std::getchar(); // keep console window open until Return keystroke
    }
    
  3. Debuggen> Debuggen starten

Wenn alles funktioniert hat, sollte das Konsolenfenster angezeigt werden und Ihnen die Unit-Testergebnisse anzeigen.

mtlynch
quelle
9
das war ein toller Führer! Ich konnte den Ball ins Rollen bringen, aber ich würde noch eine Anmerkung hinzufügen: Das Testprojekt und die gtest-Bibliothek müssen mit derselben Codegenerierungsoption erstellt werden, entweder beide sind / MDd oder beide sind / MTd, sonst wird es eine Reihe von Verknüpfungsfehlern sein.
Kiril
1
Hinweis: Wer auch immer versucht, diese ähnliche Implementierung mit Microsoft Visual Studio .Net 2003 durchzuführen, die Google Test Framework-Bibliotheken setzen die Laufzeitbibliothek automatisch auf " Single-Threaded-Debug " für den Debug-Modus und " Single-Threaded " für den Release-Modus und as Soweit ich es ausprobiert habe, ist die Option zum Ändern von der Codegenerierung nicht verfügbar. Stellen Sie daher sicher, dass Sie die Option Single-Threaded als Laufzeitbibliothek in Ihrem Projekt auswählen. Davon abgesehen funktioniert dieses einfache und kurze Tutorial perfekt!
Neophile
Dies ist das erste von fünf Tutorials, die funktionierten und keine schlechte Praxis bewarben. Ich würde es lieben, wenn dies den wichtigen Aspekt der Verknüpfung des Testprojekts mit dem ursprünglichen Projekt abdecken würde ... Über 30 Websites später habe ich keine funktionierende Antwort gefunden. Ich habe 3 Tage damit verbracht.
Person27
Ich habe Wert in "Projekteigenschaften> Konfigurationseigenschaften> C / C ++> Laufzeitbibliothek" entfernt, dann hat es funktioniert
Manohar Reddy Poreddy
5

Nachdem ich gtest erstellt habe, habe ich Folgendes getan:

  1. Fügen Sie \ mypath \ gtest-1.0.1 \ Debug (oder Release) zu Common Properties-> Linker-> General-> Additional Library Directories hinzu
  2. Fügen Sie gtest.lib und gtest_main.lib zu Common Properties-> Linker-> Input-> Additional Dependencies hinzu

Danach schreibe ich meine Tests einfach mit TEST oder TEST_F und kompiliere sie zusammen mit meiner Hauptfunktion:

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
Arlaharen
quelle
5
Ich erhalte viele Linker-Fehler: bereits in gtest.lib definiert ... zB: 1> LIBCMT.lib (tidtable.obj): Fehler LNK2005: __encode_pointer bereits in msvcrt.lib (MSVCR80.dll) definiert Oh, übrigens, ich Ich versuche, Tests für einen MFC-Code zu schreiben.
Knaser
Es tut uns leid. Ich glaube nicht, dass ich dir dort helfen kann. Aus irgendeinem Grund bekomme ich diese Linkfehler nicht. Haben Sie versucht, mit gtest nur einen Hallo-Welttest zu erstellen?
Arlaharen
gtest_main.libenthält die Standardfunktion main, daher möchten Sie sie wahrscheinlich nicht einschließen, wenn Sie Ihre eigene mainexplizit geschrieben haben.
Groo
5

Wenn Sie kein eigenes main () für Tests schreiben möchten, können Sie die in gtest_main.lib definierte main () -Funktion verwenden, aber dann erhalten Sie Linkerfehler "Einstiegspunkt muss definiert sein" in VS2012. Setzen Sie in Ihrem Testprojekt ProjectProperties-> Linker-> System-> SubSystem auf "Console", da dies VS2012 zwingt, nach einem Einstiegspunkt namens "main ()" zu suchen und diesen in gtest_main.lib zu finden (vorausgesetzt, Sie haben einen Link erstellt) es in richtig).

philipper
quelle
2

In Microsoft Visual Studio verursacht ein falsch konfigurierter Laufzeitbibliothekstyp Verknüpfungsfehler.

VS 2005 (und 2008) verwendet standardmäßig Multithreaded DLL oder Multithreaded Debug DLL. Die Google Test-Bibliothek verwendet jedoch standardmäßig die Debug-Laufzeit von Mulithreaded oder Mulithreaded.

Wählen Sie daher den geeigneten Laufzeitbibliothekstyp für die Google-Testbibliothek. (unter Konfigurationseigenschaften -> Codegenerierung -> Laufzeitbibliothek).

Jinuk Kim
quelle
Was ist angemessene Laufzeit? (MD oder andere)
Ramadheer Singh
0

Die Behebung vieler Fehler dauerte eine Weile.

Hier sind einfache Schritte:

# Laden Sie die Googletest-ZIP-Datei von folgender Adresse herunter: https://github.com/google/googletest

# Googletest Visual Studio-Lösung

Open    C:\googletest\googletest\msvc\2010\gtest.sln
    Change "Solution configuration"
        from "Debug" to "Release"
    Build Solution
        creates gtest.lib

# Dein Projekt:

Project Properties > Configuration Properties > VC++ Directories > Include Directories
    append the following:       ;C:\googletest\googletest\include

Project Properties > Configuration Properties > Linker > General > Additional Library Directories > 
    append the following:           ;C:\googletest\googletest\msvc\2010\gtest\Win32-Release

Project Properties > Configuration Properties > C/C++ > Runtime Library
    Remove the value of the above. (or match it to Googletest project)
Manohar Reddy Poreddy
quelle