В этом примере показано, как создать пользовательский прибор, задающий переменную среды. Перед тестированием это приспособление сохранит текущий UserName переменная.
Создать определение класса UserNameEnvironment VariableFixture
Применение пользовательского приспособления к классу одиночных испытаний
Применение пользовательского приспособления в качестве общего приспособления
Альтернативный подход к вызову 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