Этот пример показывает, как протестировать вывод сгенерированного кода при помощи модульных тестов MATLAB® с MATLAB® Coder™.
Чтобы контролировать для регрессий в функциональности кода, можно записать модульные тесты на код. В 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
проверяет, что, когда вход является пи, ответ является пи + 1.
Для получения дополнительной информации о записи основанных модульных тестов класса, смотрите Создание модульных тестов на основе классов в MATLAB (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 Типов и Проверку на шаги Проблем Во время выполнения. Этот тестовый файл вызывает функцию MATLAB с представительными типами. Приложение использует этот файл, чтобы определить входные типы для вас. Тестовый файл может отличаться от тестового файла, который вы используете для модульного тестирования.
Сгенерировать MEX-функцию, на Сгенерировать Кодовой странице:
Для типа Сборки задайте MEX
.
Нажмите Generate.
Запустите модульные тесты на сгенерированном MEX.
Нажмите Verify Code.
В поле для тестового файла задайте run_unit_tests
.
Убедитесь, что вы устанавливаете использование Выполнения на Сгенерированный код.
Нажмите Run Generated Code.
Отображения приложения тест выводятся на вкладке Test Output. Передача модульных тестов.
Измените addOne
так, чтобы постоянный 1 был с одинарной точностью. Чтобы отредактировать addOne
, в верхнем левом углу приложения, в соответствии с Исходным кодом, нажимают addOne
.
Чтобы сгенерировать MEX-функцию для измененной функции, нажмите Generate.
Запускать модульные тесты:
Нажмите Verify Code.
Убедитесь, что вы устанавливаете тестовый файл на run_unit_tests
и использование Выполнения к Сгенерированному коду
Нажмите Run Generated Code.
Сбой модульных тестов.
reallyAddsOne
перестал работать, потому что класс выходного типа является одним, не дважды.
addsFraction
перестал работать, потому что выходной класс и значение не совпадают с ожидаемым классом и значением. Выходной тип является одним, не дважды. Значение вывода с одинарной точностью, 4.1415930, не является тем же самым как значением вывода с двойной точностью, 4.141592653589793.
Если у вас есть Embedded Coder, можно запустить модульные тесты на сгенерированном автономном коде (статическая библиотека или совместно использованная библиотека) при помощи программного обеспечения в цикле (SIL) выполнение.
Сгенерируйте библиотеку для addOne
. Например, сгенерируйте статическую библиотеку.
На Сгенерировать Кодовой странице:
Для типа Сборки задайте Static Library
.
Нажмите Generate.
Запустите модульные тесты на сгенерированном коде.
Нажмите Verify Code.
В поле для тестового файла задайте run_unit_tests
.
Убедитесь, что вы устанавливаете использование Выполнения на Сгенерированный код.
Нажмите Run Generated Code.
Чтобы отключить выполнение SIL, нажмите Stop SIL Verification.
Если вы используете рабочий процесс командной строки, чтобы сгенерировать код, можно запустить модульные тесты на MEX-функции при помощи coder.runTest
с тестовым файлом, который запускает модульные тесты.
Сгенерируйте MEX-функцию для функции, которую вы хотите протестировать. В данном примере укажите, что входной параметр является двойным скаляром путем обеспечения демонстрационного входного значения.
codegen addOne -args {2}
Запустите модульные тесты на 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.03553 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.
Кликните по ясному addOne_sil.