c++使用boost测试

c++ Using boost test

本文关键字:测试 boost 使用 c++      更新时间:2023-10-16

如何将以下代码转换为使用boost单元测试框架:

#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

#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());
}

在boost单元测试套件中,您不需要按照您所描述的方式创建一个简单的程序。您不编写测试工具,而是编写由许多功能(每个测试用例一个)构建的测试套件。这些函数不接受命令行参数。

您编写的测试用例函数将是:

  • 虚函数(无参数)
  • 一元函数(一个参数)
  • 基于模板类构建(提供模板参数)

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

单元测试套件是这样设计的,因此它们可以在标准测试运行器中运行,也可以在任意运行器中运行,后者可能会有自己的命令行参数,并且需要特别注意支持自定义命令行参数。

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

我认为最好的解决方案是将ifile嵌入像xxd这样的程序(检查-include选项),参见http://linuxcommand.org/man_pages/xxd1.html。

这将给你一个带有字符数组的文件,你可以#include在。

现在您可以使用自定义命令行参数,这是在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