Библиотеки тестирования модулей С++
Я столкнулся с 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 над вашим кодом как часть набора тестов.
Ответ 6
Здесь приведен список библиотек модулей тестирования.
http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B
Однако, насколько мне известно, cppunit является самым популярным.
Ответ 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);
}
Надеюсь, что это поможет.