Содержит комбинаторный взрыв контрольных примеров с использованием Catch
Допустим, у меня есть простой класс, который принимает 6 логических аргументов в своем конструкторе и выполняет некоторые вычисления на основе состояния этих аргументов.
Если я хочу использовать Catch для адекватного тестирования всех случаев, мне потребуется 64 отдельных модульных теста.
Теперь, скажем, в какой-то момент в будущем я добавлю 7-й логический аргумент. Теперь количество тестовых случаев, которые я должен написать, удвоилось до 128.
Есть ли способ, которым я могу создать свой модульный тест таким образом, чтобы автоматически "генерировать" все 2^n тестовых случаев из одной спецификации теста?
1 ответ
Вы можете использовать часть Catch для генераторов, чтобы автоматически проходить через все различные комбинации bools, которые использует ваша функция:
TEST_CASE("where is my sandwich", "[hunger][food]")
{
bool wantLettuce = GENERATE(Values(false, true));
bool wantTomato = GENERATE(Values(false, true));
bool wantBacon = GENERATE(Values(false, true));
bool wantCheese = GENERATE(Values(false, true));
bool wantEgg = GENERATE(Values(false, true));
CHECK(sandwichAssembler(wantLettuce, wantTomato, wantBacon, wantCheese, wantEgg));
}
IIRC это заставит Catch запускаться 2^5 раз, пробуя все комбинации.
... но я предполагаю, что все, что вы хотите сделать, это тренировать все комбинации. Если вы действительно хотите проверить, соответствует ли результат ожидания в каждом конкретном случае, вам нужно сделать больше.
(Я не проверял это - вспоминаю по памяти, пока ждал мой бутерброд в кафе в Барселоне)