Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对涉及文件输入输出的方法进行单元测试? 我使用了SypFoT的C++测试,用于单元测试C++代码。 我遇到了以下问题。我有一个与下一个类似的函数(伪代码):_C++_Unit Testing_File_Stub - Fatal编程技术网

如何对涉及文件输入输出的方法进行单元测试? 我使用了SypFoT的C++测试,用于单元测试C++代码。 我遇到了以下问题。我有一个与下一个类似的函数(伪代码):

如何对涉及文件输入输出的方法进行单元测试? 我使用了SypFoT的C++测试,用于单元测试C++代码。 我遇到了以下问题。我有一个与下一个类似的函数(伪代码):,c++,unit-testing,file,stub,C++,Unit Testing,File,Stub,我的问题是: 我应该为文件系统函数使用存根吗?或者我应该包括运行单元测试的特定样本测试文件吗 在我的例子中,类用于文件输入 有更好的建议吗?(最好在C++测试中完成,但不是强制性的)。我会选择简短的示例测试文件。它们可以与测试代码一起检入源代码管理。我之所以这样做,是因为函数的目的是加载一个文件,所以这是您应该测试的内容。我的建议: 为将调用此函数的函数创建存根 使用示例测试文件为此特定函数创建单元测试 创建一个没有存根的集成测试来测试整个过程。通常,在单元测试中,您希望尽可能地模拟原始功能,同

我的问题是:

我应该为文件系统函数使用存根吗?或者我应该包括运行单元测试的特定样本测试文件吗

在我的例子中,类用于文件输入


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

我会选择简短的示例测试文件。它们可以与测试代码一起检入源代码管理。我之所以这样做,是因为函数的目的是加载一个文件,所以这是您应该测试的内容。

我的建议:

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

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


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

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

if(openfile(rStrFileName)=成功)

然后您将准确地处理此情况并返回false。如果这可以通过存根实现,那就这样吧。在我的例子中,我将使用一个示例测试文件并将其与测试一起存储。这是一种常见的做法


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

我认为您正在寻找一种称为。几年前我看到一个项目,它会导致程序进入很少测试的错误状态(文件权限错误,malloc返回0,等等)。。我就是记不起它的名字了。希望wikipedia链接可以帮助您开始。

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

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


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

老实说,我将此函数分成两部分。一个函数将从
std::istream
读取,另一个函数将打开文件并返回
ifstream
(可能是由智能指针分配的堆)。然后,您可以通过提供一个
istringstream
而不是
ifstream
来轻松地对第一个进行单元测试,后者也应该很容易测试。

是的,但是我们可能希望“模拟”一些在使用文件时不总是发生的错误。我想,有时一些错误不可能用真实的文件系统来模拟。如果文件读取器错误不可能用真实的文件系统来模拟,那么它要么非常模糊,要么根本不会发生,因为您将在真实的文件系统上运行应用程序。例外情况是,如果您在system X上开发,并且希望测试system Y特定的错误。考虑到所有因素,我不排除在单元测试中模拟文件,但会从使用真实文件的测试开始。您是正确的,但缓冲区是动态分配的,以与文件大小相等。我稍微简化了这个问题[我有用于分配内存的存根-但C++测试不能帮助我为fstream类方法创建存根]。@Iulian:动态分配可能仍然会失败(例如,如果您请求100 GB内存),如果您与不控制的数据交互,您应该测试代码如何处理它无法处理的数据(它是优雅地失败还是只是崩溃?)@John R Strohm:这在理论上是正确的,但在许多情况下是过分的。我不想维护1000行生产代码+20000行测试代码,以及它自己的一系列问题和bug。我应该为测试代码编写测试吗?模拟复杂函数不是一件容易的任务。我有动态分配测试-失败/(不失败)如果代码出现问题,则会迫使测试失败。[请忽略此项:)-已处理完毕]@quant\u dev:如果您正在为某段代码维护一个monster测试套件,则通常表明代码的总体设计存在严重问题。自动测试设备的旧原理是,设计良好的测试装置通常只需要非常简单的测试装置。如果与UUT相比,测试集是巨大的,那是因为UUT的设计很差。(是的,我在实践中看到了这一点。)
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;
}