Boost.Spirit 的单元测试

Posted

技术标签:

【中文标题】Boost.Spirit 的单元测试【英文标题】:Unit-tests for Boost.Spirit 【发布时间】:2009-01-26 11:06:09 【问题描述】:

我是 Boost.Spirit 和 Boost.Test 的新手,我想知道您如何验证语法的正确性。以下是我目前如何做的简化版本,我很确定有更好的方法:

每个测试用例都有一对包含要解析的文本和用分号分隔的预期结果的两个字符串。

解析函数进行实际解析并返回一个应该等于预期结果的字符串。

 std::string parse(std::string const & line) 
  std::string name;
  int hours;

  rule<> top_rule = ... ; // rule assignes values to 'name' and 'hours'

  parse_info<> info = parse(line.c_str(), top_rule);

  if(info.full) 
    std::stringstream sstr;
    sstr << name << ";" << hours;

    return sstr.str();
  

  return "parser failed.";


BOOST_AUTO_TEST_SUITE( TestSuite )

BOOST_AUTO_TEST_CASE( TestCase ) 
  BOOST_CHECK_EQUAL(parse("Tom worked for 10 hours."), "Tom;10");


BOOST_AUTO_TEST_SUITE_END()

【问题讨论】:

我不知道,但你为什么希望它“更好”? 我会把它分成一个问题和一个可能的答案。这样,如果人们认为您的解决方案确实是最好的,他们就可以投票。 【参考方案1】:

总的来说,您的方法对我来说似乎很好。我可能会将测试类分组为具有描述性名称的函数,例如TestInvalidGrammar、TestErrorHandling、TestNestedGrammar 等,并从 main 调用。

我确定您已阅读文档,但如果有帮助,请查看 examples。

【讨论】:

【参考方案2】:

在这里你可以看到他们(boost spirit 作者)如何测试他们自己的解析器:http://svn.boost.org/svn/boost/trunk/libs/spirit/test/qi/grammar.cpp。对于 qi 的每个部分,您可以在此处找到一个 C++ 文件:http://svn.boost.org/svn/boost/trunk/libs/spirit/test/qi/。

【讨论】:

以上是关于Boost.Spirit 的单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Boost Spirit解析字符串以前缀开头

为啥 nvcc 无法使用 boost::spirit 编译 CUDA 文件?

使用 boost::spirit::x3 解析成向量<boost::string_view>

使用 boost::spirit 解析任意精度整数

Boost.Spirit.X3 中的船长

使用 boost-spirit 解析 ipv4 地址