Модульное тестирование гибкого синтаксического анализа зубров, как вести тестовый кейс

У меня есть вопрос о том, как "управлять" сканером синтаксического анализатора на основе гибкого бизона в модульном тесте.

Окончательным решением будет доступный анализатор команд или телнет к целевой плате. У меня есть полностью рабочая реализация 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-кода, только грамматику зубров.

Выдержка из cmd_test.c (имеет int main(), где расположен код Cunit)

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() или что-то в этом роде).

Кто-нибудь может дать мне подсказку?

/ Микаэль

1 ответ

Я вижу, что этот вопрос остается без ответа в течение почти года и является единственным вопросом ОП. Возможно, это интересный вопрос, касающийся элементов потенциально несовместимых технологий. Он также содержит некоторые неверные утверждения, которые дают неверное представление о пространстве решений.

Во-первых, стоит подвести итог того, что спрашивают. Cunit - это библиотека модульного тестирования, которая позволяет использовать инструментарий кода C для автоматического модульного тестирования. Модульное тестирование - это обычно тестирование блоков кода в отсутствие пользовательского интерфейса. Flex и Bison - инструменты, используемые для создания языковых интерфейсов.

Языковые интерфейсы обычно тестируются с использованием автоматического тестирования на основе ввода файлов, а не модульного тестирования; однако программные функции, вызываемые интерфейсом, могут быть проверены модулем. Тем не менее, модульное тестирование может играть роль в тестировании программного обеспечения, написанного на flex и bison.

В вопросе говорится, что исходный файл парсера не содержит никакого кода на C, только грамматику. Это должно быть неверно, потому что если бы оно содержало только грамматику и не содержало семантических действий, язык ничего не делал. Запуск синтаксического анализатора не будет иметь никакого действия, кроме как отображать сообщение об ошибке или нет, что является функцией пользовательского интерфейса. Чтобы иметь какое-либо значение, синтаксический анализатор должен вызывать семантические действия, которые будут написаны на каком-то языке, часто на C. Эти многочисленные и важные части кода C могут быть использованы для модульного тестирования.

Как было задано в вопросе, для модульного тестирования с Cunit интерфейс с гибкой / бизонной кодировкой должен будет использовать параметризованный ввод и вывод вместо файлового / потокового ввода.

Это может быть достигнуто. Есть довольно много других ответов на SO, которые касаются того, как это можно сделать (а также руководства по flex/bison). Если мы хотим проверить использование строкового ввода, мы можем заменить строковый ввод для ввода файла, как обсуждалось здесь:

  1. Есть ли рабочий пример flex + bison с вводом из строки, а не из файла?
  2. Как заставить YY_INPUT указывать на строку, а не на stdin в Lex & Yacc (Solaris)
  3. как использовать yy_scan_string в lex
  4. как разобрать из строки, а не из файла

Точно так же вывод bison может быть получен путем переопределения yyerror и других перенастраиваемых интерфейсов, но я не буду перечислять вопросы, которые обсуждают их.

Итак, в заключение, да - это возможно. Это разумно. Я не уверен. Мне кажется, что есть достаточно других форм инструментов автоматического тестирования, более подходящих для компонентов интерфейса на основе языка.

Другие вопросы по тегам