我正在学习编写单元测试,并且已经开始使用我想要测试的简单的“计算器”-class。我知道了如何使用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));
}发布于 2018-09-19 21:24:52
我不同意@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));
}
}有关详细讨论,请参阅here。
如果没有抛出异常,如何检测calculate.div的异常使用
发布于 2018-09-20 16:17:28
有没有可能测试一下?我的意思是,我应该写什么作为测试结果?有没有类似于“错误”的东西?或者我必须使用异常?
这是一个核心问题,你需要问(和回答)自己无效的-如果给出了一个无效的输入,你的计算器(在这个例子中是Calc::div()函数)应该如何表现。它有几种行为方式:
一旦你决定了你的行为应该是什么,你可以对它进行测试。
对于选项1, gtest提供death tests。
对于选项2,您可以简单地验证您是否获得了预期的结果。
对于选项3,您可以通过exception assertions或在try块末尾带有FAIL()的自制try { } catch { }来捕获和计算异常(因此,您可以注意到如果函数在您期望的时候抛出异常失败)
发布于 2018-09-19 21:15:33
您的评论
我想我可以测试一下
暗示对测试的误解。
您的测试只测试类的行为是否如您所希望的那样。:测试根本不是错误处理机制!
如果您的某个函数使用某些参数创建应用程序崩溃,则您的测试不应将其标记为正确。
有关如何解决它(异常和合适的宏),请参阅john的评论。
https://stackoverflow.com/questions/52406110
复制相似问题