2013-10-20 58 views
0

我有一个测试,其目的是读取配置类中的CPP单元测试:我们可以调用这个类CppUnit的使用命令行参数

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 &registry = 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

考虑将你的代码至少三种不同的方法:即构建配置文件名部分,读取配置文件中的一部分,它分析了什么是部分从配置文件读取。您可以轻松彻底地测试文件名称构建器和解析器方法。只要你可以简单地从文件中读取数据,甚至一次,你应该是金。

[编辑]

例如,您可能有一个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的工作原理,都不是。你只是试图测试你编写的逻辑是否有效。

在操作系统中测试随机文件非常适合自动化系统测试,但不适用于自动化单元测试。

+0

您如何知道要读取哪个文件?读取的文件作为参数传入。所以相同的代码可以在多个文件上运行。我通过使用静态变量来绕过它,这不是很漂亮,但它是它是什么 –

+0

使用依赖注入。将文件名传递给配置文件命名方法的参数。输出应该是文件的完全限定名称。将名称传入文件阅读器。文件读取器的输出应该是一堆数据(可能是一个流)。将流传递到解析器,并获取配置信息。现在,您可以通过在测试代码中创建strstream来单元测试解析器,并且可以测试有关配置文件值的所有内容,而无需实际配置文件。你可以单元测试名称创建者,而不必打开一个实际的配置文件。 –

+0

林不知道我跟着,您的答案可能是一个伪代码扩展? –