exponenta event banner

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

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

Создать определение класса UserNameEnvironment VariableFixture

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

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

См. также

Связанные темы