В этом примере показано, как создать пользовательский прибор, которое устанавливает переменную окружения. Перед проверкой этот фиксатор сохранит текущий 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.
The 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 Определение класса
The setup метод не содержит вызов addTeardown или определение для TeardownDescription. Эти задачи отодвигаются на teardown способ. Альтернативное определение класса содержит дополнительное свойство, OriginalUser, что позволяет передавать информацию между методами.
matlab.unittest.fixtures.Fixture