如何测试不在公共界面中的功能?

时间:2009-09-21 14:58:17

标签: c++ unit-testing

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

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

我将一个指针传递给 ProtocolDatastream 的构造函数,它解释从串行数据流中读取的字节数(尽管它只知道它实现了我的 Datastream interface),并将它们作为协议数据单元返回。

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

               +-----> Log
               |
Serial ----> Tee ----> Protocol

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

(顺便说一下,这很好用)

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

3 个答案:

答案 0 :(得分:2)

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

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

稍后,当您确定Tee正常工作(并进行必要的测试以确保它保持这种方式)时,您可以使用它并且不知道它是如何工作的。

答案 1 :(得分:1)

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

class BlahTestable : public Blah
{
public: 
    using Blah::protectedfunction1;
    using Blah::protectedfunction2;
    etc....
};

然后在单元测试中做

// for public members
TEST_F(BlahTest, publicfunction) {
    Blah s;
    s.publicfunction();
}

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

答案 2 :(得分:0)

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