gpt4 book ai didi

c++ - 如何在 C++ 中对方法的副作用进行单元测试?

转载 作者:行者123 更新时间:2023-12-02 10:21:02 25 4
gpt4 key购买 nike

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

// For examle
bool A::doA()
{
bool isSuccess = true;
isSuccess &= b.doB();
isSuccess &= c.doC();
this->a++;
return isSuccess;
}

上述方法的副作用包括调用2个方法和改变成员变量a。
但是,在为上述方法编写 unittest 时,我看到大多数人只是检查返回值而忽略了副作用,这确实达到了 100% 的代码覆盖率。
但我认为这样的单元测试很愚蠢,原因有两个:
1.方法doA的主要作用是副作用,而不是返回值。
2.如果doA有void返回值(这在实际代码中很常见),你甚至不能这样写单元测试。

通过谷歌,我找到了一些测试副作用的方法:
1.mock b 和 c,并检查是否调用了 doB 和 doC。
2.通过一些技术检查成员变量a的值。
但我认为这样的单元测试不好有两个原因:
1.会有这么多的 mock 和时间成本。此外,仅检查是否调用了方法似乎很愚蠢。
2.它取决于方法的实现而不是接口(interface),如果实现改变,单元测试需要改变。我听到有人说 unittest 应该是黑盒测试。

那么在实际项目中如何处理这样的问题呢?

最佳答案

一般来说:

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

根据经验,不要测试你只知道的东西,因为你查看了被测代码的实现。

关于你的例子:

如果 doB()doC()引起相关的副作用,这些是 doA() 的一部分的可观察行为。检查效果本身。它们是否由 doA() 直接引起或通过 doA() 内部调用的另一个函数是一个实现细节,因此与您的测试无关。

也许“做A”的效果是添加特定的A反对注册表。然后正确的做法是检查对象是否已注册。

关于c++ - 如何在 C++ 中对方法的副作用进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60138857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com