0

我有一个 CPP 单元测试,它测试一个旨在读取配置的类:我们可以调用这个类

Config

配置类有能力做

Config c;
c.read("/tmp/random-tmp-directory/test.conf");

random-temp-directorybash 脚本创建,应传递到测试二进制文件中。

#!/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;
}
4

1 回答 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 是否有效,这些都没有。您只是在尝试测试您编写的逻辑是否有效。

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

于 2013-10-28T21:22:51.260 回答