4

我正在使用来自 Parasoft 的 C++Test 对 C++ 代码进行单元测试。我遇到了以下问题。我有一个类似于下一个的功能(伪代码):

bool LoadFileToMem(const std::string& rStrFileName)
{
    if( openfile(rStrFileName) == successfull )
    {
         if( get_file_size() == successfull )
         {
            if( read_entire_file_to_buffer() == successfull )
            {
                return true;
            }
            return false;
         }
         return false;
    }
    return false;
}

在这种情况下,我的问题是:

我应该将存根用于文件系统功能吗?或者我应该包含用于运行单元测试的特定示例测试文件?

在我的例子中, std::fstream类用于文件输入。

有没有人更好的建议?(最好在 C++Test 中完成,但不是强制性的)。

4

6 回答 6

7

我会选择简短的示例测试文件。它们可以与测试代码一起检查到源代码控制中。我这样做的原因是你的函数的目的是加载一个文件,所以这就是你应该测试的。

于 2009-07-10T19:08:44.067 回答
5

对于这个函数的单元测试,你应该为每个被调用的函数使用存根。

然后,每个被调用的函数都有自己的单元测试套件,用于执行该函数。

对于read_entire_file_to_buffer(),您需要至少一个大量溢出缓冲区的测试文件,以验证当它们向您提供纽约证券交易所历史记录而不是您期望的 40 个字符的配置文件时,您不会崩溃和烧毁。

于 2009-07-10T19:51:42.453 回答
2

我的建议:

为将调用此函数的函数创建存根。

使用示例测试文件为此特定功能创建单元测试。

创建一个没有存根的集成测试来测试整个过程。

于 2009-07-10T19:09:28.153 回答
1

我认为您正在寻找一种称为故障注入的技术。几年前我看到了一个项目,它会导致程序进入很少测试的错误条件(文件权限错误、malloc 返回 0 等)。我只是不记得它的名称。希望维基百科链接可以帮助您入门。

于 2009-07-10T19:47:29.090 回答
1

老实说,我会把这个功能一分为二。一个函数会从 a 读取,一个函数会std::istream打开文件并返回一个ifstream(可能是一个由智能指针分配的堆)。然后,您可以通过提供 anistringstream而不是来轻松地对第一个进行单元测试ifstream,而后者也应该易于测试。

于 2009-07-10T20:20:10.243 回答
0

在单元测试中,您希望尽可能多地模仿原始功能,同时尽可能多地覆盖您正在测试的代码(代码覆盖率),这通常是一个好主意。除了我不熟悉的存根之外,一个例子是你想确保,提供错误的文件名,等等文件中的第 3 行:

如果(打开文件(rStrFileName)==成功)

那么你将准确地处理这种情况并返回false。如果这可以通过存根来完成,那就这样吧。在我的情况下,我会使用一个示例测试文件并将其与我的测试一起存储。这是一种常见的做法。

请记住,重点是尽可能接近现实地测试该功能。这将确保自动捕获许多您无法预料的奇怪情况,以便您可以修复它,这是单元测试的重点。

于 2009-07-10T19:38:37.283 回答