Flex Bison扫描仪解析的单位测试,如何驱动测试用例



我有一个问题,即在单位测试中如何"驱动"基于弹性野牛的解析器扫描仪。

最终解决方案将是可用的命令解析器,或者是目标板的命令。我使用STDIN有一个完全有效的Flex Bison实现。

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

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

我不知道如何为此设置弹性和野牛。请在下面找到测试案例:

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代码,只有野牛语法。

摘录摘自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是一个单元测试库,允许在C代码上进行自动单位测试的仪器。单位测试通常是在没有用户界面的情况下测试代码单元。Flex和Bison是用于构建基于语言的界面的工具。

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

问题指出,解析器源文件不包含任何C代码,而只包含语法。这必须是不正确的,因为如果它仅包含语法并且没有语义动作,那么该语言将无能为力。解析器的运行不会采取任何操作,而是显示错误消息,这是用户界面函数。要具有任何值,一个解析器必须调用以某种语言编写的语义动作,通常C。这些多个且重要的C代码可以用于单元测试。

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

这可以实现。还有很多其他答案,因此请参考如何完成此操作(以及Flex/Bison手册)。如果要使用字符串输入进行测试,我们可以将字符串输入替换为文件输入:

  1. 是否有flex 野牛的工作示例,带有字符串的输入,而不是文件?
  2. 如何使yy_input指向字符串,而不是在lex& amp;Yacc(Solaris)
  3. 如何在lex中使用yy_scan_string
  4. 如何从字符串而不是文件解析

同样,可以通过重新定义Yyerror和其他可重构接口来捕获野牛的输出,但我不会列出讨论这些问题的问题。

因此,总而言之,是的。这是明智的吗?我不知道。我的感觉是还有足够的其他形式的自动测试工具更适合基于语言的接口组件。

最新更新