首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c++中统一一种方法的副作用?

如何在c++中统一一种方法的副作用?
EN

Stack Overflow用户
提问于 2020-02-09 16:37:37
回答 1查看 222关注 0票数 1

在实际的C++项目中,除了返回值和更改输出参数之外,大多数方法都有副作用。

代码语言:javascript
复制
// For examle
bool A::doA()
{
    bool isSuccess = true;
    isSuccess &= b.doB();
    isSuccess &= c.doC();
    this->a++;
    return isSuccess;
}

上述方法的副作用包括调用2个方法和更改成员变量a。

但是,在为上述方法编写单元测试时,我看到大多数人只检查返回值,而忽略了副作用,这确实达到了100%的代码覆盖率。

但我认为这样的统一是愚蠢的,有两个原因:

  1. 方法doA的主要功能是副作用,而不是返回值。如果doA有空返回值(在实际代码中很常见),则甚至不能用这种方式编写最统一的返回值。

通过Google,我找到了一些测试副作用的方法:

1.模拟b和c,并检查是否调用了doB和doC。

2.通过一定的技术对成员变量a的值进行检验。

不过,我认为这种单一的做法并不好,原因有二:

1.将有如此多的嘲弄和计算时间的费用。另外,只检查方法是否被调用似乎很愚蠢。

2.它依赖于方法的实现而不是接口的实现,如果实现发生变化,单元需要改变。我听到有人说单元测试应该是黑匣子测试。

那么,在实际工程中,您是如何解决这些问题的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-09 17:47:43

一般而言:

测试总是验证某种可公开观察的行为。这种行为是返回值还是副作用并不重要。测试中的cour代码的API和/或文档必须清楚地说明副作用到底是什么。如果副作用没有表现出任何可公开观察的行为,它们纯粹是内部实现细节,与测试无关;它们也不应该是公共API或其文档的一部分。

作为一条经验法则,不要测试您只知道的内容,因为您查看了正在测试的代码的实现。

关于你的例子:

如果doB()doC()引起相关的副作用,这是doA()可观察行为的一部分。检查自己的效果。无论是doA()直接引起的,还是doA()内部调用的另一个函数,都是一个实现细节,因此与您的测试无关。

也许“执行A”的一个效果是将特定的A对象添加到注册表中。然后,正确的做法是检查对象是否已注册。

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

https://stackoverflow.com/questions/60138857

复制
相关文章

相似问题

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