Этот пример показывает, как создать пользовательский прибор, который устанавливает переменную окружения. До тестирования этот фиксатор сохранит текущую переменную UserName.
Создание определения класса UserNameEnvironmentVariableFixture
Применение пользовательского прибора к единственному тестовому классу
Применение пользовательского прибора как разделяемого фиксатора
Альтернативный Подход к Вызову addTeardown в Методе настройки
В файле в вашей рабочей папке создайте новый класс, UserNameEnvironmentVariableFixture, который наследовался классу matlab.unittest.fixtures.Fixture. Поскольку вы хотите передать фиксатор имя пользователя, создайте свойство UserName передать данные между методами.
classdef UserNameEnvironmentVariableFixture < ... matlab.unittest.fixtures.Fixture properties (SetAccess=private) UserName end
В блоке methods файла UserNameEnvironmentVariableFixture.m создайте метод конструктора, который подтверждает вход и задает SetupDescription. Сделайте, чтобы конструктор принял вектор символов и установил свойство UserName фиксатора.
methods
function fixture = UserNameEnvironmentVariableFixture(name)
validateattributes(name, {'char'}, {'row'}, '','UserName')
fixture.UserName = name;
fixture.SetupDescription = sprintf( ...
'Set the UserName environment variable to "%s".',...
fixture.UserName);
endПодклассы класса Fixture должны реализовать метод setup. Используйте этот метод, чтобы сохранить исходную переменную UserName. Этот метод также задает TeardownDescription и указывает задачу отключения установки UserName к исходному состоянию после тестирования.
Задайте метод setup в блоке methods файла UserNameEnvironmentVariableFixture.m.
function setup(fixture) originalUserName = getenv('UserName'); fixture.assertNotEmpty(originalUserName, ... 'An existing UserName environment variable must be defined.') fixture.addTeardown(@setenv, 'UserName', originalUserName) fixture.TeardownDescription = sprintf(... 'Restored the UserName environment variable to "%s".',... originalUserName); setenv('UserName', fixture.UserName) end end
Классы, которые выводят от Fixture, должны реализовать метод isCompatible, если конструктор конфигурируем. Поскольку можно сконфигурировать свойство UserName через конструктора, UserNameEnvironmentVariableFixture должен реализовать isCompatible.
Метод isCompatible вызван двумя экземплярами того же класса. В этом случае это вызвано двумя экземплярами UserNameEnvironmentVariableFixture. Среда тестирования считает эти два экземпляра совместимыми, если их свойства UserName равны.
В новом блоке methods в UserNameEnvironmentVariableFixture.m задайте метод isCompatible, который возвращает логический 1 (true) или логический 0 (false).
methods (Access=protected)
function bool = isCompatible(fixture, other)
bool = strcmp(fixture.UserName, other.UserName);
end
endНиже полное содержимое UserNameEnvironmentVariableFixture.m.
classdef UserNameEnvironmentVariableFixture < ... matlab.unittest.fixtures.Fixture properties (SetAccess=private) UserName end methods function fixture = UserNameEnvironmentVariableFixture(name) validateattributes(name, {'char'}, {'row'}, '','UserName') fixture.UserName = name; fixture.SetupDescription = sprintf( ... 'Set the UserName environment variable to "%s".',... fixture.UserName); end function setup(fixture) originalUserName = getenv('UserName'); fixture.assertNotEmpty(originalUserName, ... 'An existing UserName environment variable must be defined.') fixture.addTeardown(@setenv, 'UserName', originalUserName) fixture.TeardownDescription = sprintf(... 'Restored the UserName environment variable to "%s".',... originalUserName); setenv('UserName', fixture.UserName) end end methods (Access=protected) function bool = isCompatible(fixture, other) bool = strcmp(fixture.UserName, other.UserName); end end end
В файле в вашей рабочей папке создайте следующий тестовый класс, ExampleTest.m.
classdef ExampleTest < matlab.unittest.TestCase methods(TestMethodSetup) function mySetup(testCase) testCase.applyFixture(... UserNameEnvironmentVariableFixture('David')); end end methods (Test) function t1(~) fprintf(1, 'Current UserName: "%s"', getenv('UserName')) end end end
Этот тест использует UserNameEnvironmentVariableFixture для каждого теста в классе ExampleTest.
В командной строке, запущенной тест.
run(ExampleTest);
Running ExampleTest Current UserName: "David". Done ExampleTest __________
В вашей рабочей папке создайте три тестовых класса с помощью разделяемого фиксатора. Используя разделяемый фиксатор позволяет UserNameEnvironmentVariableFixture быть совместно использованным через классы.
Создайте testA.m можно следующим образом.
classdef (SharedTestFixtures={... UserNameEnvironmentVariableFixture('David')}) ... testA < matlab.unittest.TestCase methods (Test) function t1(~) fprintf(1, 'Current UserName: "%s"', getenv('UserName')) end end end
Создайте testB.m можно следующим образом.
classdef (SharedTestFixtures={... UserNameEnvironmentVariableFixture('Andy')}) ... testB < matlab.unittest.TestCase methods (Test) function t1(~) fprintf(1, 'Current UserName: "%s"', getenv('UserName')) end end end
Создайте testC.m можно следующим образом.
classdef (SharedTestFixtures={... UserNameEnvironmentVariableFixture('Andy')}) ... testC < matlab.unittest.TestCase methods (Test) function t1(~) fprintf(1, 'Current UserName: "%s"', getenv('UserName')) end end end
В командной строке, запущенной тесты.
runtests({'testA','testB','testC'});Setting up UserNameEnvironmentVariableFixture Done setting up UserNameEnvironmentVariableFixture: Set the UserName environment variable to "David". __________ Running testA Current UserName: "David". Done testA __________ Tearing down UserNameEnvironmentVariableFixture Done tearing down UserNameEnvironmentVariableFixture: Restored the UserName environment variable to "Kim". __________ Setting up UserNameEnvironmentVariableFixture Done setting up UserNameEnvironmentVariableFixture: Set the UserName environment variable to "Andy". __________ Running testB Current UserName: "Andy". Done testB __________ Running testC Current UserName: "Andy". Done testC __________ Tearing down UserNameEnvironmentVariableFixture Done tearing down UserNameEnvironmentVariableFixture: Restored the UserName environment variable to "Kim". __________
Вспомните, что фиксаторы совместимы, если их свойства UserName соответствуют. Тесты в testA и testB используют несовместимые разделяемые фиксаторы, поскольку 'David' не равен 'Andy'. Поэтому среда вызывает фиксатор teardown и методы setup между вызовами testA и testB. Однако разделяемый испытательный стенд в testC совместим с фиксатором в testB, таким образом, среда не повторяет отключение фиксатора и настройку перед testC.
Альтернативный подход к использованию метода addTeardown в рамках метода setup должен реализовать отдельный метод teardown. Вместо метода setup, описанного выше, реализуйте следующий setup и методы teardown в UserNameEnvironmentVariableFixture.m.
Чередуйте определение класса UserNameEnvironmentVariableFixture
Метод setup не содержит вызов addTeardown или определения для TeardownDescription. Эти задачи понижены к методу teardown. Альтернативное определение класса содержит дополнительное свойство, OriginalUser, который позволяет информации быть переданной между методами.
matlab.unittest.fixtures.Fixture