Тест одного и того же кода (factorial) во всех популярных C++ фреймворках

Автор: | 20 июня, 2025

Поддержанные фреймворки:

  • Google Test (test_gtest.cpp)
  • Catch2 (test_catch2.cpp)
  • Doctest (test_doctest.cpp)
  • Boost.Test (test_boost.cpp)
  • QTest (для Qt, test_qtest.cpp)

Каждый файл содержит:

  • Проверку положительных значений (0, 5, 10)
  • Обработку отрицательного ввода (-5)
// Один и тот же функционал: факториал
int factorial(int n) {
    if (n < 0) return -1; // ошибка
    return (n <= 1) ? 1 : n * factorial(n - 1);
}

Google Test

// ---------------- Google Test ----------------
// File: test_gtest.cpp
#include <gtest/gtest.h>

TEST(FactorialTest, PositiveNumbers) {
    EXPECT_EQ(factorial(0), 1);
    EXPECT_EQ(factorial(5), 120);
    EXPECT_EQ(factorial(10), 3628800);
}

TEST(FactorialTest, NegativeNumber) {
    EXPECT_EQ(factorial(-5), -1);
}

Catch2

// ---------------- Catch2 ----------------
// File: test_catch2.cpp
#define CATCH_CONFIG_MAIN
#include "catch.hpp"

TEST_CASE("Factorial calculation") {
    REQUIRE(factorial(0) == 1);
    REQUIRE(factorial(5) == 120);
    REQUIRE(factorial(10) == 3628800);
}

TEST_CASE("Factorial with negative input") {
    REQUIRE(factorial(-5) == -1);
}

Doctest

// ---------------- Doctest ----------------
// File: test_doctest.cpp
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include "doctest.h"

TEST_CASE("Factorial correctness") {
    CHECK(factorial(0) == 1);
    CHECK(factorial(5) == 120);
    CHECK(factorial(10) == 3628800);
    CHECK(factorial(-5) == -1);
}

Boost.Test

// ---------------- Boost.Test ----------------
// File: test_boost.cpp
#define BOOST_TEST_MODULE FactorialTest
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_CASE(FactorialPositive) {
    BOOST_CHECK_EQUAL(factorial(0), 1);
    BOOST_CHECK_EQUAL(factorial(5), 120);
    BOOST_CHECK_EQUAL(factorial(10), 3628800);
}

BOOST_AUTO_TEST_CASE(FactorialNegative) {
    BOOST_CHECK_EQUAL(factorial(-5), -1);
}

QTest

// ---------------- QTest ----------------
// File: test_qtest.cpp
#include <QtTest>

class TestFactorial : public QObject {
    Q_OBJECT
private slots:
    void testPositive() {
        QCOMPARE(factorial(0), 1);
        QCOMPARE(factorial(5), 120);
        QCOMPARE(factorial(10), 3628800);
    }
    void testNegative() {
        QCOMPARE(factorial(-5), -1);
    }
};

QTEST_MAIN(TestFactorial)