关于c ++:如何测试不在公共接口中的功能?

How do I test features that are not in the public interface?

我正在为自己设计一个库,允许链接数据流。让我描绘一下场景:

我创建了一个SerialDatastream,它是底层,可以读取和写入COM端口。

我将指向此的指针传递给ProtocolDatastream的构造函数,该函数解释从串行数据流读取时的字节数(虽然它只知道它满足我的Datastream接口),并将它们作为协议数据单元返回。

现在让我们说我想从串口获取信息,并将其记录为字节。我在中间插入一个TeeDatastream,它从一个源读取,但输出到两个目的地:

1
2
3
               +-----> Log
               |
Serial ----> Tee ----> Protocol

TeeDatastream以下列方式实现:当从一个分支执行读取操作时,它将数据缓冲到成员变量中。然后,当在另一个分支上执行读操作时,它读取已经缓冲的数据。

(顺便说一句,这个工作正常)

这意味着,在每次操作之后,类必须检查是否存在从两个分支读取的数据。然后可以丢弃该数据,因此缓冲区会缩小并且不断增长。但是,对于班级的任何客户来说,这是完全不可见的。所以我的问题是:应该使用什么模式来测试实现中隐形但必要的部分?


你需要的是Tee本身的单元测试; 独立于其后在其他单元测试中作为管道的一部分使用。

对于这些新的单元测试,"隐形部分"实际上是他们必须涵盖的内容。 这不再是隐藏的功能,而是Tee的API的一部分。

稍后,当您确定Tee正常工作(并进行必要的测试以确保它保持这种方式)时,您可以使用它并忽略它的工作原理。


在单元测试中,cpp文件在本地声明一个友元类,并声明要测试的每个受保护成员函数。

1
2
3
4
5
6
7
class BlahTestable : public Blah
{
public:
    using Blah::protectedfunction1;
    using Blah::protectedfunction2;
    etc....
};

然后在单元测试中做

1
2
3
4
5
6
7
8
9
10
11
// for public members
TEST_F(BlahTest, publicfunction) {
    Blah s;
    s.publicfunction();
}

// for protected members
TEST_F(BlahTest, protectedfunction1) {
    BlahTestable s;
    s.protectedfunction1();
}


除非我遗漏了某些东西,否则您似乎正在寻找简单的单元测试。 此类测试允许您测试代码的公共部分和私有部分。