Модульное тестирование/непрерывная интеграция с Simulink/Stateflow
Как я могу выполнить модульное тестирование в Simulink или, предпочтительно, Stateflow?
Я поклонник гибких программных методов, включая разработку, основанную на тестах. Я отвечаю за разработку программного обеспечения для критического управления безопасностью, и мы используем Matlab/Simulink/Stateflow для его разработки. Этот набор инструментов выбирается из-за связи с заводскими (аппаратными) моделями. (модель-в-петле, аппаратно-в-петле)
Я нашел несколько ссылок на Stackoverflow: Рамка модульного тестирования для MATLAB: xunit, slunit и doctest.
- Есть ли у кого-нибудь опыт использования этих или разных фреймворков unit test?
- Как связать это с системами непрерывной интеграции (т.е. Хадсон)?
Ответы
Ответ 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.
Ответ 3
С 2015a Matlab представляет новое название продукта "Simulink Test". Возможно, это упростит этот беспорядок.
http://www.mathworks.com/products/simulink-test/features.html#manage-test-plans-and-test-execution
Ответ 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.