加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 01:45:43 所属栏目:百科 来源:网络整理
导读:我有一个关于如何在单元测试中“驱动”基于flex bison的解析器扫描器的问题. 最终的解决方案是可用的命令解析器或telnet到目标板.我有一个使用stdin完全工作的flex bison实现. 现在我的重点是为命令解析器运行单元测试. 我希望能够为解析器(命令)提供“const
我有一个关于如何在单元测试中“驱动”基于flex bison的解析器扫描器的问题.

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

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

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

我不知道如何为此设置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("statusn");
  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();

我试图理解文档,我不知道如何驱动野牛(yyparse()或类似的东西).

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

/ Mikael

解决方法

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

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

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

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

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

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

> Is there working example of flex + bison with input from string,not file?
> How to make YY_INPUT point to a string rather than stdin in Lex & Yacc (Solaris)
> how to use yy_scan_string in lex
> how to parse from a string rather than a file

类似地,可以通过重新定义yyerror和其他可重新配置的接口来捕获bison的输出,但我不会列出讨论这些的问题.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读