Сгенерированный код модульного теста с MATLAB Coder

В этом примере показано, как протестировать выход сгенерированного кода при помощи модульных тестов MATLAB® с MATLAB® Coder™.

Чтобы контролировать для регрессий в функциональности кода, можно записать модульные тесты на код. В MATLAB можно создать и запустить модульные тесты при помощи среды тестирования MATLAB. Чтобы протестировать код MEX и автономный код, который вы генерируете из кода MATLAB, можно использовать те же модульные тесты, которые вы используете, чтобы протестировать код MATLAB.

MEX-функция включает инструментирование, которое помогает вам обнаружить проблемы, прежде чем вы сгенерируете производственный код. Рабочие модульные тесты на MEX-функции тестируют оснащенный код в MATLAB. Сгенерированный автономный код (статическая библиотека или совместно использованная библиотека) не включает инструментирование и может включать оптимизацию, которая не присутствует в коде MEX. Чтобы запустить модульные тесты на автономном коде в отдельном процессе за пределами MATLAB, используйте программное обеспечение в цикле (SIL) или процессор в цикле (PIL) выполнение. Чтобы использовать SIL или выполнение PIL, у вас должен быть Embedded Coder®.

В этом примере показано, как к:

  1. Создайте модульные тесты MATLAB, которые вызывают вашу функцию MATLAB. Этот пример использует модульные тесты, основанные на классах.

  2. Сгенерируйте MEX-функцию от своей функции MATLAB.

  3. Запустите модульные тесты на MEX-функции.

  4. Запустите модульные тесты на автономном коде при помощи 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.

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')

Запустите модульные тесты на MEX-функции с приложением MATLAB Coder

Чтобы открыть приложение MATLAB Coder, на вкладке MATLAB Toolstrip Apps, под Генерацией кода, кликают по значку приложения MATLAB Coder.

Чтобы подготовиться к генерации кода, совершенствуйтесь через шаги приложения.

  • На странице Select Source Files укажите, что функцией точки входа является addOne.

  • На странице Define Input Types укажите что входной параметр x двойной скаляр.

  • На Проверке на шаг Проблем Во время выполнения введите код, который вызывает addOne с представительным входом. Например, addOne(2). Выполните этот шаг, чтобы убедиться, что можно сгенерировать код для функции MATLAB и что сгенерированный код не имеет проблем во время выполнения.

Для более сложных функций MATLAB вы можете хотеть обеспечить тестовый файл для Входных Define Типов и Проверку на шаги Проблем Во время выполнения. Этот тестовый файл вызывает функцию MATLAB с представительными типами. Приложение использует этот файл, чтобы определить входные типы для вас. Тестовый файл может отличаться от тестового файла, который вы используете для модульного тестирования.

Сгенерировать MEX-функцию, на Сгенерировать Кодовой странице:

  1. Для типа Сборки задайте MEX.

  2. Нажмите Generate.

Запустите модульные тесты на сгенерированном MEX.

  1. Нажмите Verify Code.

  2. В поле для тестового файла задайте run_unit_tests.

  3. Убедитесь, что вы устанавливаете использование Запуска на Сгенерированный код.

  4. Нажмите Run Generated Code.

Отображения приложения тест выводятся на вкладке Test Output. Передача модульных тестов.

Запустите модульные тесты после изменения кода MATLAB

Измените addOne так, чтобы постоянный 1 был с одинарной точностью. Отредактировать addOne, в верхнем левом углу приложения, в соответствии с Исходным кодом, нажимают addOne.

Чтобы сгенерировать MEX-функцию для модифицированной функции, нажмите Generate.

Запускать модульные тесты:

  1. Нажмите Verify Code.

  2. Убедитесь, что вы устанавливаете тестовый файл на run_unit_tests и использование Запуска к Сгенерированному коду

  3. Нажмите Run Generated Code.

Сбой модульных тестов.

  • reallyAddsOne сбои, потому что класс выходного типа является одним, не дважды.

  • addsFraction сбои, потому что выходной класс и значение не совпадают с ожидаемым классом и значением. Выходной тип является одним, не дважды. Значение выхода с одинарной точностью, 4.1415930, различное как значение выхода с двойной точностью, 4.141592653589793.

Запуститесь программное обеспечение Unit Tests With в выполнении цикла в приложении (требует Embedded Coder),

Если у вас есть Embedded Coder, можно запустить модульные тесты на сгенерированном автономном коде (статическая библиотека или совместно использованная библиотека) при помощи программного обеспечения в цикле (SIL) выполнение.

Сгенерируйте библиотеку для addOne. Например, сгенерируйте статическую библиотеку.

На Сгенерировать Кодовой странице:

  1. Для типа Сборки задайте Static Library.

  2. Нажмите Generate.

Запустите модульные тесты на сгенерированном коде.

  1. Нажмите Verify Code.

  2. В поле для тестового файла задайте run_unit_tests.

  3. Убедитесь, что вы устанавливаете использование Запуска на Сгенерированный код.

  4. Нажмите Run Generated Code.

Чтобы отключить выполнение SIL, нажмите Stop SIL Verification.

Запустите модульные тесты на MEX-функции при помощи рабочего процесса командной строки

Если вы используете рабочий процесс командной строки, чтобы сгенерировать код, можно запустить модульные тесты на 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.047301 seconds testing time.

Запуститесь программное обеспечение Unit Tests With в выполнении цикла в командной строке (требует Embedded Coder),

Если у вас есть 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.

Смотрите также

Похожие темы