c++ - 通过接口(interface)测试实现

标签 c++ unit-testing

我从我的 C++ 项目的测试覆盖率开始,这对我来说很奇怪,很多框架无法创建参数化单元测试。

例如我有接口(interface):

class IBuffer {
public:
   virtual void pushBytes(void *data, int length) = 0;
   virtual int  getSize() = 0;
};

还有一些实现者:

class BufferImplOne{};
class BufferImplTwo{};

现在我想检查将字节推送到缓冲区是否真的会增加其大小:

TEST_CASE("example/test", "Test for any IBuffer implementor") {

IBuffer *buf = // ... {I want external parameter to be here}

REQUIRE( buf->getSize() == 0 );

int dataLength = 10;
int data[dataLength];
    buf->pushBytes(data, dataLength * sizeof(int));

REQUIRE( buf->getSize() == dataLength * sizeof(int));
}

现在我要测试每个实现,我要做的第一件事是检查实现者是否满足接口(interface)测试。但是我不想复制粘贴相同的代码两次,我只想将实现作为参数传递给接口(interface)测试。如何处理这样的问题?

我正在使用 CATCH ,但似乎其他框架也不提供相同的功能。

无论如何,我是单元测试的新手,也许我误解了一些基本的东西?

最佳答案

像这样:

void TestBuffer(IBuffer& buf)
{
    REQUIRE( buf.getSize() == 0 );

    int dataLength = 10;
    int data[dataLength];
    buf.pushBytes(data, dataLength * sizeof(int));

    REQUIRE( buf.getSize() == dataLength * sizeof(int));
}

TEST_CASE("example/test", "Test for BufferImplOne implementor")
{
   BufferImplOne one;
   TestBuffer(one);
}

TEST_CASE("example/test", "Test for BufferImplTwo implementor")
{
   BufferImplTwo two;
   TestBuffer(two);
}

关于c++ - 通过接口(interface)测试实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10793862/

相关文章:

c++ - 在运行时更改数组维度

c++ - 如何标记 C 字符串的结尾?

unit-testing - TestNG 可以看到我的 Spock (JUnit) 测试结果吗?

c# - 我怎样才能模拟这个异步方法?

c++ - SDL2 C++ - multimap 像渲染错误

c++ - Linux C++ 程序通过系统调用启动 bash 脚本总是返回 -1

C++ header 保持理智

javascript - Promise 中的单元测试 pg 发射器得到

c# - Moq 上的扩展方法返回 null

c# - VS Test Runner 在 Visual Studio Online 上运行缓慢