我需要为测试生成临时文件。看起来我不能使用mkstemp
,因为我需要文件名具有特定的后缀,但文件名的其余部分我并不在意。 GTest中是否有一种方法可以创建一个临时文件来处理文件的创建以及测试结束时的删除。
另一种方法是创建我自己的类来做到这一点。
答案 0 :(得分:2)
虽然它没有构建临时文件,但是googletest提供了两个不同的测试宏,TEST和TEST_F,后者是固定的。请参阅标题为"测试夹具:使用相同数据配置..."在the Primer了解有关灯具的更多信息。
我对此问题的解决方案是使用带有固定测试的Boost.Filesystem。我希望能够拥有一个为所有测试共享的命名temp子目录。在这种情况下,我正在调整我的案例以适应OP对指定后缀的请求。
包括:
// Boost.Filesystem VERSION 3 required
#include <string>
#include <boost/filesystem.hpp>
测试类定义:
class ArchiveTest : public ::testing::Test {
protected:
boost::filesystem::path mTempFileRel;
boost::filesystem::path mTempFileAbs;
std::ofstream mExampleStream;
ArchiveTest() {
mTempFileRel = boost::filesystem::unique_path("%%%%_%%%%_%%%%_%%%%.your_suffix");
mTempFileAbs = boost::filesystem::temp_directory_path() / mTempFileRel;
mExampleStream.open(mTempFileAbs);
}
~ArchiveTest() {
if(mExampleStream.is_open())
{
mExampleStream.close();
}
}
// Note there are SetUp() and TearDown() that are probably better for
// actually opening/closing in case something throws
};
注意:虽然您可以在构造函数或SetUp()中创建文件对象并在析构函数或TearDown()中关闭,但我更喜欢在测试中执行此操作,因为我不使用在所有测试中创建的文件名夹具固定。因此,在使用流示例时要格外小心。
以下是我对文件名的使用:
// Tests that an ArchiveFile can be written
TEST_F(ArchiveTest, TestWritingArchive) {
try
{
TheInfo info_; // some metadata for the archive
MyArchive archive_; // Custom class for an archive
archive_.attachToFile(mTempFile, info_);
...
}
catch(const std::exception& e_)
{
FAIL() << "Caught an exception in " << typeid(*this).name()
<< ": " << e_.what();
}
}
如果您对“&#39;%&#39;字符来自the reference on unique_path:
unique_path函数生成适合创建的路径名 临时文件,包括目录。该名称基于模型 使用百分号字符指定替换为 随机十六进制数字。
注意:
答案 1 :(得分:0)
创建文件和文件夹不在任何测试框架的范围内,包括Google测试。为此目的将一些其他库链接到您的测试二进制文件。
答案 2 :(得分:0)
您可以在某些系统上使用mkstemps,尽管它是非标准的。来自man page的mkstemp:
mkstemps()函数类似于mkstemp(),但模板中的字符串包含后缀字符的后缀。因此,模板的格式为prefixXXXXXXsuffix,字符串XXXXXX的格式为mkstemp()。
因此,你可以像这样使用mkstemps:
// The template in use. Replace '.suffix' with your needed suffix.
char temp[] = "XXXXXX.suffix";
// strlen is used for ease of illistration.
int fd = mkstemps(temp, strlen(".suffix"));
// Since the template is modified, you now have the name of the file.
puts(temp);
您需要跟踪文件名,以便在程序结束时将其删除。如果您希望能够将所有这些文件放入/ tmp,那么您应该能够添加“/ tmp /”作为前缀。但是,似乎没有办法创建临时目录。
答案 3 :(得分:0)
Googletest现在包括testing::TempDir()
,但是它只返回/tmp/
或特定于平台的等价物,它不会进行任何清理。