Верификация кода С с Simulink Test

Выполните верификацию и анализ покрытия для кода С, используемого в модели.

Этот пример показывает, как проверить код С с двумя тестами: интерактивный тест с помощью средств управления HMI и логического теста кода выводится во время симуляции.

Код С интегрирован в модель с блоком C Caller. Тесты используют менеджера по Тесту, тестовые обвязки, блок Test Sequence, блок Test Assessment и блоки Simulink® Dashboard. Результаты испытаний включают выходные параметры сигнала и покрытие модели. операторы verify оценивают код С во время симуляции.

Откройте проект в качестве примера

1. Создайте и откройте рабочую копию файлов Проекта Simulink. Модели и файлы тестовой обвязки находятся в папке Models. Исходные и заголовочные файлы для пользовательского кода С находятся в папке CCode. Тестовый файл находится в папке Tests.

[projectFolder,~]=matlab.internal.project.example.projectDemoSetUp...
    (fullfile(matlabroot,'toolbox','simulinktest','simulinktestdemos',...
    'sltestCCodeIntegration.zip'),[],[]);
proj = simulinkproject(projectFolder);

2. Откройте модель sltestCruiseControlExample.

mdl = 'sltestCruiseControlExample';
open_system(mdl);

Блок C Function Caller интегрирует код С, заданный в RejectDoublePress.c. Код С является служебной функцией, которая обнаруживает, когда Coast/Set и входные параметры Accelerate/Resume одновременно установлены в true пользователем и выходные параметры false для обоих сигналов. В противном случае входные значения передаются выходным параметрам:

void RejectDoublePress(unsigned char CoastSetSwIN, unsigned char AccelResSwIN,
unsigned char *CoastSetSwOUT, unsigned char *AccelResSwOUT)
{
  unsigned char LogicalOperator;
  LogicalOperator = !(CoastSetSwIN && AccelResSwIN);
  *CoastSetSwOUT = (LogicalOperator && CoastSetSwIN);
  *AccelResSwOUT = (LogicalOperator && AccelResSwIN);
}

Интерактивное тестирование со средствами управления HMI

Блок C Caller имеет две тестовых обвязки. Открытый sltestCruiseControlSimpleHarness:

1. Кликните по перспективному значку обвязки в правом нижнем углу блока C Function Caller.

2. Кликните по мозаике sltestCruiseControlSimpleHarness.

sltest.harness.open([mdl, '/C Function Caller'], 'sltestCruiseControlSimpleHarness');

Тестовая обвязка реализует интерактивный тест алгоритма C. Можно управлять Coast/Set и входными параметрами Accelerate/Resume с переключателями ползунка. Лампы отображают выходные значения компонента.

3. Запустите симуляцию тестовой обвязки путем нажатия на Play в панели инструментов Simulink.

4. Переключите входные параметры, чтобы попробовать различные входные комбинации. Проверьте ожидаемое поведение, в частности что выходными параметрами является false, когда обоими входными параметрами является true.

5. Нажмите кнопку Stop, чтобы закончить симуляцию.

6. Закройте тестовую обвязку.

close_system('sltestCruiseControlSimpleHarness', 0);

Логический тест с тестовым блоком последовательности

Можно использовать блок Test Sequence, чтобы протестировать комбинации входных параметров и проверить ожидаемое поведение. Откройте обвязку sltestCruiseControlTestSeqHarness, блок Test Sequence и блок Test Assessment.

sltest.harness.open([mdl, '/C Function Caller'], 'sltestCruiseControlTestSeqHarness');
open_system('sltestCruiseControlTestSeqHarness/Test Sequence');
open_system('sltestCruiseControlTestSeqHarness/Test Assessment');

Блок Test Sequence продвигается через четыре возможных булевых входных комбинации. Блок Test Assessment использует активный шаг блока Test Sequence, чтобы активировать верификации ожидаемых выходных параметров для каждого из соответствующих входных условий. В частности, когда обоими входными параметрами является true, оба выходных параметров проверяются, чтобы быть false.

Запустите логический тест

Запустите тест и просмотрите результаты операторов verify:

1. Откройте менеджера по тесту.

sltest.testmanager.view;

2. Откройте тестовый файл sltestCruiseControlCTests.mldatx. Тестовый файл имеет один тест, который запускает тестовую обвязку sltestCruiseControlTestSeqHarness.

sltest.testmanager.load('sltestCruiseControlCTests.mldatx');

3. Запустите тестовый файл путем нажатия на Play в менеджере по Тесту панель инструментов.

sltest.testmanager.run;

Каждый оператор verify в блоке Test Assessment производит трассировку сигнала в результатах испытаний. Проверьте, что каждый оператор передает для временных шагов, что это активно.

Тест также возвращает покрытие для кода С. В панели Результатов и Артефактов менеджера по Тесту подсветите тест и расширьте раздел Aggregated Coverage Results. Покрытие кода составляет 100% для решения, условия и метрик MCDC. Для получения дополнительной информации смотрите Покрытие для Пользовательского Кода C/C++ в Моделях Simulink (Simulink Coverage).

Очистка

Очистите результаты, закройте открытые окна и близкие модели.

close_system(mdl, 0);
clear mdl;
sltest.testmanager.clear;
sltest.testmanager.clearResults;
close(proj);
sltest.testmanager.close;
Simulink.sdi.close;