Jak skonfigurować testy jednostkowe dla programu Visual Studio C ++

93

Mam problem ze zrozumieniem, jak skonfigurować środowisko testowe i używać go w programie Visual Studio 2008 dlaC++ przypuszczalnie z pakietem wbudowany w jednostkę badającą.

Wszelkie linki lub samouczki będą mile widziane.

DShook
źródło
Google wypuszcza C ++ Test Framework, który jest bardzo podobny do frameworków xUnit. http://code.google.com/p/googletest/
popopome
Jakiego frameworka ostatecznie używasz?
Joakim Karlsson
właściwie nadal żadnego z nich nie używałem. Zdecydowałem, że to, nad czym pracowałem nad testami jednostkowymi, nie było najbardziej efektywnym wykorzystaniem czasu.
DShook

Odpowiedzi:

56

Ta strona może pomóc, zawiera przegląd wielu frameworków testów jednostkowych C ++:

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Jednostka ++
  • CxxTest

Sprawdź CPPUnitLite lub CPPUnitLite2 .

CPPUnitLite został stworzony przez Michaela Feathersa, który pierwotnie przeportował JUnit Javy do C ++ jako CPPUnit (CPPUnit próbuje naśladować model rozwojowy JUnit - ale C ++ nie posiada funkcji Javy [np. Refleksji], aby ułatwić korzystanie z niego).

CPPUnitLite próbuje stworzyć prawdziwy framework testowy w stylu C ++, a nie Java przeniesiony do C ++. (Parafrazuję z książki Feather's Working Effective with Legacy Code ). CPPUnitLite2 wydaje się być kolejnym przepisaniem, z większą liczbą funkcji i poprawek błędów.

Właśnie natknąłem się też na UnitTest ++ który zawiera rzeczy z CPPUnitLite2 i kilka innych frameworków.

Firma Microsoft wydała WinUnit .

Sprawdź także Catch lub Doctest

Aardvark
źródło
2
Googletest jest bardzo podobny do boost :: test, ale trochę łatwiejszy do zintegrowania z VS
Martin Beckett
3
Jestem zaskoczony, że Catch nie jest tutaj wymieniony. Sprawdź również test doctest - moja reimplementacja Catch z dużym naciskiem na szybkość kompilacji - sprawdź FAQ, aby zobaczyć, co różni się między nimi
onqtam
1
@onqtam nie zdziw się, to pytanie / odpowiedź pochodzi z 2008 roku! Dodałem sugerowane linki.
Aardvark
24

Istnieje sposób na przetestowanie niezarządzanego języka C ++ przy użyciu wbudowanej platformy testowej w programie Visual Studio 2008 . Jeśli utworzysz projekt testowy w języku C ++ przy użyciu języka C ++ / CLI, możesz następnie wykonywać wywołania niezarządzanej biblioteki DLL. Będziesz musiał przełączyć obsługę środowiska uruchomieniowego języka wspólnego na / clr z / clr: safe, jeśli chcesz przetestować kod, który został napisany w niezarządzanym C ++.

Mam tutaj szczegóły krok po kroku na moim blogu: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

Jared
źródło
1
To nakłada pewne ograniczenia na twój kod C ++, mam co najmniej jedną bazę kodu, w której próba włączenia jego nagłówków do kodu C ++ / CLI była większym kłopotem niż było to warte. Dużą korzyścią dla mnie z używania C ++ / CLI jest to, że możesz używać funky parametryzowanych testów z atrybutami takimi jak RowTest w mbUnit / NUnit / xUnit.Net
Andy Dent
9

Oto podejście, którego używam do testowania modułu ponownego zapisywania adresów URL w usługach IIS w firmie Microsoft (jest oparty na wierszu polecenia, ale powinien działać również w przypadku VS):

  1. Upewnij się, że pliki nagłówkowe nadają się do użytku, przenosząc kod źródłowy do plików CPP i w razie potrzeby używając deklaracji do przodu.
  2. Skompiluj swój kod, aby przetestować go jako bibliotekę (.lib)
  3. Utwórz projekt UnitTest jako C ++ z obsługą CLR.
  4. Dołącz pliki nagłówkowe.
  5. Dołącz swoje pliki .lib.
  6. Dodaj odwołanie do Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Użyj naprawdę małej klasy do zadeklarowania testu jednostkowego i przeskocz z kodu zarządzanego do C ++ / natywnego w ten sposób (może zawierać literówki):

Oto przykład:

// Example
#include "stdafx.h"
#include "mstest.h"

// Following code is native code.
#pragma unmanaged
void AddTwoNumbersTest() {
  // Arrange
  Adder yourNativeObject;
  int expected = 3;
  int actual;
  // Act
  actual = yourNativeObject.Add(1, 2);
  // Assert
  Assert::AreEqual(expected, actual, L"1 + 2 != 3");
}

// Following code is C++/CLI (Managed)
#pragma managed
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
[TestClass]
public ref class TestShim {
public:
  [TestMethod]
  void AddTwoNumbersTest() {
     // Just jump to C++ native code (above)
     ::AddTwoNumbersTest();
  }
};

Dzięki takiemu podejściu ludzie nie muszą uczyć się zbyt wiele C ++ / CLI, cały prawdziwy test zostanie wykonany w natywnym języku C ++, a klasa TestShim zostanie użyta do 'opublikowania' testu w MSTest.exe (lub uczynienia go widocznym ).

Aby dodać nowe testy, wystarczy zadeklarować nową metodę [TestMethod] void NewTest () {:: NewTest ();} i nową natywną funkcję void NewTest (). Żadnych makr, żadnych sztuczek, prosto do przodu.

Teraz plik heade jest opcjonalny, ale można go użyć do ujawnienia metod klasy Assert z natywnymi sygnaturami C ++ (np. Wchar_t * zamiast Stirng ^), więc można go trzymać blisko C ++ i daleko od C ++ / CLI :

Oto przykład:

// Example
#pragma once
#pragma managed(push, on)
using namespace System;
class Assert {
public:
    static void AreEqual(int expected, int actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    static void AreEqual(int expected, int actual, PCWSTR pszMessage) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual, gcnew String(pszMe
ssage));
    }

    template<typename T>
    static void AreEqual(T expected, T actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    // Etcetera, other overloads...
}
#pragma managed(pop)

HTH

aracntido
źródło
6

Osobiście wolę WinUnit, ponieważ nie wymaga on ode mnie pisania niczego poza testami (buduję .dll jako test, a nie exe). Po prostu buduję projekt i wskazuję WinUnit.exe na mój testowy katalog wyjściowy i uruchamia wszystko, co znajdzie. Możesz pobrać projekt WinUnit tutaj . (MSDN wymaga teraz pobrania całego wydania, a nie artykułu. WinUnit jest zawarty w pakiecie).

moswald
źródło
4

Framework dołączony do VS9 to .NET, ale możesz pisać testy w C ++ / CLI, więc jeśli dobrze nauczysz się niektórych izmów .NET, powinieneś być w stanie przetestować prawie każdy kod C ++.

boost.test i googletest wyglądają na dość podobne, ale dostosowane do nieco innych zastosowań. Oba mają składnik binarny, więc będziesz potrzebować dodatkowego projektu w swoim rozwiązaniu, aby skompilować i uruchomić testy.

Frameworkiem, którego używamy, jest CxxTest , który jest znacznie lżejszy; zawiera tylko nagłówki i używa skryptu Perl (!) do pobierania informacji o zestawie testów z nagłówków (zestawy dziedziczą po CxxTest :: Base, wszystkie nazwy metod testowych zaczynają się od „test”). Oczywiście wymaga to pobrania Perla z jednego lub drugiego źródła , co zwiększa nakład pracy przy konfiguracji środowiska kompilacji.

Ben Straub
źródło
CxxTest może używać Pythona zamiast perla
Martin Beckett
Musisz także uważać na wszelkie biblioteki DLL wymagane przez Twój kod - miałem problemy z testowaniem kodu C ++ / CLI przez NUnit i mbUnit, próbując załadować biblioteki DLL.
Andy Dent
2

Używam UnitTest ++ .

Przez lata, odkąd napisałem ten post, źródło przeniosło się z SourceForge na github. Również przykładowy samouczek jest teraz bardziej agnostyczny - w ogóle nie wchodzi w konfigurację ani projekt.

Wątpię, aby nadal działał w Visual Studio 6, ponieważ pliki projektu są teraz tworzone przez CMake. Jeśli nadal potrzebujesz obsługi starszej wersji, możesz pobrać ostatnią dostępną wersję w gałęzi SourceForge .

graham.reeds
źródło
2

Wszystkie wymienione tutaj narzędzia to narzędzia wiersza poleceń. Jeśli szukasz bardziej zintegrowanego rozwiązania, spójrz na cfix studio , które jest dodatkiem Visual Studio do testów jednostkowych C / C ++. Jest dość podobny do TestDriven.Net, ale dla (niezarządzanego) C / C ++ zamiast .NET.

Peter Mortensen
źródło
1

Użyłem CppUnit z VS2005 i Eclipse. Wiki jest bardzo dokładna (zwłaszcza jeśli znasz JUnit).

colgur
źródło
1

Nie jestem w 100% pewien co do VS2008, ale wiem, że framework do testów jednostkowych, który Microsoft dostarczył w VS2005 jako część ich pakietu Team Suite, był przeznaczony tylko dla .NET, a nie C ++

Użyłem również CppUnit i było w porządku. Tak samo jak NUnit / JUnit / tak dalej.

Jeśli korzystałeś z boost, mają one również bibliotekę testów jednostkowych

Faceci stojący za boostem mają poważne kotlety kodowania, więc powiedziałbym, że ich framework powinien być całkiem niezły, ale może nie być najbardziej przyjazny dla użytkownika :-)

Orion Edwards
źródło
1

Z tych samych powodów lubię CxxTest. Jest to tylko plik nagłówkowy, więc nie jest wymagane łączenie. Nie utknąłeś z Perlem, ponieważ istnieje również Python runner. Wkrótce przejrzę bibliotekę Google. Rzeczy doładowania wciągają zbyt dużo innego bagażu.

ZebZiggle
źródło
1

Tester jednostkowy dla Visual Studio 2008 jest przeznaczony tylko dla kodu .NET, o ile wiem.

Użyłem CppUnit w Visual Studio 2005 i stwierdziłem, że jest całkiem niezły.

O ile pamiętam, konfiguracja była stosunkowo bezbolesna. Po prostu upewnij się, że w twoich projektach testowych linker (Linker → Input → Additional Dependencies) zawiera cppunitd.lib.

Następnie #include <cppunit/extensions/HelperMacros.h>w swoim nagłówku.

Następnie możesz wykonać czynności opisane w http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html, aby uruchomić klasę testową.

Lehane
źródło
1

Cierpiałem z powodu implementacji testów jednostkowych dla niezarządzanej aplikacji C ++ w środowisku Windows z Visual Studio. Więc udało mi się przezwyciężyć i napisałem post jako przewodnik krok po kroku do niezarządzanego testowania jednostkowego aplikacji w C ++. Mam nadzieję, że może ci to pomóc.

Test jednostkowy niezarządzanego języka C ++ w programie Visual Studio

Nayana Adassuriya
źródło