我有一个CPP单元测试,它测试一个用于读取配置的类:我们可以调用这个类
Config
config类具有执行
的能力Config c;
c.read("/tmp/random-tmp-directory/test.conf");
random-temp-directory
由bash脚本创建,应传递给测试二进制文件。
#!/bin/bash
TEMPDIR=$(mktemp)
cp files/config/test.conf $TEMPDIR/.
./testConfig $(mktemp)/test.conf
上面创建了一个临时目录,复制我们的临时文件并将路径传递给测试,因此它可以加载正确的文件。
有没有办法告诉CPPUNIT将命令行参数或任何参数发送到测试注册表?
这是我的testConfig.cpp
#include <all the required.h>
CPPUNIT_TEST_SUITE_REGISTRATION(testConfig);
int main(int argc, char ** argv)
{
CPPUNIT_NS::TestResult testresult;
CPPUNIT_NS::TestRunner runner;
CPPUNIT_NS::TestFactoryRegistry ®istry = CPPUNIT_NS::TestFactoryRegistry::getRegistry();
// register listener for collecting the test-results
CPPUNIT_NS::TestResultCollector collectedresults;
testresult.addListener(&collectedresults);
runner.addTest(registry.makeTest());
runner.run(testresult);
// Print test in a compiler compatible format.
CppUnit::CompilerOutputter outputter( &collectedresults, std::cerr );
outputter.write();
return collectedresults.wasSuccessful() ? 0 : 1;
}
答案 0 :(得分:0)
考虑将代码划分为至少三种不同的方法:构造配置文件名的部分,读取配置文件的部分以及解析从配置文件中读取的内容的部分。您可以轻松,彻底地对文件名构建器和解析器方法进行单元测试。只要你能测试一次只是从文件中读取数据,你应该是金色的。
[编辑]
例如,您可能有一个类似string & assembleConfigFileName(string basepath, string randompath, string filename)
的方法,它接收路径和文件名的不同组件,并将它们放在一起。一个单元测试应该如下所示:
void TestConfig::assembleConfigFileName_good()
{
string goodBase("/tmp");
string goodPath("1234");
string goodName("test.conf");
string actual(assembleConfigFileName(goodBase, goodPath, goodName));
string expected("/tmp/1234/test.conf");
CPPUNIT_ASSERT_EQUAL(expected, actual);
}
现在您可以测试您是否正确构建了完全限定的配置文件名。测试不是试图读取文件。测试不是试图生成随机数。测试提供了一个示例,说明了例程需要采取什么类型的输入,并准确说明输出应该是什么样的输出。它证明了代码的确如此。
这个例程实际上从临时目录中读取配置文件并不重要。它生成正确的文件名是非常重要的。
类似地,您构建了一个单元测试来测试代码中的每个可能的流,包括错误情况。假设您编写了一个异常处理程序,如果随机路径错误则抛出异常处理程序。您的单元测试将测试异常机制:
void TestConfig::assembleConfigFileName_null_path()
{
string goodBase("/tmp");
string nullPath;
string goodName("temp.config");
CPPUNIT_ASSERT_THROW(assembleConfigFileName(goodBase, nullPath, goodName), MissingPathException);
}
测试现在是一个文档,它确切地说明了它是如何工作的,以及它究竟是如何失败的。他们每次运行测试都会证明这一点。
您似乎尝试做的事情是创建系统测试,而不是单元测试。在单元测试中,您不希望随机传递配置文件。您不是要尝试测试外部依赖项,文件系统是否正常工作,shell脚本是否正常工作,$ TMPDIR是否正常工作。你只是试图测试你写的逻辑是否有效。
在操作系统中测试随机文件非常适合自动化系统测试,但不适用于自动化单元测试。