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

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

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 в методе настройки

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

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

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

См. также

Похожие темы