Как тестировать метод много раз с разными параметрами каждый раз - PullRequest
3 голосов
/ 11 июня 2019

Я учусь использовать Boost Test.

Я хочу проверить метод JulianToGreenWich(float jd):

#include <ctime>

class Convert
{
private:

public:
    Convert();
    ~Convert();

    tm JulianToGreenWich(float jd);
};

Чтобы протестировать его с помощью Boost Test, я записал этот код:

struct TestFixture
{
    Convert convert_instance;

    TestFixture()
        : convert_instance()
    {}

    ~TestFixture() = default;
};

BOOST_FIXTURE_TEST_SUITE(TestConvert, TestFixture)

BOOST_AUTO_TEST_CASE(julianToGreenWichCase)
{
  BOOST_TEST(1 == 1);
  BOOST_TEST(true);
}

Моя проблема в том, что я хочу протестировать его со многими (более чем одним) значениями. Для этого я читал о BOOST_DATA_TEST_CASE_F , но, похоже, ему нужен набор данных (и я не знаю, как его создать и использовать). Итак, я начал читать это в документации по бусту: Наборы данных . Но его пример Пример пользовательского набора данных очень сложен.

Если я хочу проверить, является ли передача значения (с плавающей запятой) методу JulianToGreenWich, я получу конкретную tm структуру.

Как я могу проверить свой метод со многими значениями пар (float jd, tm)?

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Официальная документация Boost.Test находится на www.boost.org: здесь .

Что-то вроде следующего:

  • создает 2 набора данных
    • первый набор данных - в качестве примера - будет содержать входные значения для преобразователя
    • второй набор данных будет содержать ожидаемые значения
  • , эти два набора данныхзатем объединенные в один уникальный с операцией zip над наборами данных, как объяснено здесь
  • каждый элемент после этого равен 2, они расширяются в этом порядке в две переменные, заданные дляBOOST_DATA_TEST_CASE, соответственно input_value и expected_value
BOOST_DATA_TEST_CASE( test_convert, 
  data::make({0.1f,0.2f,0.3f})^data::make({tm1,tm2,tm3}), // creates a zip of 2 datasets
  input_value, // first variable of the zip
  expected_value) // second variable of the zip
{
  Convert convertInstance;
  // this might fail to compile because tm type should not printable.
  // Adding BOOST_TEST_DONT_PRINT_LOG_VALUE on the tm type before the test
  // should solve the issue.
  BOOST_TEST(convertInstance(input_value) == expected_value); 
}

Вы можете заменить BOOST_DATA_TEST_CASE на BOOST_DATA_TEST_CASE_F и использовать свой прибор с унаследованными convert_instance.

Подробнее о регистрации определенных типов можно найти здесь .

0 голосов
/ 11 июня 2019

IMO, boost::test чрезмерно спроектирован и плохо документирован, но он все еще пригоден для использования с его основными функциями ядра, так что нет необходимости устанавливать другую библиотеку только для модульного тестирования, когда доступно повышение.

Один простой способ - определить таблицу с входными данными и ожидаемыми выходными данными, а затем использовать эту таблицу в модульном тесте:

#include <ctime>

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE Convert
#include "boost/test/unit_test.hpp"

namespace {

struct Convert {
    tm JulianToGreenWich(float jd);
};

tm make_tm(int year, int month, int day) {
    tm t = {};
    t.tm_year = year - 1900;
    t.tm_mon = month - 1;
    t.tm_mday = day;
    return t;
}

struct Test {
    float input;
    tm expected_output;
};

Test tests[] = {
    {         0.f, make_tm(1970, 1,  1)},
    {1560244906.f, make_tm(2019, 6, 11)},
};

BOOST_AUTO_TEST_CASE(my_test) {
    Convert c;
    for(auto& test : tests) {
        tm output = c.JulianToGreenWich(test.input);
        BOOST_CHECK_EQUAL(mktime(&output), mktime(&test.expected_output));
    }
}

} // namespace
...