Подтвердить что ты не робот

Модульное тестирование/непрерывная интеграция с Simulink/Stateflow

Как я могу выполнить модульное тестирование в Simulink или, предпочтительно, Stateflow?

Я поклонник гибких программных методов, включая разработку, основанную на тестах. Я отвечаю за разработку программного обеспечения для критического управления безопасностью, и мы используем Matlab/Simulink/Stateflow для его разработки. Этот набор инструментов выбирается из-за связи с заводскими (аппаратными) моделями. (модель-в-петле, аппаратно-в-петле)

Я нашел несколько ссылок на Stackoverflow: Рамка модульного тестирования для MATLAB: xunit, slunit и doctest.

  • Есть ли у кого-нибудь опыт использования этих или разных фреймворков unit test?
  • Как связать это с системами непрерывной интеграции (т.е. Хадсон)?
4b9b3361

Ответ 1

Как упоминал Крейг, в ​​MATLAB действительно существует структура, введенная в R2013a. Кроме того, эта структура добавила TAPPlugin в R2014a, который выводит Тест Anything Protocal. Используя этот протокол, вы можете настроить свою сборку CI с помощью TAPPlugin (например, Jenkins, TeamCity), чтобы система CI могла сбой сборки, если тесты завершились с ошибкой.

Ваша сборка CI может выглядеть как команда оболочки для запуска MATLAB и запуска всех ваших тестов:

/your/path/to/matlab/bin/matlab -nosplash -nodisplay -nodesktop -r "runAllMyTests"

Затем runAllMyTests создает набор для запуска и запускает его с перенаправлением выходного потока в файл. Здесь вам нужно настроить особенности, но, возможно, это поможет вам начать:

function runAllMyTests

import matlab.unittest.TestSuite;
import matlab.unittest.TestRunner;
import matlab.unittest.plugins.TAPPlugin;
import matlab.unittest.plugins.ToFile;

try
    % Create the suite and runner
    suite = TestSuite.fromPackage('packageThatContainsTests', 'IncludingSubpackages', true);
    runner = TestRunner.withTextOutput;

    % Add the TAPPlugin directed to a file in the Jenkins workspace
    tapFile = fullfile(getenv('WORKSPACE'), 'testResults.tap');
    runner.addPlugin(TAPPlugin.producingOriginalFormat(ToFile(tapFile)));

    runner.run(suite); 
catch e;
    disp(e.getReport);
    exit(1);
end;
exit force;

EDIT: Я использовал эту тему как сначала два сообщения нового блога, ориентированного на разработчиков, запущенного в этом году

Ответ 2

Модульное тестирование Simulink не является простым, к сожалению. Mathworks имеет SystemTest. В качестве альтернативы вы можете использовать собственную платформу тестирования Simulink, которая является подходом, который мы соблюдали, и не слишком сложным, но вам может потребоваться программно разработать тестовые жгуты.

Чтобы интегрироваться с CI, вам нужно создать функцию / script, которая выполняет все тесты, тогда вы можете использовать параметры командной строки для MATLAB.exe для запуска script при запуске. Я не уверен, что у кого-то есть хороший способ интегрировать тестовые отчеты с программным обеспечением CI. Просто просмотрите количество комментариев в Структуру модульного тестирования для MATLAB.

Ответ 4

Если ваша система сложна, ее следует разложить с помощью Reference Model и проверить каждый из них независимо.

Другое решение (более "старая школа" ) состоит в том, чтобы разместить ваши основные блоки в библиотеке и создать небольшие модели.

Чтобы протестировать эти подмодули и особенно те, у которых есть машина состояний (Stateflow), лучше всего создать временные тестовые примеры с блоком Signal builder. У вас есть мощная функция signalbuilder, чтобы взаимодействовать с этим блоком и загружать тестовые примеры. Мой метод состоит в том, чтобы получить для каждого случая каждой подмодели входной файл и выходной файл. Ваши выходы модели - это "правильный" выход и один из блоков. Модель работает с sim (без внешних входов), а 2 выхода сравниваются с script указанным, какой сигнал отличается (и когда).

Вы можете использовать существующую систему, но я предпочитаю использовать свой собственный для запуска каждого случая (или некоторых из них).

У меня нет общего кода для этого, кроме того, как я использую. Я не использую СНГ, поэтому не могу ответить на вторую часть вашего вопроса.

Ответ 5

Matlab (начиная с 2013 года) имеет встроенную поддержку xUnit в виде Единичная система тестирования. Я не использовал его, но поскольку можно запустить simulink из Matlab с помощью sim(), тогда эта структура может быть использована для тестирования ваших моделей simulink. Библиотекам и, возможно, моделям понадобится оболочка для ее выполнения, как отмечали другие ответчики.

На сайте Mathworks есть много примеров, к сожалению, не из них запускаются модели simulink. Я бы привел пример для вас, но у меня нет ML2013b: - (

Чтобы начать тесты с CI (я использую Jenkins), вы можете вызвать Matlab для запуска файла .m, который запускает ваш тестовый набор, этот пример cmd script вызовет Run_Tests.m из Matlab:

IF EXIST "C:\Program Files (x86)\MATLAB\R2013b\bin\win32\matlab.exe" (
    REM WinXP
    "C:\Program Files (x86)\MATLAB\R2013b\bin\win32\matlab.exe" -r "Run_Tests;exit" -logfile matlab.log
) ELSE (
    REM Win7
    "C:\Program Files\MATLAB\R2013b\bin\win32\matlab.exe" -r "Run_Tests;exit" -logfile matlab.log
)

Обратите внимание, что если a startup.m exists in the directory that you call Matlab from, then it'll be executed automatically before Run_Tests.m`.

Ответ 6

R2016b вводит интеграцию между Simulink Test и Структура тестирования модулей MATLAB. Тесты, созданные с помощью Simulink Test с помощью Test Manager (*.mldatx), распознаются и могут запускаться изначально с помощью MATLAB Unit Test Runner, и поэтому вы можете создавать результаты теста XML в стиле JUnit или результаты теста TAP, облегчающие непрерывные рабочие процессы интеграции.

См. эту ссылку для получения дополнительной информации: https://www.mathworks.com/help/sltest/ug/run-test-files-using-matlab-unit-test.html?s_tid=gn_loc_drop

В документации показан пример создания результатов TAP с использованием matlab.unittest.plugins.TAPPlugin, но вы можете использовать XMLPlugin (https://www.mathworks.com/help/matlab/ref/matlab.unittest.plugins.xmlplugin-class.html) вместо этого так же легко.

Это должно открыть лучшую интеграцию только в среде MATLAB, даже без CI на картинке, с возможностью совместного использования тестов MATLAB и Simulink Tests в одном наборе тестов и обеспечения их бесперебойной работы. Например, если у вас есть каталог MYDIR как с собственными модульными тестами MATLAB, так и с Simulink Tests, вы можете сделать что-то простое, как показано ниже, для выполнения обоих видов тестов одним выстрелом:

results = runtests (MYDIR)

Ответ 7

Я думаю, что вы ищете что-то вроде EZTEST. Он предназначен для вашей специальной цели: разработка тестового процесса для Simulink и Stateflow на уровне единицы. В отношении критически важного программного обеспечения безопасности также содержится руководство по безопасности, в котором описывается, что рассматривается в отношении ISO 26262.

Изменить: Я разработчик этого программного обеспечения, поэтому мое мнение может быть предвзятым. Но я не участвую в маркетинге или продаже продукта. Я просто размещаю это, потому что знаю, что в нем нет практически никаких unit test фреймворков, удовлетворяющих потребности исследователя (как можно предположить ответы).

Поддерживаются также тестирующие устройства с использованием SIL и PIL. К сожалению, я не знаком с Хадсоном, поэтому я не могу решить эту часть вопроса.

Ответ 8

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

Кроме того, я видел пользовательские решения с скриптами Matlab и таблицами Excel, которые были легкими, но также сложными с точки зрения понятности и ремонтопригодности. Я бы по-прежнему не рекомендовал использовать какой-либо из этих подходов, по крайней мере, не для модульного тестирования.

В конце концов, мы закончили использование рамки тестирования модуля C (CUnit), проверяя сгенерированный код. Хотя это определенно имеет тот недостаток, что вам нужно генерировать код перед тестированием, он также имеет множество преимуществ, таких как простая интеграция в системах CI, высокая гибкость написания модульных тестов, быстрое выполнение модульных тестов и, наконец, не менее возможностей рефакторинга с точки зрения перехода от Simulink к другой среде на основе модели или к рукописному коду. Тем более, что последний пункт не следует недооценивать, так как я видел много моделей Simulink, которые должны были быть рукописными модулями в первую очередь. В настоящее время я рекомендую использовать GoogleTest вместо CUnit.