Я учусь писать модульные тесты и начал с простого класса «Калькулятор», который я хотел протестировать.
Я выяснил, как использовать функции 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));
}
Я не согласен с @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
?
Есть ли возможность проверить это? Я имею в виду, что я должен написать в качестве результата теста? Есть ли что-то вроде «ОШИБКА»? Или я должен использовать исключения?
Это основной вопрос, который нужно задать (и ответить) сам — как должен ваш калькулятор (в этом случае функция Calc::div()
) вести себя, если недействительным вход дан. Есть несколько способов, которыми он может себя вести:
После того как вы определились с тем, каким должно быть ваше поведение Можно Попробуй это.
За Опция 1 Gtest обеспечивает тесты на смерть.
За Вариант 2 Вы можете просто подтвердить, что получили ожидаемый результат.
За Вариант 3 Вы можете поймать и оценить исключение, либо через утверждения об исключениях или домашнее try { } catch { }
с FAIL()
в конце try
блок (так что вы заметите, если функция не выдает исключение, когда вы ожидаете это)
Ваш комментарий
Я думал, что смогу проверить это
предложить недоразумение о тестах.
Ваши тесты только проверяют, соответствует ли поведение ваших классов тому, что вы хотите. Тесты никоим образом не являются механизмами обработки ошибок!
Если одна из ваших функций создает сбой приложения с определенными параметрами, это не то, что ваши тесты должны пометить как правильные.
Как решить эту проблему (исключение и подходящий макрос) см. В комментарии Джона.