Создание усовершенствованного пользовательского прибора

В этом примере показано, как создать пользовательский прибор, который устанавливает переменную окружения. До тестирования этот фиксатор сохранит текущий UserName переменная.

Создание определения класса UserNameEnvironmentVariableFixture

В файле в вашей рабочей папке создайте новый класс, 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

Реализация isCompatible Метода

Классы, которые выводят из 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 в Методе настройки

Альтернативный подход к использованию addTeardown метод в setup метод должен реализовать отдельный teardown метод. Вместо setup метод, описанный выше, реализуйте следующий setup и teardown методы в UserNameEnvironmentVariableFixture.m.

 Альтернативный UserNameEnvironmentVariableFixture Определение класса

setup метод не содержит вызов addTeardown или определение для TeardownDescription. Эти задачи понижены к teardown метод. Альтернативное определение класса содержит дополнительное свойство, OriginalUser, который позволяет информации быть переданной между методами.

Смотрите также

Похожие темы