flex bison扫描器解析单元测试,如何驱动测试用例

时间:2014-03-05 18:01:37

标签: bison flex-lexer cunit

我有一个关于如何在单元测试中“驱动”基于flex bison的解析器扫描程序的问题。

最终解决方案将是可用的命令解析器或telnet到目标板。我有一个使用stdin的完全工作的flex bison实现。

现在我的重点是为命令解析器运行单元测试。

我希望能够为解析器(一个命令)提供一个“const string”,然后测试在应用程序中调用相应的命令(在应用程序存根中)。

我不知道如何为此设置flex和bison。请在下面找到测试用例:

status_cmd_test.c:

#include "CUnit/Basic.h"
#include "cmd_stub.h"


void scan_string(const char* str);

void testSTATUS_OK(void)
{

  scan_string("status\n\0\0");
  CU_ASSERT(1 == status_sub_nrof_invokes())

}

摘自cmd_lexer.l:

void scan_string(const char* str)
{
  YY_BUFFER_STATE buf;
  buf = yy_scan_string(str);
  yylex();
  yy_delete_buffer(buf);
}

cmd_parser.y不包含任何c代码,只包含bison语法。

摘自cmd_test.c(具有cunit代码所在的int main())

if (NULL == CU_add_test(suite_p, "test of status", testSTATUS_OK))
{
  CU_cleanup_registry();
  return CU_get_error();
}

/* Run all tests using the CUnit Basic interface */
CU_basic_set_mode(CU_BRM_VERBOSE);
CU_basic_run_tests();
CU_cleanup_registry();
return CU_get_error();

我试图理解文档,因为我不知道如何驱动bison(yyparse()或类似的东西)。

任何人都可以给我一个提示吗?

/ Mikael

1 个答案:

答案 0 :(得分:3)

我认为这个问题近一年来一直未得到回答,这是OP唯一的问题。这可能是一个有趣的问题,涵盖了潜在不兼容技术的要素。它还包含一些错误的断言,这些断言会给出解决方案空间的错误视图。

首先,值得总结一下被问到的问题。 Cunit is a unit testing library允许对C代码进行自动单元测试的检测。单元测试通常在没有用户界面的情况下测试代码单元。 Flex和Bison是用于构建基于语言的界面的工具。

基于语言的界面通常使用基于文件输入的自动测试进行测试,而不是基于单元的测试;但是,接口调用的软件功能可能是单元测试的。然而,单元测试可能在测试用flex和bison编写的软件中起作用。

问题表明解析器源文件不包含任何C代码,只包含语法。这必须是不正确的,因为如果它只包含语法而没有语义动作,那么语言就什么也不做。解析器的运行将没有任何类型的操作,但是显示错误消息,这是一个用户界面功能。为了获得任何价值,解析器必须调用以某种语言编写的语义操作,通常是C.这些多个重要的C代码可以用于单元测试。

正如问题所述,要使用Cunit进行单元测试,flex / bison编码接口必须使用参数化输入和输出而不是文件/流输入输出。

这可以实现。 SO上还有很多其他答案,指的是如何做到这一点(以及flex / bison手册)。如果我们想使用字符串输入进行测试,我们可以将字符串输入替换为文件输入,如下所述:

  1. Is there working example of flex + bison with input from string, not file?
  2. How to make YY_INPUT point to a string rather than stdin in Lex & Yacc (Solaris)
  3. how to use yy_scan_string in lex
  4. how to parse from a string rather than a file
  5. 类似地,可以通过重新定义yyerror和其他可重新配置的接口来捕获野牛的输出,但我不会列出讨论这些的问题。

    总而言之,是的 - 这是可能的。这是明智的吗?我不确定。 我的感觉是有足够的其他形式的自动化测试工具更适合基于语言的界面组件。