c ++使用boost测试

时间:2011-08-09 02:06:19

标签: c++ unit-testing boost

如何将以下代码转换为使用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。

4 个答案:

答案 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单元测试套件中,您不会按照描述的方式创建简单的程序。你不编写测试工具,编写测试套件,由许多函数构建(每个测试用例一个)。这些函数不从命令行获取参数。

您编写的测试用例函数将是以下之一:

  • Nullary functions(无参数)
  • 一元函数(一个参数)
  • 针对模板类构建(提供模板参数)

因此,您需要从单独的硬编码文件路径解析参数(将参数写入第二个文件而不是在命令行上传递它们),并将它们传递给一元函数测试用例,或者简单地放弃并硬编码到测试套件的文件路径,每个测试用例(函数)可能只有一个文件。

单元测试套件以这种方式设计,以便它们可以在标准测试运行器或任意运行器中运行,这可能需要自己的命令行参数,并且需要特别小心以支持自定义命令行参数。

测试运行器为您的未来需求提供了大量可插拔的灵活性(标准化测试运行,过滤,日志记录等),但您必须放弃一些类似程序的灵活性才能实现目标。

答案 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] );
}

来自https://www.boost.org/doc/libs/1_70_0/libs/test/doc/html/boost_test/runtime_config/custom_command_line_arguments.html