Библиотеки тестирования модулей С++

Я столкнулся с cppunit, но он не выглядел супер-простым в использовании (возможно, я не выглядел тяжело, возможно потому, что С++ не работает, как Java/С#). Широко используются ли простые альтернативы?

На самом деле, cppunit стандартная модульная среда тестирования для С++?

Ответы

Ответ 1

Нет стандартной библиотеки тестирования модулей для С++. Есть много вариантов выбора; cppunit является одним из них.

В моей компании мы используем Google Test вместе со своим партнером Google Mock для модульного тестирования и издевательства объектов. Я считаю, что они оба более удобны в использовании и намного мощнее, чем cppunit.

Ответ 2

Я только что нажал свою собственную фреймворк, CATCH. Он все еще находится в разработке, но я считаю, что он уже превосходит большинство других структур. У разных людей разные критерии, но я пытался охватить большинство из них без слишком большого количества компромиссов. Взгляните на мою связанную запись в блоге для дегустатора. Мои пять лучших функций:

  • Только заголовок
  • Автоматическая регистрация тестов на основе функций и методов
  • Разлагает стандартные выражения С++ в LHS и RHS (так что вам не нужно целое семейство макросов assert).
  • Поддержка вложенных разделов в функциональном устройстве
  • Именованные тесты с использованием естественного языка - генерируются имена функций/методов

Он также имеет привязки Objective-C.

В качестве примера, здесь, как вы напишете эквивалент примера gtest, который цитируется @dmeister:

TEST_CASE( "Factorial/Handles zero input", "Tests factorial of 0.") 
{
  REQUIRE( Factorial(0) == 1 );
}

TEST_CASE( "Factorial/Handles positive input", "Tests factorial of positive numbers.") 
{
  REQUIRE( Factorial(1) == 1 );
  REQUIRE( Factorial(2) == 2 );
  REQUIRE( Factorial(3) == 6 );
  REQUIRE( Factorial(8) == 40320 );
}

Если тест не удался, вы все равно получите значения LHS и RHS независимо.

Ответ 3

gtest, Google Test Framework является альтернативой.

Вот простой пример из документации:

// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
  EXPECT_EQ(1, Factorial(0));
}

// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
  EXPECT_EQ(1, Factorial(1));
  EXPECT_EQ(2, Factorial(2));
  EXPECT_EQ(6, Factorial(3));
  EXPECT_EQ(40320, Factorial(8));
}

Он также отлично играет с gmock, фреймворк Google для С++

Ответ 4

CppUnit, вероятно, является первой структурой unit test для С++. Это прямой порт Junit, знаменитая платформа Java. Это облегчает переход от Junit, но ценой немного тяжелой структуры, которая не использует возможности С++, такие как RAII. Именно поэтому были созданы легкие версии, такие как CppUnitLite, NanoCppUnit. Предполагается, что CppUnit2 улучшит это, среди других улучшений.

Tut был очень легким, всего одним заголовком, но в последних версиях появилась библиотека.

Что касается "стандартной" структуры, ее нет, а С++ 1X ее не определяет.

Ответ 5

Я создал набор для тестирования, называемый saru (http://github.com/squishyhumans/saru) для моего собственного кода dev. Его лицензионный код BSD. Я разработал его, поскольку мне не нравились некоторые функции других наборов тестов. Его широко не использовали, но я использовал его в нескольких коммерческих проектах, распространяемых на две компании.

  • Мне не нравятся все мои тесты, скомпилированные в один бинарный файл. Мое объяснение заключается в том, что если компиляция завершилась неудачей, все тесты потерпят неудачу, если в одном из тестов поведение undefined выводится программой undefined.
  • Я хочу контролировать, какие тесты выполняются. Я хочу иметь возможность группировать тесты и запускать подмножества.
  • Я хочу, чтобы сбой компиляции теста отображался как сбой теста и не останавливал все мои тесты.
  • Я хочу иметь возможность запускать тесты с нескольких разных языков.
  • Я хочу, чтобы система была достаточно гибкой, чтобы я мог запускать определенные тесты под valgrind (еще не в saru:()

Таким образом, saru адресует большинство этих функций. Его основное внимание уделяется возможности запуска набора тестов, написанных на разных языках. С минимальными размерами теста. Здесь самый маленький (неудачный) тест С++

//SARU : dummy dummy
int main() { return (1==2)?0:1; }

Все saru действительно заботится о возвращаемом значении двоичного файла, который он компилирует. Затем он анализирует выходные данные, чтобы определить, какие тесты не удалось и так далее. У этого есть заголовки, чтобы сделать работу с С++ немного приятнее, чем приведенный выше тривиальный пример:

//SARU : dummy dummy
#include "MyStruct.h"
#include "saru_cxx.h"

class Fixture
{
  MyStruct s_;
  Fixture() : s_() {}
  void test_A_is_B()
  {
     SARU_ASSERT_EQUAL( s_.A(), s_.B() );
  }

  void test_C_is_7()
  {
     SARU_ASSERT_EQUAL( 7, s_.C() );
  }
};

int main()
{
   saru::TestLogger logger;
   SARU_TEST( Fixture:: test_A_is_B, logger );
   SARU_TEST( Fixture:: test_C_is_7, logger );
   logger.printSummary();
   return logger.allOK()?0:1;
}

Или, если вам не нравится, как работают его заголовки С++, он должен с минимальными трудностями интегрироваться с другими библиотеками unittesting.

Но он также будет запускать тесты, написанные на PHP и python. Таким образом, вы можете настроить полные функциональные тесты с помощью saru. Или вы можете запускать что-то вроде lint над вашим кодом как часть набора тестов.

Ответ 7

Здесь минимальная библиотека тестирования модулей С++: https://github.com/vahidk/minimal-cpp-test

Он имеет очень похожий синтаксис для тестовой библиотеки Google, но это библиотека только для заголовков и, следовательно, упрощает перенос между платформами.

Здесь минимальный unit test:

#define DEFINE_TEST_MAIN    
#include "test.h"
TEST(GroupName, TestName) {
  EXPECT_EQ(1 + 2, 3);
}

И минимальное приспособление:

class ClassName : public cyrus:Test {
public:
  void Setup() override { 
    x = 5;
  }
  int x;
}

Test_F(ClassName, Test1) {
  EXPECT_EQ(x, 5);
}

Надеюсь, что это поможет.