如何将以下代码转换为使用boost unit测试框架:
#include <iostream>
#include <fstream>
#include "graph.hh"
int main(int argc, char **argv) {
const char* ifile = argv[1];
Graph gp;
gp.read_xml(ifile);
std::cout << "Checking number of nodes and edges..." << std::endl;
int nodes_expected = 16;
if(nodes_expected != gp.nodes()) {
std::cout << "Test Failed." << std::endl;
std::cout << "Expected: " << nodes_expected << std::endl;
std::cout << "Result: " << gp.nodes() << std::endl;
}
int edges_expected = 15;
if(edges_expected != gp.edges()) {
std::cout << "Test Failed." << std::endl;
std::cout << "Expected: " << edges_expected << std::endl;
std::cout << "Result: " << gp.edges() << std::endl;
}
return 0;
}
我已经阅读了(Boost Test)的文档,但它没有告诉我如何从命令行中提取参数。否则,我可能会使用BOOST_CHECK_EQUAL。
答案 0 :(得分:2)
#include <boost/test/included/unit_test.hpp>
#include <fstream>
#include "graph.hh"
using namespace boost::unit_test;
BOOST_AUTO_TEST_CASE( test_num_of_nodes )
{
Graph gp;
gp.read_xml( framework::master_test_suite().argv[1] );
BOOST_MESSAGE( "Checking number of nodes and edges..." );
BOOST_CHECK_EQUAL(16, gp.nodes());
BOOST_CHECK_EQUAL(15, gp.edges());
}
答案 1 :(得分:0)
我认为最好的解决方案是使用xxd等程序嵌入ifile
(查看-include选项),参见http://linuxcommand.org/man_pages/xxd1.html。
这将为您提供一个带有char数组的文件,您只需#include in。
答案 2 :(得分:0)
在boost单元测试套件中,您不会按照描述的方式创建简单的程序。你不编写测试工具,编写测试套件,由许多函数构建(每个测试用例一个)。这些函数不从命令行获取参数。
您编写的测试用例函数将是以下之一:
因此,您需要从单独的硬编码文件路径解析参数(将参数写入第二个文件而不是在命令行上传递它们),并将它们传递给一元函数测试用例,或者简单地放弃并硬编码到测试套件的文件路径,每个测试用例(函数)可能只有一个文件。
单元测试套件以这种方式设计,以便它们可以在标准测试运行器或任意运行器中运行,这可能需要自己的命令行参数,并且需要特别小心以支持自定义命令行参数。
测试运行器为您的未来需求提供了大量可插拔的灵活性(标准化测试运行,过滤,日志记录等),但您必须放弃一些类似程序的灵活性才能实现目标。
答案 3 :(得分:0)
现在您可以使用在 Boost::test 中添加的自定义命令行参数
#define BOOST_TEST_MODULE runtime_configuration1
#include <boost/test/included/unit_test.hpp>
using namespace boost::unit_test;
BOOST_AUTO_TEST_CASE(test_accessing_command_line)
{
BOOST_TEST_REQUIRE( framework::master_test_suite().argc == 3 );
BOOST_TEST( framework::master_test_suite().argv[1] == "--specific-param" );
BOOST_TEST( framework::master_test_suite().argv[2] == "'additional value with quotes'" );
BOOST_TEST_MESSAGE( "'argv[0]' contains " << framework::master_test_suite().argv[0] );
}