首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++谷歌测试除以零

c++谷歌测试除以零
EN

Stack Overflow用户
提问于 2018-09-19 20:40:52
回答 3查看 1K关注 0票数 4

我正在学习编写单元测试,并且已经开始使用我想要测试的简单的“计算器”-class。我知道了如何使用EXPECT/ASSERT函数,以及测试用例等,但是当我想测试除法时,我遇到了一个问题。有没有可能测试一下?我的意思是,我应该写什么作为测试结果?有没有类似于“错误”的东西?或者我必须使用异常?

到目前为止,以下是我的测试:

代码语言:javascript
复制
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));
}
EN

回答 3

Stack Overflow用户

发布于 2018-09-19 21:24:52

我不同意@Ketzu。你有一个期望,当除以零时,计算器应该如何工作。

代码语言:javascript
复制
EXPECT_EQ(, calculate.div(27,0));

这个期望在这个测试中可能没有很好地表达出来。

如果calculate.div(27,0)抛出异常,那么您可以捕获此异常,并且测试将失败(如果未抛出)。你可以写这样的代码

代码语言:javascript
复制
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的异常使用

票数 2
EN

Stack Overflow用户

发布于 2018-09-20 16:17:28

有没有可能测试一下?我的意思是,我应该写什么作为测试结果?有没有类似于“错误”的东西?或者我必须使用异常?

这是一个核心问题,你需要问(和回答)自己无效的-如果给出了一个无效的输入,你的计算器(在这个例子中是Calc::div()函数)应该如何表现。它有几种行为方式:

  1. Crash.这(通常)是你在C++中除以零时得到的行为(从技术上讲,这种行为是未定义的,所以编译器可以做任何事情。幸运的是(对我们来说)大多数编译器都同意终止整个过程是“正确”的,只要here)
  2. Return一些值。您可以返回(在被零除的情况下) infinity。或者可能是NaN。或任何其他在您的上下文中有意义的值。然而,这种方法将resulterror handling混合在一起,这在当今是不受鼓励的(因为它会迫使您检查函数的每一个调用,以获取“错误结果”-如果您忘记了一次检查,当您继续使用invalid/ values.)
  3. Throw an exception进行操作时,您会得到严重的错误。你可以抛出一个异常,表示出了问题。这是现在通常使用的方法(除了极端性能敏感的东西,其中每一微秒都很重要),因为它巧妙地将正常路径(返回结果值)与错误路径(异常)分开(如果您忘记处理异常,您会立即注意到,而不是像选项2那样使用坏值)

一旦你决定了你的行为应该是什么,你可以对它进行测试。

对于选项1, gtest提供death tests

对于选项2,您可以简单地验证您是否获得了预期的结果。

对于选项3,您可以通过exception assertions或在try块末尾带有FAIL()的自制try { } catch { }来捕获和计算异常(因此,您可以注意到如果函数在您期望的时候抛出异常失败)

票数 1
EN

Stack Overflow用户

发布于 2018-09-19 21:15:33

您的评论

我想我可以测试一下

暗示对测试的误解。

您的测试只测试类的行为是否如您所希望的那样。:测试根本不是错误处理机制!

如果您的某个函数使用某些参数创建应用程序崩溃,则您的测试不应将其标记为正确。

有关如何解决它(异常和合适的宏),请参阅john的评论。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52406110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档