Подтвердить что ты не робот

Что такое хороший способ unit test templated С++ методов/классов/функций?

Я ищу хороший способ unit test моих шаблонных методов, классов и функций в С++. У меня такое чувство, что недостаточно просто тестировать с использованием одного типа, и не нужно просто дублировать модульные тесты и заменять типы.

Чтобы быть более конкретным, я работаю над классом Matrix и использую платформу модульного тестирования Boost. Матрица предназначена для работы с различными типами. Он будет использоваться главным образом для базовых типов, но я хотел бы, чтобы он также поддерживал конкретные типы.

Обратите внимание: я делаю это для учебных целей, поэтому я не использую существующую реализацию матрицы.

4b9b3361

Ответ 1

У теста Boost есть макрос BOOST_AUTO_TEST_CASE_TEMPLATE, который запускает тест по шаблону для каждого типа в списке boost:: mpl::.

template<typename T>
T Add(T lh, T rh)
{
   return lh + rh;
}

typedef boost::mpl::list<int, float> test_types;

BOOST_AUTO_TEST_CASE_TEMPLATE(Add_1Plus2_Is3, T, test_types)
{
    T result = Add(T(1), T(2));
    BOOST_CHECK_EQUAL(T(3), result);
}

http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/utf/user-guide/test-organization/auto-test-case-template.html

Ответ 2

Я согласен с josuegomes и VJovic. Я думаю, одним из способов свести к минимуму дублирование кода является создание шаблонной функции с вашей логикой unit test, а затем вызвать ее с помощью разных аргументов типа. Таким образом, вы можете разместить всю логику тестирования модулей Matrix на одном месте, одновременно называя шаблонную функцию unit test один раз для каждого желаемого типа.

Однако это может быть слишком сложно. Я думаю, это зависит от количества логики в ваших тестах.

Ответ 3

Вся единица модульного тестирования должна охватывать каждую ветвь вашего кода. Если тестирование с различными типами охватывает разные ветки, тогда имеет смысл добавлять специфические модульные тесты типа, иначе это просто copy-n-paste.

Ответ 4

Если вы тестируете блок шаблона, вам нужно unit test класс шаблона со всеми возможными типами, или пока вы не подумаете, что этого достаточно. Способов нет.

Ваш класс может работать с int, но сбой для float.

Если шаблон не предназначен для использования с определенными типами, то вы должны добавить в свой код static_assert.