В этом примере показано, как протестировать выход сгенерированного кода с помощью модульных тестов MATLAB ® с Coder™ MATLAB ®.
Чтобы контролировать регрессии в функциональности кода, можно записать модульные тесты для своего кода. В MATLAB можно создать и запустить модульные тесты с помощью среды тестирования MATLAB. Чтобы протестировать код MEX и автономный код, которые вы генерируете из кода MATLAB, можно использовать те же модульные тесты, которые вы используете для тестирования кода MATLAB.
MEX-функция включает инструментирование, которые помогают вам обнаружить проблемы перед генерацией производственного кода. Выполнение модульных тестов на MEX-функцию проверяет инструментальный код в MATLAB. Сгенерированный автономный код (статическая библиотека или общая библиотека) не включает инструментирование и может включать оптимизацию, которая отсутствует в коде MEX. Чтобы запустить модульные тесты автономного кода в отдельном процессе за пределами MATLAB, используйте выполнение программы в цикле (SIL) или процессора в цикле (PIL). Чтобы использовать выполнение SIL или PIL, необходимо иметь Embedded Coder ®.
В этом примере показано, как:
Создайте модульные тесты MATLAB, которые вызывают вашу функцию MATLAB. Этот пример использует модульные тесты , основанный на классах.
Сгенерируйте MEX-функцию из функции MATLAB.
Запустите модульные тесты на MEX-функцию.
Запустите модульные тесты на автономном коде с помощью SIL.
Чтобы получить доступ к файлам, которые использует этот пример, нажмите Open Script.
addOne.m
Пример выполняет модульные тесты на MEX-функцию, сгенерированной функцией MATLAB addOne
. Эта функция добавляет 1 к своему входному параметру.
function y = addOne(x) % Copyright 2014 - 2016 The MathWorks, Inc. %#codegen y = x + 1; end
TestAddOne.m
Файл TestAddOne.m
содержит основанный на классах модульный тест с двумя тестами.
reallyAddsOne
проверяет, что, когда вход равен 1, ответ равен 2.
addsFraction
проверяет, что, когда вход pi, ответ pi + 1.
Для получения дополнительной информации о записи модульных тестов на основе классов, см. Создание модульных тестов на основе классов в MATLAB.
classdef TestAddOne < matlab.unittest.TestCase % Copyright 2014 - 2016 The MathWorks, Inc. methods ( Test ) function reallyAddsOne( testCase ) x = 1; y = addOne( x ); testCase.verifyEqual( y, 2 ); end function addsFraction( testCase ) x = pi; y = addOne( x ); testCase.verifyEqual( y, x+1 ); end end end
run_unit_tests.m
Файл run_unit_tests.m
вызывает runtests
чтобы запустить тесты в TestAddOne.m
.
% Run unit tests % Copyright 2014 - 2016 The MathWorks, Inc. runtests('TestAddOne')
Чтобы открыть приложение MATLAB Coder, на вкладке MATLAB Toolstrip Apps, в разделе Генерация кода, щелкните значок приложения MATLAB Coder.
Чтобы подготовиться к генерации кода, пройдите по шагам приложения.
На странице Select Source Files задайте, что функция точки входа addOne
.
На странице Define Input Types задайте, что входной параметр x
является двойным скаляром.
На шаге Проверка проблем во время выполнения введите код, который вызывает addOne
с демонстрационным входом. Для примера, addOne(2)
. Выполните этот шаг, чтобы убедиться, что вы можете сгенерировать код для функции MATLAB и что сгенерированный код не имеет проблем во время выполнения.
Для более сложных функций MATLAB может потребоваться предоставить тестовый файл для шагов Define Input Types и Check for Run-Time Issues. Этот тестовый файл вызывает функцию MATLAB с репрезентативными типами. Приложение использует этот файл, чтобы определить типы входа для вас. Тестовый файл может отличаться от тестового файла, который вы используете для модульного тестирования.
Чтобы сгенерировать MEX-функцию, на странице Generate Code:
Для типа сборки задайте MEX
.
Щелкните Сгенерировать (Generate).
Запустите модульные тесты на сгенерированном MEX.
Нажмите «Проверить код».
В поле для тестового файла задайте run_unit_tests
.
Убедитесь, что для параметра «Выполнить с использованием» задано значение «Сгенерированный код».
Щелкните Выполнить сгенерированный код.
Приложение отображает выход теста на вкладке Test Output. Модульные тесты проходят.
Изменение addOne
так что константа 1 является одинарной точностью. Редактирование addOne
, в верхнем левом углу приложения, в разделе Исходный код, нажмите addOne
.
Чтобы сгенерировать MEX-функцию для измененной функции, нажмите Generate.
Чтобы запустить модульные тесты:
Нажмите «Проверить код».
Убедитесь, что вы установили тестовый файл на run_unit_tests
и Запуск с использованием в сгенерированный код
Щелкните Выполнить сгенерированный код.
Модульные тесты не пройдены.
reallyAddsOne
сбой, поскольку класс выходного типа является single, а не double.
addsFraction
сбой, поскольку выходные класс и значение не совпадают с ожидаемыми классом и значением. Тип выхода одинарный, а не двойной. Значение выхода с одной точностью 4.1415930 не совпадает со значением выхода с двойной точностью, 4.141592653589793.
Если у вас есть Embedded Coder, можно запустить тесты модулей при сгенерированном автономном коде (статическая библиотека или общая библиотека) с помощью выполнения ПО в цикле (SIL).
Сгенерируйте библиотеку для addOne
. Например, сгенерируйте статическую библиотеку.
На странице Генерация кода:
Для типа сборки задайте Static Library
.
Щелкните Сгенерировать (Generate).
Запустите модульные тесты на сгенерированном коде.
Нажмите «Проверить код».
В поле для тестового файла задайте run_unit_tests
.
Убедитесь, что для параметра «Выполнить с использованием» задано значение «Сгенерированный код».
Щелкните Выполнить сгенерированный код.
Чтобы завершить выполнение SIL, нажмите кнопку Остановить проверку SIL.
Если вы используете рабочий процесс командной строки для генерации кода, можно запустить модульные тесты на MEX-функцию при помощи coder.runTest
с тестовым файлом, который запускает модульные тесты.
Сгенерируйте MEX-функцию для функции, которую вы хотите протестировать. В данном примере задайте, что входной параметр является двойным скаляром, задав значение входа выборки.
codegen addOne -args {2}
Code generation successful.
Запустите модули тесты на MEX-функцию. Укажите, что тестовый файл run_unit_tests
и что функция addOne
. Когда coder.runTest
запускает тестовый файл, он заменяет вызовы на addOne
с вызовами в addOne_mex
. Модульные тесты выполняются на MEX-функции вместо исходной функции MATLAB.
coder.runTest('run_unit_tests', 'addOne')
Running TestAddOne .. Done TestAddOne __________ ans = 1x2 TestResult array with properties: Name Passed Failed Incomplete Duration Details Totals: 2 Passed, 0 Failed, 0 Incomplete. 0.042913 seconds testing time.
Если у вас есть Embedded Coder, можно запустить тесты модулей при сгенерированном автономном коде (статическая библиотека или общая библиотека) с помощью выполнения ПО в цикле (SIL).
Создайте coder.EmbeddedCodeConfig
объект для статической библиотеки.
cfg = coder.config('lib');
Сконфигурируйте объект для SIL.
cfg.VerificationMode = 'SIL';
Сгенерируйте код для функции MATLAB и интерфейса SIL.
codegen -config cfg -args {2} addOne
Запустите тестовый файл, который запускает модульные тесты с интерфейсом SIL.
coder.runTest('run_unit_tests', ['addOne_sil.', mexext])
Завершает выполнение SIL.
Нажмите кнопку clear addOne_sil.