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

flex bison扫描器解析的单元测试,如何驱动测试用例,bison,flex-lexer,cunit,Bison,Flex Lexer,Cunit,我有一个关于如何在单元测试中“驱动”基于flex bison的解析器扫描器的问题 最终的解决方案将是一个可用的命令解析器或telnet到目标板。我有一个使用stdin的完全工作的flex-bison实现 现在我的重点是让命令解析器运行单元测试 我希望能够向解析器提供一个“const string”(一个命令),然后测试相应的命令是否在应用程序中被调用(在应用程序存根中) 我不知道如何设置flex和bison。请在下面找到测试用例: status_cmd_test.c: #include "CU

我有一个关于如何在单元测试中“驱动”基于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())

我试图通过我不知道如何驾驶bison(yyparse()或类似的东西)来理解文档

谁能给我一个提示吗


/米凯尔

我知道这个问题已经有将近一年没有答案了,这是OP唯一的问题。这可能是一个有趣的问题,涉及潜在不兼容技术的元素。它还包含一些错误的断言,这些断言给出了解决方案空间的错误视图

首先,值得总结一下被问到的问题。这允许使用C代码进行自动化单元测试。单元测试通常是在没有用户界面的情况下测试代码单元。Flex和Bison是用于构建基于语言的接口的工具

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

问题是解析器源文件不包含任何C代码,只包含语法。这肯定是错误的,因为如果它只包含语法而不包含语义动作,那么该语言将一事无成。解析器的运行不会有任何类型的操作,但会显示错误消息,这是一个用户界面函数。要获得任何值,解析器必须调用语义动作,这些动作将用某种语言编写,通常是C。这些多个重要的C代码片段可以用于单元测试

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

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

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

    总之,是的,这是可能的。这是明智的。我不确定。
    我觉得有足够多的其他形式的自动化测试工具更适合基于语言的接口组件。

    好吧,这是OP答案的一个很好的开始。你提出了一个非常有趣(但不完整)的最后一点。我认为,如果你真的把这篇文章放到了正确的方向上,并把重点放在这一点上,这将是一个很好的答案。那么,你能详细说明哪些自动化测试工具更适合基于语言的接口组件吗?@Joost我指的是测试的语言验证套件,我觉得这超出了所要求的测试范围。我想说“你不能从这里到那里”。至少这些评论将把这些指针留给读者。
    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();