exponenta event banner

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

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

Для отслеживания регрессий в функциональных возможностях кода можно записать единичные тесты для кода. В 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.

Проверка файлов

Чтобы получить доступ к файлам, используемым в этом примере, щелкните Открыть сценарий.

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

Выполнение модульных тестов для функции MEX с приложением кодера MATLAB

Чтобы открыть приложение MATLAB Coder, на вкладке MATLAB Toolstrip Apps в разделе Code Generation щелкните значок приложения MATLAB Coder.

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

  • На странице «Выбор исходных файлов» укажите, что функцией точки входа является addOne.

  • На странице «Определение типов ввода» укажите, что входной аргумент x - двойной скаляр.

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

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

Для создания функции MEX на странице Generate Code выполните следующие действия.

  1. Для параметра «Тип построения» укажите MEX.

  2. Щелкните Создать (Generate).

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

  1. Щелкните Проверить код.

  2. В поле для тестового файла укажите run_unit_tests.

  3. Убедитесь, что для параметра «Выполнить с помощью» задано значение «Сгенерированный код».

  4. Щелкните Выполнить сгенерированный код.

Выходные данные теста отображаются на вкладке «Выходные данные теста». Единичные тесты проходят.

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

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

Чтобы создать функцию MEX для измененной функции, щелкните Создать (Generate).

Для выполнения модульных тестов:

  1. Щелкните Проверить код.

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

  3. Щелкните Выполнить сгенерированный код.

Тест блока завершается неуспешно.

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

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

Запуск модульных тестов с выполнением программного обеспечения в цикле в приложении (требуется встроенный кодер)

При использовании встроенного кодера можно выполнить тесты единиц измерения для созданного автономного кода (статической библиотеки или общей библиотеки) с помощью выполнения ПО в цикле (SIL).

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

На странице Создать код:

  1. Для параметра «Тип построения» укажите Static Library.

  2. Щелкните Создать (Generate).

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

  1. Щелкните Проверить код.

  2. В поле для тестового файла укажите run_unit_tests.

  3. Убедитесь, что для параметра «Выполнить с помощью» задано значение «Сгенерированный код».

  4. Щелкните Выполнить сгенерированный код.

Чтобы завершить выполнение SIL, щелкните Остановить проверку SIL.

Выполнение модульных тестов для функции 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.042913 seconds testing time.

Запуск модульных тестов с выполнением программного обеспечения в цикле в командной строке (требуется встроенный кодер)

При использовании встроенного кодера можно выполнить тесты единиц измерения для созданного автономного кода (статической библиотеки или общей библиотеки) с помощью выполнения ПО в цикле (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».

См. также

Связанные темы