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