单元测试:静态创建方法

问题描述 投票:0回答:2

我想开始为缓冲类编写一些单元测试,并且我在静态创建方法上有点挣扎。

class MyBuffer
{
public: 
  static MyBuffer* create(int32 bufSize)
  {
     if(!bufSize)
       return nullptr; 

     char* internalBuf = (char*)malloc(bufSize);
     if(nullptr == internalBuf) return nullptr; 

     return new MyBuffer(internalBuf, bufSize);
  }

 public bool write(void* data, int32 dataSize) {...}

private:
 MyBuffer(char* buf, int32 size) : internalBuf(buf), size(bufSize) {}

 char* internalBuf = nullptr; 
 int32 bufSize = 0;
};

//just dummy code
TEST(MyBuffer bufferWithZeroSize)
{ 
   auto buf = MyBuffer::create(0);
   ASSERT_True(nullptr == buf);
}

TEST(MyBuffer writeDataToBuffer)
{
  //arrange
  auto buf = MyBuffer::create(50); 
  ASSERT_NotNull(buf); //is this call needed

  //act
  buf->write(...); 

  //assert 
}

验证MyBuffer创建过程似乎没问题。

在我的第二次测试中,可以假设MyBuffer的创建过程是成功的吗?否则我必须在单元测试的“行为”部分检查它。这对我来说听起来不太合理,因为我想每单位测试只检查一件事。另一方面,我知道malloc调用可能会失败。

如何使用静态create方法测试对象?是否有任何有用的测试策略或是否建议重构这些对象?我主要使用静态创建方法,以避免对象的调用者忘记正确初始化对象。因此,这对我来说是一种有效的方法。

c++ unit-testing
2个回答
1
投票

我主要使用静态创建方法,以避免对象的调用者忘记正确初始化对象。

用户无法“忘记”初始化下面显示的MyBuffer实例。

#include <cstddef>

class MyBuffer
{
private:
    std::size_t bufSize;
    char* internalBuf;

public:
    MyBuffer(std::size_t size)
    : bufSize{ size }
      internalBuf{ new char[size] },
    {}

    // + whats missing to satisfy the rule of 5

    bool write(char *data, std::size_t dataSize)
    {
        /* ... */
        return true;
    }
};

注意:不要明显使用qazxsw poi。使用qazxsw poi作为内存中对象的大小。

关于最新评论的更新

malloc()

0
投票

我怀疑你不需要首先写一个缓冲类,而是可以使用std::size_t。一般来说,你应该尝试避开原始内存管理(根本不要写新的/ delete / malloc / free(尤其是删除/免费))。

至于单元测试问题,是的,一些设置是好的,以便达到您的实际测试(或测试)。当您在测试中重复使用设置时,通常称为Fixture。我认为在同一测试中测试几件事并不罕见。有时测试本身的性能也是一件事,如果设置成本高昂,那么测试更多东西是有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.