Porównanie struktur testów jednostkowych C ++ [zamknięte]

299

Wiem, że jest już kilka pytań dotyczących rekomendacji dla frameworków testów jednostkowych C ++, ale wszystkie odpowiedzi nie pomogły, ponieważ po prostu zalecają jeden z frameworków, ale nie dostarczają żadnych informacji na temat porównania (funkcji).

Myślę, że najciekawsze frameworki to CppUnit, Boost i nowa platforma testowania Google. Czy ktoś już porównał?

gospodyni
źródło
Mam własną platformę testową opartą na MKOl, która bardziej mi się podoba, ponieważ nie jest to tylko klon tego, co robią wszyscy inni, ale rozwiązuje to, co uważam za wszystkie problemy innych. Piszesz przypadki testowe, wywodząc się z klasy, a nie używając makr. Makra używane tylko do asercji, ponieważ dają refleksję. Dostosowane wyniki statystyk testowych. Uruchom ze skryptów IOC, abyś wybrał to, co testujesz, jak często i przy jakich parametrach.
CashCow
i jest to genialne z punktu widzenia rozwoju, ponieważ gdy dodam własny test, mogę go uruchomić bez konieczności uruchamiania wszystkich innych jednocześnie. Wiem, że mój kod działa.
CashCow

Odpowiedzi:

99

Zobacz to pytanie do dyskusji.

Polecają artykuły: Poznawanie środowiska Jungle Framework Testing Unit C ++ , autor: Noel Llopis. I nowsze: C ++ Test Unit Frameworks

Nie znalazłem jeszcze artykułu porównującego googletest z innymi ramami.

Sam Saffron
źródło
Jak napisałem: wszystkie odpowiedzi tylko zalecają jedną z ram, ale nie porównują ramy z inną.
gospodyni
Nie jesteś też zadowolony z tego artykułu?
Gishu
7
Jedna krytyka: artykuł, choć dobry, pochodzi z 2004 roku i nie zawiera testu Google.
richq
2
W pierwszym linku zobaczysz dwa porównania. Poza nowymi ramami od Google większość informacji jest (są?) Wciąż aktualne. (A CppUnit nie jest najciekawszy, jest zbyt niezdarny, aby go używać)
Luc Hermitte
1
naprawił linki i rozszerzył odpowiedź o nowsze porównanie
Sam Saffron
120

Nowym odtwarzaczem jest Google Test (znany również jako Google C ++ Testing Framework ), co jest całkiem miłe.

#include <gtest/gtest.h>

TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

Główne cechy:

  • Przenośny
  • Śmiertelne i nie krytyczne stwierdzenia
  • Łatwe asercje wiadomości informacyjne :ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Test Google automatycznie wykrywa testy i nie wymaga ich wyliczenia w celu ich uruchomienia
  • Ułatw sobie poszerzenie słownictwa asertywnego
  • Testy śmierci (patrz przewodnik zaawansowany)
  • SCOPED_TRACE dla pętli podprogramów
  • Możesz zdecydować, które testy uruchomić
  • Generowanie raportu z testu XML
  • Urządzenia / Mock / Szablony ...
Wernight
źródło
3
Bardzo lubię korzystać z testu google w niektórych innych frameworkach, zwłaszcza z możliwościami kpienia, które można znaleźć w frameworku googlemock.
Mike
8
Zapewniam wszystkie te funkcje (chociaż niektóre nie są jeszcze publiczne) i więcej w moim nowym środowisku testowym CATCH. Zobacz moją odpowiedź na link.
philsquared
2
połączenie go z frameworkiem Google C ++ Mocking sprawia, że ​​jest to naprawdę potężny framework testowy xUnit do testowania jednostkowego kodu C ++.
ratkok
5
@CashCow Uruchamianie z kompilacją to coś innego niż wykrywanie testów. Uruchamianie z kompilacją zależy od systemu kompilacji. Wykrywanie testów oznacza, że ​​nie musisz wymieniać wszystkich testów w innej klasie, po prostu utwórz metody testów i to wszystko.
Wernight
Nie podoba mi się jednak ich nadużywanie makr i fakt, że używają typowych słów takich jak TEST, które mogą się z czymś kolidować. GTEST byłby lepszy, rzadziej kolidujący.
CashCow
112

Właśnie wypchnąłem swoją własną platformę CATCH . Jest wciąż w fazie rozwoju, ale wierzę, że już przewyższa większość innych platform. Różni ludzie mają różne kryteria, ale starałem się objąć większość gruntów bez zbyt wielu kompromisów. Spójrz na mój link do blogu, aby zobaczyć degustatora. Moje pięć najważniejszych funkcji to:

  • Tylko nagłówek
  • Automatyczna rejestracja testów opartych na funkcjach i metodach
  • Rozkłada standardowe wyrażenia C ++ na LHS i RHS (więc nie potrzebujesz całej rodziny makr asertywnych).
  • Obsługa zagnieżdżonych sekcji w urządzeniu opartym na funkcji
  • Testy nazw przy użyciu języka naturalnego - generowane są nazwy funkcji / metod

Posiada również wiązania Objective-C. Projekt jest hostowany na Github

philsquared
źródło
Proszę rozważyć dodanie CHECK_FLASEi REQUIRE_FLASEmakra.
Emile Cormier
6
Najlepsze ramy moim zdaniem.
CoffeDeveloper
3
doctest to moja reimplementacja Catcha z ogromnym naciskiem na szybkość kompilacji - sprawdź FAQ, aby zobaczyć, jak się różnią
onqtam 10.10.16
@einpoklum Catch nie jest porzucony - twórca pracuje nad wersją 2 biblioteki. doctest jest swego rodzaju ponowną implementacją Catch 1 z pewnymi premiowymi decyzjami projektowymi
onqtam
2
Naprawdę jestem zagubiony, porównując wszystkie frameworki testowe (jedną z nich muszę teraz wybrać). Czy napisałbyś własną odpowiedź porównując i kontrastując doctest z Catch i innymi ofertami?
einpoklum
53

Biblioteka testów doładowania jest bardzo dobrym wyborem, szczególnie jeśli już używasz doładowania.

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(MyTestCase)
{
    // To simplify this example test, let's suppose we'll test 'float'.
    // Some test are stupid, but all should pass.
    float x = 9.5f;

    BOOST_CHECK(x != 0.0f);
    BOOST_CHECK_EQUAL((int)x, 9);
    BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

To wspiera:

  • Automatyczna lub ręczna rejestracja testów
  • Wiele twierdzeń
  • Automatyczne porównywanie zbiorów
  • Różne formaty wyjściowe (w tym XML )
  • Urządzenia / szablony ...

PS: Napisałem o tym artykuł, który może ci pomóc: C ++ Unit Testing Framework: A Boost Test Tutorial

Wernight
źródło
Kiedyś korzystałem z testu Boost i podobało mi się, z tym wyjątkiem, że wydawało się, że zmienia się znacznie między wydaniami. Wystarczająco trudno było sprzedać testowanie jednostkowe mojemu klientowi bez konieczności poświęcania więcej czasu (i pieniędzy) na naprawę testów po zmianie API, niż na naprawę kodu, który miał być testowany. W końcu porzuciłem go i napisałem własny - to było jednak około 5 lat temu.
Element 10
5
Link do samouczka jest zepsuty
mloskot
2
@mloskot To działa ponownie.
Chris Jester-Young,
@mloskot Przepraszamy za to, proszę, wyślij mi bezpośrednio e-mail, jeśli zauważysz, że jest uszkodzony. Łatwo jest znaleźć niż komentarz. :)
Wernight
@Wernight Yup, działa ponownie. Thx
mloskot,
16

Niedawno wypuściłem xUnit ++ , szczególnie jako alternatywę dla Google Test i Boost Test Library (zobacz porównania ). Jeśli znasz xUnit.Net, jesteś gotowy na xUnit ++.

#include "xUnit++/xUnit++.h"

FACT("Foo and Blah should always return the same value")
{
    Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
    Assert.Equal(Foo(), Blah());
}

THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
    std::make_tuple(0, "0"),
    std::make_tuple(1, "1"),
    std::make_tuple(2, "2"))
{
    Assert.Equal(expected, Foo(input));
}

Główne cechy:

  • Niezwykle szybki: testy uruchamiają się jednocześnie .
  • Przenośny
  • Automatyczna rejestracja testu
  • Wiele typów asercji (Boost nie ma nic na xUnit ++)
  • Porównuje kolekcje natywnie.
  • Asercje występują na trzech poziomach:
    • błędy krytyczne
    • błędy niekrytyczne
    • ostrzeżenia
  • Łatwe logowanie asercji :Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Rejestrowanie testowe :Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • Lampy
  • Testy oparte na danych (teorie)
  • Wybierz testy do uruchomienia na podstawie:
    • Dopasowywanie atrybutów
    • Dopasuj podciąg nazwy
    • Zestawy testowe
moswald
źródło
2
Pytanie wymaga porównania. IMO, bardzo ważne jest, aby przedstawić różnice między twoim frameworkiem a przynajmniej dwoma popularnymi: googletest i Boost. Zwłaszcza jeśli reklamujesz xUnit ++ jako alternatywę dla tych dwóch. Będzie +1, jeśli zostanie zaktualizowany :)
mloskot
Słusznie. :) Mam już tabelę porównawczą na wiki , ale spróbuję podsumować kilka różnic bezpośrednio w mojej odpowiedzi.
moswald
1
Postanowiłem po prostu bezpośrednio połączyć tabelę wiki, to było zaśmiecone podsumowaniem, aby wyświetlić to wszystko.
moswald
link działa dla mnie, dzięki! +1
mloskot
1
czy twój projekt został przerwany? Ostatnie zatwierdzenie pochodzi z 09/2015 ... W każdym razie świetna odpowiedź. Dzięki.
zertyz
5

CppUTest - bardzo ładny, lekki framework z fałszywymi bibliotekami. Warto przyjrzeć się bliżej.

ratkok
źródło
4

CPUnit ( http://cpunit.sourceforge.net ) jest strukturą podobną do Google Test, ale która opiera się na mniejszej liczbie makr (aserts są funkcjami) i gdzie makra są prefiksowane, aby uniknąć zwykłej pułapki makr. Testy wyglądają następująco:

#include <cpunit>

namespace MyAssetTest {
    using namespace cpunit;

    CPUNIT_FUNC(MyAssetTest, test_stuff) {
        int some_value = 42;
        assert_equals("Wrong value!", 666, some_value);
    }

    // Fixtures go as follows:
    CPUNIT_SET_UP(MyAssetTest) {
        // Setting up suite here...
        // And the same goes for tear-down.
    }

}

Rejestrują się automatycznie, więc nie potrzebujesz więcej. Następnie jest po prostu skompilować i uruchomić. Uważam, że używanie tego frameworka przypomina JUnit dla tych, którzy musieli poświęcić trochę czasu na programowanie w Javie. Bardzo dobrze!

zrozumiałem
źródło
2

API Sanity Checker - środowisko testowe dla bibliotek C / C ++:

Automatyczny generator podstawowych testów jednostkowych dla wspólnej biblioteki C / C ++. Jest w stanie generować uzasadnione (w większości, ale niestety nie wszystkie) dane wejściowe dla parametrów i komponować proste przypadki testowe („rozsądne” lub „płytkie”) dla każdej funkcji w interfejsie API poprzez analizę deklaracji w nagłówku pliki.

Jakość generowanych testów pozwala sprawdzić brak błędów krytycznych w prostych przypadkach użycia. Narzędzie jest w stanie zbudować i wykonać wygenerowane testy oraz wykryć awarie (segfault), przerwania, wszelkiego rodzaju emitowane sygnały, niezerowy kod powrotu programu i zawieszenie programu.

Unikalne funkcje w porównaniu z CppUnit, Boost i Google Test:

  • Automatyczne generowanie danych testowych i argumentów wejściowych (nawet dla złożonych typów danych)
  • Nowoczesne i wysoce wyspecjalizowane typy wielokrotnego użytku zamiast urządzeń i szablonów
linuxbuild
źródło