Boost.Spirit の単体テスト
-
20-08-2019 - |
質問
私は Boost.Spirit と Boost.Test を初めて使用するので、文法の正しさをどのように検証するかを知りたいと思っています。以下は私が現時点で行っている方法の簡略版ですが、もっと良い方法があると確信しています。
各テスト ケースには、解析するテキストと期待される結果をセミコロンで区切った 2 つの文字列のペアが含まれます。
解析関数は実際の解析を行い、期待される結果と等しい文字列を返します。
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()
解決
一般的に、あなたのアプローチは、私には罰金です。私は説明的な名前、例えば持つ関数へのテストのグループクラス、おそらくだろうTestInvalidGrammar、TestErrorHandling、TestNestedGrammarなど、メインから呼び出されたものを持っています。
私はあなたのドキュメントを読んでいると確信していますが、<のhref = "http://www.boost.org/doc/libs/1_37_0/libs/test/doc/html/utf/user-guide/を見てみましょうそれは場合に役立ちますテスト組織/手動引数なしのテスト-case.html」のrel = "nofollowをnoreferrer">例がします。
他のヒント
ここでは、彼ら (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/.