cppunit 使用命令行参数
cppunit to use command line arguments
我有一个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 ®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;
}
请考虑将代码划分为至少三种不同的方法:构造配置文件名的部分、读取配置文件的部分以及分析从配置文件读取的内容的部分。 您可以轻松彻底地对文件名生成器和分析器方法进行单元测试。 只要您可以测试简单地从文件中读取数据,即使是一次,您就应该很金牌。
[编辑]
例如,您可能有一个像 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工作,这些都不是。 你只是想测试你写的逻辑是否有效。
在操作系统中测试随机文件非常适合自动化系统测试,但不适用于自动化单元测试。
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 使用 C++ 将命令行参数拆分为参数/向量
- 如何在OMNET++中添加专门的命令行参数?
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- atoi() 在应用于大型命令行参数时会产生不正确的值
- 是否可以在命令行中将输入参数传递给可执行文件
- 命令行参数,cant 或两个变量
- 在 Windows 中使用 boost::p rogram_options 从命令行参数读取 Unicode 字符
- 如何在 Android/NDK 上将命令行参数从 gradlew.bat 传递到 Clang
- 编写一个将 LLVM IR 文件作为命令行参数的程序
- 通过命令行参数获取llvm ir文件时面临问题
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 从命令行获取参数时出现问题
- 如何在不使用文件扩展名的情况下使用命令行参数打开C++中的文本文件?
- 命令行参数在不到 3 个 LOC 中 int?
- 在命令行参数中使用引号
- 使用参数 + stdout + stderr 从命令行调用 MFC 应用程序
- 在VS2013中使用devenv (C++)传递命令行参数argv
- 二进制数据作为命令行参数