Модульное тестирование / непрерывная интеграция с Simulink / Stateflow - PullRequest
20 голосов
/ 07 сентября 2011

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

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

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

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

Ответы [ 8 ]

7 голосов
/ 28 апреля 2014

Как упомянул Крейг, в ​​MATLAB действительно есть фреймворк, введенный в R2013a.Кроме того, эта структура добавила TAPPlugin в R2014a, который выводит Test 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;

РЕДАКТИРОВАТЬ: Я использовал эту тему в качестве first две публикации нового блога для разработчиков , запущенного в этом году

4 голосов
/ 29 сентября 2011

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

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

3 голосов
/ 07 марта 2015

С 2015 года Matlab представляет новое название продукта «Simulink Test».Возможно, это упростит этот беспорядок.

http://www.mathworks.com/products/simulink-test/features.html#manage-test-plans-and-test-execution

2 голосов
/ 14 января 2017

R2016b представляет интеграцию между Simulink Test и MATLAB Unit Testing Framework . Тесты, созданные с помощью Simulink Test с использованием диспетчера тестов (* .mldatx), распознаются и могут запускаться непосредственно с помощью модульного тестового модуля MATLAB, и, таким образом, вы можете генерировать результаты теста 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 в одном наборе тестов и без проблем выполнять их вместе. Например, если у вас есть каталог MYDIR с собственными модульными тестами MATLAB и Simulink Tests, вы можете сделать что-то простое, как показано ниже, чтобы выполнить оба вида тестов за один раз:

Результаты = Runtests (MYDIR)

2 голосов
/ 14 апреля 2014

Matlab (с 2013b) имеет встроенную поддержку xUnit в форме Unit Testing Framework . Я не использовал его, но так как возможно запустить Simulink из Matlab с sim(), тогда этот каркас можно использовать для тестирования ваших моделей Simulink. Ваши библиотеки и, возможно, модели будут нуждаться в оболочке для выполнения, как отметили другие авторы.

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

Чтобы инициировать ваши тесты из CI (я использую Jenkins), вы можете вызвать matlab для запуска файла .m, который запускает ваш набор тестов, этот пример сценария cmd будет вызывать 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
)

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

2 голосов
/ 26 октября 2011

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

Другое решение (более «старая школа») - поместить ваши основные блоки в библиотеку и создать маленькие модели.

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

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

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

0 голосов
/ 24 июня 2016

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

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

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

0 голосов
/ 15 февраля 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...