代码之家  ›  专栏  ›  技术社区  ›  INS

如何对涉及文件输入输出的方法进行单元测试?

  •  3
  • INS  · 技术社区  · 16 年前

    我正在使用SypFoT的C++测试来进行单元测试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++测试中完成,但不是强制的)。

    6 回复  |  直到 12 年前
        1
  •  4
  •   John R Strohm    16 年前

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

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

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

        2
  •  6
  •   quant_dev    16 年前

    我会找一些简短的样本测试文件。它们可以与测试代码一起签入到源代码管理中。我之所以这样做是因为您的函数的目的是加载一个文件,所以这就是您应该测试的内容。

        3
  •  2
  •   Samuel Carrijo    16 年前

    我的建议是:

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

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

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

        4
  •  1
  •   eduffy    16 年前

    我想你在找一种叫做 fault injection . 几年前我看到过一个项目,它会导致程序进入很少测试的错误条件(文件权限错误、malloc返回0等)。我只是不记得它的名字。希望维基百科的链接能帮你开始。

        5
  •  1
  •   rlbond    16 年前

    老实说,我将把这个函数分为两部分。一个函数将从 std::istream 打开文件并返回 ifstream (可能是由智能指针分配的堆)。然后,您可以通过提供 istringstream 而不是 文件流 后者也应该很容易测试。

        6
  •  0
  •   BuckFilledPlatypus    16 年前

    在单元测试中,您通常希望尽可能地模拟原始功能,同时覆盖尽可能多的正在测试的代码(代码覆盖率),这是一个好主意。撇开存根(我不熟悉),举一个例子,您希望确保,如果给定的文件名不正确,等等,文件中的第3行:

    if(openfile(rstrfilename)==成功)

    然后你会准确地处理这种情况并返回错误。如果这可以通过树桩来完成,那就这样吧。在我的例子中,我将使用一个示例测试文件,并将其存储在我的测试中。这是一种常见的做法。

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