модульное тестирование — c ++ гугл тест деление на ноль

Я учусь писать модульные тесты и начал с простого класса «Калькулятор», который я хотел протестировать.
Я выяснил, как использовать функции EXPECT / ASSERT, какие тестовые примеры и т. Д., Но у меня возникла проблема, когда я хотел проверить деление на ноль. Есть ли возможность проверить это? Я имею в виду, что я должен написать в качестве результата теста? Есть ли что-то вроде «ОШИБКА»? Или я должен использовать исключения?

Это мои тесты:

TEST(TestCalc, TestPos)
{
Calc calculate;
EXPECT_EQ(10.0, calculate.add(5.0, 5.0));
EXPECT_EQ(9, calculate.mul(3, 3));
EXPECT_EQ(9, calculate.div(27, 3));
EXPECT_EQ(9, calculate.sub(12, 3));
}
TEST(TestCalc, TestNeg)
{
Calc calculate;
EXPECT_EQ(-1.0, calculate.add(5.0, -6.0));
EXPECT_EQ(-9, calculate.mul(3, -3));
EXPECT_EQ(-9, calculate.div(27, -3));
EXPECT_EQ(15, calculate.sub(12, -3));
}

TEST(TestCalc, TestZero)
{
Calc calculate;
EXPECT_EQ(10.0, calculate.add(5.0, 0));
EXPECT_EQ(9, calculate.mul(3, 0));
EXPECT_EQ(, calculate.div(27,0));
EXPECT_EQ(12, calculate.sub(12,0));
}

4

Решение

Я не согласен с @Ketzu. У вас есть ожидания, как должен вести себя калькулятор при делении на ноль.

EXPECT_EQ(, calculate.div(27,0));

Это ожидание, возможно, не очень хорошо сформулировано в этом тесте.

Если calculate.div(27,0) выдает исключение, чем вы можете перехватить это исключение, и ваш тест не пройден, если он не был сгенерирован. Вы можете написать что-то вроде этого

TEST(ExceptionTest, ExpectThrowsSpecificException) {
try {
calculate.div(27,0);
FAIL() << "calculate.div(27,0) should throw an error, since a     division by zero is not valid\n";
} catch (TestException& exception) {
EXPECT_THAT(std::string(exception.what()), Eq("VALID_SETTING"));
EXPECT_THAT(exception.errorCode, Eq(20));
}
}

Увидеть Вот для подробного обсуждения.

Если исключение не выдается, как вы обнаруживаете ненормальное использование calculate.div?

2

Другие решения

Есть ли возможность проверить это? Я имею в виду, что я должен написать в качестве результата теста? Есть ли что-то вроде «ОШИБКА»? Или я должен использовать исключения?

Это основной вопрос, который нужно задать (и ответить) сам — как должен ваш калькулятор (в этом случае функция Calc::div()) вести себя, если недействительным вход дан. Есть несколько способов, которыми он может себя вести:

  1. авария. Это (обычно) поведение, которое вы получаете, если делите на ноль в C ++ (технически это поведение не определено, поэтому компилятор может ЧТО-НИБУДЬ. К счастью (для нас) большинство компиляторов согласны с тем, что завершение всего процесса является «правильным» ЧТО-НИБУДЬ делать здесь)
  2. Вернуть некоторое значение. Вы можете вернуть (в случае деления на ноль) бесконечность. Или возможно NaN. Или любое другое значение, которое имеет смысл в вашем контексте. Однако этот подход смешивает результат с обработка ошибок, что не рекомендуется в настоящее время (так как это заставит вас проверять каждый вызов функции на «результаты ошибок» — и если вы забудете одну проверку, вы получите неприятные ошибки при продолжении операций с недействительными / поддельными значениями.)
  3. Бросить исключение. Вы можете выдать исключение, сигнализирующее, что что-то пошло не так. В настоящее время это обычно используемый метод (за исключением очень чувствительных к производительности вещей, где каждая микросекунда имеет значение), поскольку он аккуратно отделяет нормальный путь (возвращаемое значение результата) от пути ошибки (исключение) (и если вы забудете обработать исключение, вы заметит однажды вместо использования неверного значения, как в варианте 2)

После того как вы определились с тем, каким должно быть ваше поведение Можно Попробуй это.

За Опция 1 Gtest обеспечивает тесты на смерть.
За Вариант 2 Вы можете просто подтвердить, что получили ожидаемый результат.
За Вариант 3 Вы можете поймать и оценить исключение, либо через утверждения об исключениях или домашнее try { } catch { } с FAIL() в конце try блок (так что вы заметите, если функция не выдает исключение, когда вы ожидаете это)

1

Ваш комментарий

Я думал, что смогу проверить это

предложить недоразумение о тестах.

Ваши тесты только проверяют, соответствует ли поведение ваших классов тому, что вы хотите. Тесты никоим образом не являются механизмами обработки ошибок!

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

Как решить эту проблему (исключение и подходящий макрос) см. В комментарии Джона.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector