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