Выполните модульное тестирование импортированного пользовательского кода с помощью мастера

В этом примере показано, как использовать мастер импорта кода для импорта пользовательского кода С для контроллера теплового насоса в Simulink для модульного тестирования. Модульные тесты тестируют одну или несколько функций в изоляции от библиотеки пользовательских кодов. Для модульных тестов мастер импорта кода Simulink Test генерирует тестовую песочницу и библиотеку, содержащую блок C Caller для каждой указанной функции из пользовательского кода. Для получения дополнительной информации смотрите Импорт и проверку Пользовательского кода C/C + +.

Этот пример использует только tempController.c файл для создания и импорта тестовой песочницы в Simulink. Вы используете песочницу для выполнения модульного тестирования только на heatpumpController функция в tempController.c файл, а не полный код. Генерация песочницы автоматически создает заглушки для служебных функций, используемых heatpumpController функция, absoluteTempDifference и pumpDirection. Поскольку служебные функции не определены в tempController.c файл и utilities.c файл не включен, импортер кода создает заглушки, поэтому код не ошибается.

Пользовательский код контроллера теплового насоса

Полный код для контроллера теплового насоса находится в следующих файлах источника кода С и заголовках:

Исходные файлы находятся в src директория:

  • tempController.c

  • utils.c

Заголовочные файлы находятся в include директория:

  • tempController.h

  • utils.h

  • controllerTypes.h

The tempController.c файл содержит алгоритм для пользовательского кода С для модуля теплового насоса. The heatpumpController функция в этом файле использует комнатную температуру (Troom_in) и заданную температуру (Tset) как входы. Выходные выходы pump_control_bus тип структуры с сигналами, которые управляют вентилятором, тепловым насосом и направлением теплового насоса (тепло или охлаждение). Поля в pump_control_bus структура fan_cmd, pump_cmd, и pump_dir. The pump_control_bus тип структуры определяется в controllerTypes.h файл. Выходные выходы heatpumpController функция является:

Выходные выходы heatpumpController алгоритм суммирован в следующей таблице:

Температурное условиеСостояние системы  Команда вентилятора Команда насоса Направление насоса|Troom_в - Tset| < DeltaT_поклонникIdle00IDLEDelatT_вентилятор < = |Troom_в - Tset| < DeltaT_насосFan only10IDLE|Troom_в - Tset| > = DeltaT_насос и Tset < Troom_вCooling11COOLING|Troom_в - Tset| > = DeltaT_насос и Tset > Троом_вHeating11HEATING

The heatpumpController функция использует две служебные функции, absoluteTempDifference и pumpDirection, которые определены в utils.c файл. The absoluteTempDifference функция возвращает абсолютное различие между Tset и Troom_in в виде двойника. The pumpDirection функция возвращает одно из следующих PumpDirection введите значения перечисления:

Температурное условие Направление насосаTset < Троом_вCOOLINGTset > Троом_вHEATING

The PumpDirection перечисление type определяется в controllerTypes.h файл.

Откройте мастер импорта кода

Чтобы открыть мастер импорта кода Simulink Test C/C + +, сначала откройте Simulink Test Manager.

sltest.testmanager.view

Затем выберите New > Test для кода C/C + +.

Задайте библиотеку Simulink и метод проверки

Откроется мастер и откроется вкладка Добро пожаловать. Нажмите кнопку Пуск, чтобы начать процесс импорта.

На вкладке Settings:

  1. Введите имя файла библиотеки Simulink. Сгенерированная библиотека Simulink, тестовые директории песочницы и тестовый файл (MLDATX) используют это имя. Введите heatpumpController.

  2. Укажите папку Output, в которой можно сохранить сгенерированные программные продукты. Введите имя папки с возможностью записи.

  3. Выберите Код С Модульного тестирования в качестве проверки метода.

Метод модульного тестирования кода С проверяет один файл C или подмножество вашего пользовательского кода в изоляции. Этот метод создает тестовую песочницу из указанного исходного файла или файлов и импортирует тестовую песочницу в Simulink. Поскольку тестовая песочница содержит только подмножество файлов C, мастер импорта кода автоматически создает заглушки для всех неопределенных символов, используемых в файлах C. Этот метод поддерживает тестирование только кода С Для получения информации об интеграционной проверке смотрите TestType свойство sltest.CodeImporter.

Нажмите кнопку Далее.

Укажите пользовательский код для импорта

На вкладке «Задать пользовательский код»:

  1. В Исходных файлах укажите исходный файл, содержащий функцию для импорта для модульного тестирования. Введите .\src\tempController.c.

  2. В разделе Включить каталоги укажите директории, от которых зависят указанные исходные файлы. Введите .\include.

  3. Defines задает специфические для компилятора определения. В данном примере оставьте это поле пустым.

Нажмите кнопку Далее.

Задайте настройки тестовой песочницы

На вкладке Analyze задайте настройки песочницы.

Выберите выход тестовый режим песочницы

Каждый из трех тестовых режимов песочницы имеет настройки, которые определяют, как мастер импорта кода генерирует песочницу и программные продукты песочницы.

Выберите Сгенерировать агрегированный заголовок. Этот тестовый режим песочницы генерирует минимальный агрегированный заголовочный файл для указанного исходного файла. Агрегированный файл заголовка содержит все объявления символов, используемых указанным исходным файлом.

Выберите выход настройки тестовой песочницы

Выберите только Копировать исходные файлы. Для этой опции мастер импорта кода копирует указанный исходный файл в песочницу src директория.

Для получения информации о других выходных тестовых режимах и настройках песочницы, смотрите свойства sltest.CodeImporter.SandboxSettings.

Нажмите кнопку Далее, чтобы создать тестовую песочницу с заданными настройками.

Создайте тестовую песочницу

Заданное имя файла библиотеки определяет имя сгенерированной песочницы. В данном примере имя песочницы heatpumpController_sandbox.

Этот пример использует tempController.c и выполняет модульное тестирование только на heatpumpController функция. Генерация песочницы автоматически создает заглушки для absoluteTempDifference и pumpDirection служебные функции, используемые heatpumpController function, Поскольку служебные функции не определены в tempController.c файл, заглушки препятствуют ошибке кода.

При создании песочницы отображений экран подтверждения.

Выходная папка sandbox содержит следующие подпапки:

  • src: Эта папка содержит скопированный исходный файл или файлы, который для этого примера является tempController.c.

  • include: В зависимости от тестового режима изолированной программной среды эта папка содержит либо aggregatedHeader.h или interfaceHeader.h файл. Этот пример использует aggregatedHeader.h файл. Папка также содержит и копии других заголовочных файлов, необходимых для компиляции указанного исходного файла или файлов. The aggregatedHeader.h файл содержит все объявления символов, используемых указанным исходным файлом. The interfaceHeader.h содержит объявления функций, глобальных переменных и типов, используемых указанными исходными файлами. Simulink использует сгенерированный файл заголовка интерфейса в процессе импорта.

  • autostub: Эта папка содержит auto_stub.c и auto_stub.h файлы, которые содержат автоматически сгенерированные заглушки для absoluteTempDifference и pumpDirection функции утилиты .

  • manualstub: Эта папка содержит man_stub.c и man_stub.h файлы, которые определяют любые вручную заданные заглушки. По умолчанию эти файлы не определяют никаких функций.

ПРИМЕЧАНИЕ. Не изменяйте файлы в src, include, или autosub папки сгенерированной песочницы.

После создания песочницы можно просмотреть созданные файлы:

  • Щелкните Auto stub source и Auto stub header, чтобы открыть auto_stub.c и auto_stub.h файлы, соответственно. В auto_stub.c, можно найти заглушки для служебных функций, используемых heatpumpController, absoluteTempDifference и pumpDirection. В auto_stub.h, вы можете найти extern объявления упрямых функций.

  • Щелкните Заголовок заглушки вручную и Источник заглушки вручную, чтобы открыть man_stub.h и man_stub.c файлы, соответственно. Поскольку вы выбрали Сгенерировать агрегированный заголовок для режима песочницы, песочницы man_stub.h включает в себя aggregatedHeader.h файл. По умолчанию файлы заглушки вручную не имеют никаких определений функций.

Нажмите кнопку Далее.

Задание параметров импорта

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

Когда мастер обнаруживает глобальные переменные в песочнице или пользовательском коде, у вас есть опция использовать эти переменные в качестве входных или выходных параметров для функции и портов созданного блока C Caller. Для получения дополнительной информации смотрите Включить глобальные переменные как функциональные интерфейсы.

Выберите Включить глобальные переменные как опцию функционального интерфейса.

Нажмите кнопку Далее.

Выберите функции для импорта

На странице Импорт выберите heatpumpController функция для импорта в библиотеку Simulink.

Нажмите кнопку Далее.

Установите спецификации блочного порта

Для функции, выбранной на предыдущей странице, мастер генерирует спецификацию порта функции. Выбранные порты используются для сгенерированного блока C Caller.

В этом примере таблица спецификаций портов приводит формальные аргументы, Tset, Troom_in, и out, для heatpumpController function, и еще шесть из автоматически сгенерированных заглушек. Поскольку вы выбрали Включить глобальные переменные в качестве функционального интерфейса, мастер создает порты, которые генерируются из заглушек для absoluteTempDifference и pumpDirection функций. Заглушки находятся в auto_stub.c.

Это автоматически сгенерированные глобальные переменные в auto_stub.c файл:

/*************************************************************************/
/* Generated Global Variables for Stubbed Functions Interface            */
/*************************************************************************/
double SLStubIn_absoluteTempDifference_p1;
double SLStubIn_absoluteTempDifference_p2;
double SLStubOut_absoluteTempDifference;
double SLStubIn_pumpDirection_p1;
double SLStubIn_pumpDirection_p2;
PumpDirection SLStubOut_pumpDirection;

double absoluteTempDifference(double absoluteTempDifference_p1, double absoluteTempDifference_p2)
{
  SLStubIn_absoluteTempDifference_p1 = absoluteTempDifference_p1;
  SLStubIn_absoluteTempDifference_p2 = absoluteTempDifference_p2;
  return SLStubOut_absoluteTempDifference;
}


PumpDirection pumpDirection(double pumpDirection_p1, double pumpDirection_p2)
{
  SLStubIn_pumpDirection_p1 = pumpDirection_p1;
  SLStubIn_pumpDirection_p2 = pumpDirection_p2;
  return SLStubOut_pumpDirection;
}

В автоматически сгенерированных заглушках для absoluteTempDifference, глобальные переменные SLStubIn_absoluteTempDifference_p1 и SLStubIn_absoluteTempDifference_p2 сохраните входные параметры. Функция возвращает значение, сохраненное в SLStubOut_absoluteTempDifference в качестве его выхода. Точно так же pumpDirection сохраняет входные параметры и возвращает SLStubOut_pumpDirection.

В этом примере absoluteTempDifference, SLStubIn_absoluteTempDifference_p1 и SLStubIn_absoluteTempDifference_p2 являются выходами. Глобальная переменная SLStubOut_absoluteTempDifference является входом.

Не вносите никаких изменений в спецификацию порта. Нажмите кнопку Далее.

Задайте типы для импорта

Выберите типы для импорта в Simulink. Потому что pump_control_bus и PumpDirection типы требуются функцией heatpumpController, они выбираются и затемняются. Мастер создает словарь данных Simulink, содержащий эти типы, и связывает словарь с сгенерированной библиотекой.

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

Создайте Тестовую обвязку

Выберите Автоматически создать тестовую обвязку для всех импортированных функций.

Нажмите кнопку Далее, чтобы сгенерировать библиотеку Simulink.

После импорта кода мастер создает библиотеку, присоединенную к словарю данных Simulink, который задает pump_control_bus и PumpDirection как Simulink.Bus объект и сигнал перечисления Simulink, соответственно.

Блок C Caller, созданный в библиотеке Simulink:

Щелкните в правом нижнем углу блока, чтобы открыть его внутреннюю тестовую обвязку:

На странице Успешный импорт кода щелкните Изменить папку MATLAB на выход папку.

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

Обновление тестовой песочницы с ручной заглушкой

Чтобы вручную создать файлы заглушки для absoluteTempDifference и pumpDirectionперейдите на вкладку Анализ на панели инструментов мастера и дважды нажмите кнопку Далее, чтобы отобразить эту страницу:

Импортер кода обнаруживает созданную песочницу. Выберите Перезаписать, а затем нажмите кнопку Далее.

Вне мастера, но оставив мастер открытым, скопируйте файлы в updated_manualstub директория песочницы и вставить их в heatpumpController/manualstub директория.

В man_stub.c файл, отредактируйте определение функции absoluteTempDifference:

double absoluteTempDifference(double Tset, double Troom_in){ 
    return (double)fabs(Tset - Troom_in);
}

и определение функции pumpDirection:

PumpDirection pumpDirection(double Tset, double Troom_in){
    return Tset > Troom_in ? HEATING : COOLING;
}

Вернитесь к мастеру импорта кода.

После изменения файлов заглушки вручную вернитесь в мастер и нажмите кнопку Обновить изолированную программную среду.

Потому что вы вручную определили определения для absoluteTempDifference и pumpDirection функций, нет символов, чтобы автоматически заглушить, не генерируются программные продукты для autostub директория в песочнице, и он пуст.

Нажмите кнопку Далее, пока вы не достигнете страницы спецификаций блока порта:

Потому что ручная реализация absoluteTempDifference и pumpDirection не имеет никаких глобальных переменных, в качестве портов появляются только формальные аргументы и возвращаемый аргумент.

Нажмите кнопку Далее.

На вкладке «Создание библиотеки Simulink» выберите «Перезаписать».

Нажмите кнопку Далее на остальных страницах, пока вы не достигнете страницы успешного импорта кода.

Затем нажмите Конец. При необходимости нажмите кнопку Да в открывшемся диалоговом окне, чтобы сохранить текущие параметры импорта в виде файла JSON, который используется для перезагрузки параметров в другой сеанс мастера импорта кода.

Протестируйте импортированный код

В Диспетчере тестов на панели Test Browser разверните тестовый файл heatpumpController и тестовый набор heatpumpController/heatpumpController. Затем выберите heatpumpController_Harness1 тест.

Задайте время остановки СИмуляции

В разделе «Тестируемая система» разверните раздел «Симуляция Setting and Релиза Overrides» и установите значение Времени остановки 200.

Добавление входных параметров

В разделе Inputs, в нижней части таблицы External Inputs, нажмите Add, чтобы открыть диалоговое окно Add Input.

В спецификации входного файла введите heatpumpControllerHarnessInput.xlsx.

В разделе «Вход отображений» выберите Block Name в режиме Mapping Mode и нажмите Map Inputs. После отображения входов в таблице Состояние соответствия, нажмите кнопку ОК.

Добавление оценок

В разделе «Логические и временные оценки» добавьте оценки для каждого температурного условия:

Для получения информации об оценках см. «Оценка временной логики при помощи временных оценок».

На панели «Символы» добавьте определения символов:

Запуск теста и просмотр результатов

Нажмите запуск, чтобы запустить тест.

Когда тест завершится, на панели Результаты и Программные продукты разверните раздел Результаты. Все оценки проходят.

Чтобы просмотреть результаты покрытия, выберите heatpumpController_Harness1 в разделе Результаты и разверните раздел Результаты покрытия. Покрытие составляет 100% для обоих tempController.c и man_stub.c файлы.

Похожие темы