В этом примере показано, как создать пользовательский прибор, который устанавливает переменную окружения. До тестирования этот фиксатор сохранит текущий 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 ложь).
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