Проведите модульное тестирование на импортированном пользовательском коде Используя команды API

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

Контроллер теплового насоса файлы пользовательского кода

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

Исходные файлы находятся в 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 функция:

Температурное условиеСистемное состояние Команда вентилятораНакачайте командуНакачайте направление|Troom_\in - Tset | < DeltaT_вентиляторIdle00IDLEDelatT_вентилятор <= |Troom_\in - Tset | < DeltaT_насосFan only10IDLE|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 файл.

Импортируйте контроллер теплового насоса код и автоматически создайте тупики

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

Настройте CodeImporter Объект

Создайте экземпляр CodeImporter объект для контроллера теплового насоса пользовательский код. Установка OutputFolder свойство к $pwd$ оценивает строку, промежуточную символы $ как выражение MATLAB. Установите OutputFolder к $pwd$ задавать текущую папку как выходную папку. Установите SourceFiles свойство к tempController.c файл в src директория. Используйте символы $, чтобы задать расположение файла для CustomCode свойство, также.

obj = sltest.CodeImporter('heatpumpController');

obj.OutputFolder = "$pwd$";

obj.CustomCode.SourceFiles = "$fullfile('src','tempController.c')$";
obj.CustomCode.IncludePaths = fullfile('include');
obj.CustomCode.GlobalVariableInterface = true;

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

Сконфигурируйте CodeImporter объект с желаемым тестовым типом и настройками песочницы.

Создать тестовую песочницу для заданного heatpumpController функция в пользовательском коде, набор TestType свойство UnitTest. В данном примере используйте GenerateAggregatedHeader поиграйте в песочнице режим. Для получения информации о различных режимах песочницы смотрите sltest.CodeImporter.SandboxSettings.

Установка SandboxSettings.CopySourceFiles к true копирует заданный исходный файл в тестовую песочницу.

Обратите внимание на то, что можно использовать GenerateAggregatedHeader поиграйте в песочнице режим только с одним исходным файлом.

obj.TestType = "UnitTest";

obj.SandboxSettings.Mode = "GenerateAggregatedHeader";
obj.SandboxSettings.CopySourceFiles = true;

Создайте песочницу. Эта тестовая песочница изолируется от исходной библиотеки пользовательского кода. Установка Overwrite к on перезаписывает существующий тест sandox, если вы существуете. По умолчанию, Overwrite off.

obj.createSandbox('Overwrite','on'); 

createSandbox метод создает heatpumpController_sandbox директория в заданной выходной папке, которая в этом примере является текущей рабочей папкой.

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

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

  • include: Эта директория содержит необходимое, включают файлы, чтобы скомпилировать tempController.c в песочнице src директория. Эта директория также содержит aggregatedHeader.h файл, который содержит все необходимые символы, чтобы скомпилировать tempController.c.

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

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

Импортируйте тестовую песочницу

Импортируйте код песочницы в Simulink.

obj.import('Functions','heatpumpController');

import функция создает песочницу. Это также создает библиотеку, которая содержит блок C Caller под названием heatpumpController, который содержит внутреннюю тестовую обвязку, которую можно использовать, чтобы выполнить модульное тестирование на heatpumpController. Библиотека присоединена к Словарю Данных Simulink, который задает pump_control_bus и PumpDirection как Simulink.Bus возразите и Simulink enumertion сигнал, соответственно.

Блок C Caller присоединяется с внутренней тестовой обвязкой для модульного тестирования heatpumpController функция.

Порты ввода и вывода на блоке вызывающей стороны C

Поскольку вы устанавливаете CustomCode.GlobalVariableInterface к true перед импортом, import функция создает тупики для absoluteTempDifference и pumpDirection глобальные переменные в auto_stub.c и создает порты для них. Для получения информации смотрите, Включают глобальные переменные, когда функция взаимодействует через интерфейс.

Это - блок C Caller, heatpumpController, сгенерированный от heatpumpController функция:

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

/*************************************************************************/
/* 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.

Чтобы использовать тестовую обвязку, созданную с помощью автоматически созданных тупиков, обратитесь к следующей фигуре. Добавьте шины для вводов и выводов. Чтобы позволить соединить Сигнал Simulink для симуляции, соедините входные параметры для Tset, Troom_in и ожидаемые выходные параметры от глобальных переменных, SLStubOut_absoluteTempDifference и SLStubOut_pumpDirection Аналогично, соедините выходные параметры как показано на рисунке. Можно использовать вводы и выводы, чтобы наблюдать внутренние значения, переданные heatpumpController к absoluteTempDifference и pumpDirecton подвызовы функции.

Изменение автоматически созданные тупики к ручным тупикам

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

Вручную измените автоматически сгенерированную интерфейсную функцию

Можно вручную предоставить определения для автоматически сгенерированных интерфейсных функций путем обновления man_stub.c и man_stub.h файлы в manualstub директория.

manualstubpath = fullfile([obj.LibraryFileName.char '_sandbox'],'manualstub');
helperFunctionToUpdateManualStubs(manualstubpath);

helperFunctionToUpdateManualStubs функционируйте обновляет ручные тупиковые файлы в тестовой песочнице.

Обновленное функциональное определение 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;
}

Обновите существующую тестовую песочницу

Чтобы использовать ручные интерфейсные функции, обновите песочницу, чтобы отразить ваши изменения. Установка Overwrite опция к off сохраняет изменения, внесенные в manualstub директория в тестовой песочнице.

obj.createSandbox('Overwrite','off');

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

Импортируйте обновленную тестовую песочницу

После обновления тестовой песочницы импортируйте код песочницы в Simulink.

obj.import('Functions','heatpumpController');

Библиотека содержит блок C Caller под названием heatpumpController с обновленными портами и внутренней тестовой обвязкой, присоединенной к блоку C Caller, также обновляется.

Функция импорта обновляет существующую библиотеку и импортирует heatpumpController функция. Как то, когда вы использовали автоматически сгенерированные тупики, библиотека присоединена к Словарю Данных Simulink, который задает pump_control_bus и PumpDirection как Simulink.Bus возразите и Simulink enumertion сигнал, соответственно.

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

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

| | | | | | |

Похожие темы