cppunit 使用命令行参数

cppunit to use command line arguments

本文关键字:参数 命令行 cppunit      更新时间:2023-10-16

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

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;
}

请考虑将代码划分为至少三种不同的方法:构造配置文件名的部分、读取配置文件的部分以及分析从配置文件读取的内容的部分。 您可以轻松彻底地对文件名生成器和分析器方法进行单元测试。 只要您可以测试简单地从文件中读取数据,即使是一次,您就应该很金牌。

[编辑]

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

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