代码之家  ›  专栏  ›  技术社区  ›  Kaz Dragon

如何测试不在公共接口中的特性?

  •  0
  • Kaz Dragon  · 技术社区  · 15 年前

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

    我创建了一个 串行数据流 它是底层,读写COM端口。

    我将指向此的指针传递给 原冷数据流 在从串行数据流中读取时解释字节(尽管它只知道它满足了 数据流 接口),并将它们作为协议数据单元返回。

    现在,假设我想从串行端口获取信息,并逐字节记录它。我插入一个 泰达斯塔姆 在中间,从一个源读取,但输出到两个目的地:

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

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

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

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

    3 回复  |  直到 15 年前
        1
  •  2
  •   Aaron Digulla    15 年前

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

    对于这些新的单元测试,“看不见的部分”实际上是它们必须覆盖的内容。这不再是隐藏的功能,而是 球座 .

    稍后,当你确信 球座 正确地工作(并进行必要的测试以确保它保持这样的状态),您可以使用它并忽略它是如何工作的。

        2
  •  1
  •   Martin Beckett    15 年前

    在单元测试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();
    }
    
        3
  •  0
  •   Konamiman    15 年前

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