我想开始为缓冲类编写一些单元测试,并且我在静态创建方法上有点挣扎。
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方法测试对象?是否有任何有用的测试策略或是否建议重构这些对象?我主要使用静态创建方法,以避免对象的调用者忘记正确初始化对象。因此,这对我来说是一种有效的方法。
我主要使用静态创建方法,以避免对象的调用者忘记正确初始化对象。
用户无法“忘记”初始化下面显示的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()
我怀疑你不需要首先写一个缓冲类,而是可以使用std::size_t
。一般来说,你应该尝试避开原始内存管理(根本不要写新的/ delete / malloc / free(尤其是删除/免费))。
至于单元测试问题,是的,一些设置是好的,以便达到您的实际测试(或测试)。当您在测试中重复使用设置时,通常称为Fixture。我认为在同一测试中测试几件事并不罕见。有时测试本身的性能也是一件事,如果设置成本高昂,那么测试更多东西是有意义的。