Проведите модульное тестирование на импортированном пользовательском коде при помощи мастера

В этом примере показано, как использовать мастер Средства импорта Кода, чтобы импортировать пользовательский код С для контроллера теплового насоса в 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

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

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

ТемператураСистемаВентиляторНасосНасосУсловиеСостояниеКомандаКомандаНаправление|Troom_\in - Tset | < DeltaT_вентиляторIdle00IDLEDelatT_вентилятор <= |Troom_\in - Tset | < DeltaT_насосFan только10IDLE|Troom_\in - Tset | >= DeltaT_насос и Tset < Troom_\inCooling11COOLING|Troom_\in - Tset | >= DeltaT_насос и Tset > Troom_\inHeating11HEATING

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

Температура УсловиеНасос НаправлениеTset < Troom_\inCOOLINGTset > Troom_\inHEATING

PumpDirection перечислимый type задан в controllerTypes.h файл.

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

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

sltest.testmanager.view

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

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

Мастер открывает и отображает вкладку Welcome. Нажмите Start, чтобы начать процесс импорта.

На вкладке Settings:

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

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

  3. Выберите C Code Unit Testing как метод тестирования.

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

Нажать Далее.

Задайте пользовательский код, чтобы импортировать

На вкладке Specify Custom Code:

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

  2. В директориях Include задайте директории, от которых зависят заданные исходные файлы. Введите .\include.

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

Нажать Далее.

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

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

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

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

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

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

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

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

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

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

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

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

Когда песочница создается, отображения на экране подтверждения.

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

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

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

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

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

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

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

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

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

Нажать Далее.

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

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

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

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

Нажать Далее.

Выберите Functions to Import

На странице Import выберите heatpumpController функционируйте, чтобы импортировать в Библиотеку Simulink.

Нажать Далее.

Установите технические требования порта блока

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

В этом примере таблица спецификации порта приводит формальные аргументы, Tset, Troom_in, и out, для heatpumpController функция, и еще шесть от автоматически сгенерированных заглушек. Поскольку вы выбрали глобальные переменные Enable как функциональный интерфейс, мастер создает порты, которые сгенерированы от заглушек для 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, содержащий эти типы, и соединяет словарь со сгенерированной библиотекой.

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

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

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

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

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

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

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

На странице Code Import Successful кликните по Изменению папка MATLAB к выходной папке.

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

Обновите тестовую песочницу с ручным блокированием

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

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

За пределами мастера, но отъезда открытого мастера, копируют файлы в 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;
}

Возвратитесь к мастеру Средства импорта Кода.

После изменения ручных тупиковых файлов возвратитесь к мастеру и нажмите Update Sandbox.

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

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

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

Нажать Далее.

На вкладке Create Simulink Library выберите Overwrite.

Нажмите Далее через остающиеся страницы, пока вы не достигнете страницы Code Import Successful.

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

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

В менеджере по Тесту, в Тестовой панели Браузера расширяют heatpumpController тестовый файл и heatpumpController/heatpumpController тестовый набор. Затем выберите heatpumpController_Harness1 тест.

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

В Системе Под Экспериментальным участком расширьте раздел Simulation Setting и Release Overrides и установите Время остановки на 200.

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

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

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

При Входном Отображении выберите Block Name как Режим отображения и нажимают Map Inputs. После того, как входные параметры появляются в таблице Mapping Status, нажимают ОК.

Добавьте оценки

В разделе Logical и Temporal Assessments добавьте оценки для каждого температурного условия:

Для получения информации об оценках смотрите, Оценивают Временную Логику при помощи Временных Оценок.

В панели Символов добавьте определения символов:

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

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

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

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

Похожие темы