Тест записи, который использует тестирование приложения и платформы для мокинга

Этот пример показывает, как записать тест, который использует среду тестирования приложения и платформу для мокинга. Приложение содержит диалоговое окно выбора файла и метку, указывающую на выбранный файл. Чтобы протестировать приложение программно, используйте фиктивный объект, чтобы задать поведение селектора файла.

Создайте приложение

Создайте приложение launchApp в своей текущей рабочей папке. Приложение позволяет пользователю выбирать входной файл и отображает имя файла в приложении. Диалоговое окно выбора файла является блокирующимся модальным диалоговым окном, которое ожидает ввода данных пользователем.

function app = launchApp
    f = uifigure;
    button = uibutton(f,'Text','Input file');
    button.ButtonPushedFcn = @(src,evt)pickFile;
    label = uilabel(f,'Text','No file selected');
    label.Position(1) = button.Position(1) + button.Position(3) + 25;
    label.Position(3) = 200;
    
    % Add components to an App struct for output
    app.UIFigure = f;
    app.Button = button;
    app.Label = label;
    
    function file = pickFile()
        [file,folder,status] = uigetfile('*.*');
        if status
            label.Text = file;
        end
    end
end

Чтобы исследовать свойства этого приложения до тестирования, создайте экземпляр приложения в командной строке. Этот шаг не необходим для тестов, но полезно исследовать свойства, используемые тестами приложения. Например, используйте app.Button, чтобы получить доступ к кнопке Input file в объекте приложения.

app = launchApp;

Тестовое приложение с ручным вмешательством

Создайте класс LaunchAppTest, не используя макеты. Тест принимает файл, input2.txt существует в вашей текущей рабочей папке. Если это не существует, создайте его. Тест нажимает кнопку Input file программно и проверяет, что метка совпадает с 'input2.txt'. Необходимо вручную выбрать файл.

classdef LaunchAppTest < matlab.uitest.TestCase
    properties
        TestFile = 'input2.txt';
    end
    methods(TestClassSetup)
        function checkTestFiles(tc)
            import matlab.unittest.constraints.IsFile
            tc.assumeThat(tc.TestFile,IsFile)
        end
    end
    methods (Test)
        function testInputButton(tc)
            app = launchApp;
            tc.addTeardown(@close,app.UIFigure);
            
            tc.press(app.Button);

            tc.verifyEqual(app.Label.Text,tc.TestFile)
        end
    end
end

Запустите тест. Когда диалоговое окно выбора файла появится, выберите input2.txt, чтобы позволить MATLAB возобновлять тест. Выбор любого другого файла приводит к непройденному тесту.

results = runtests('LaunchAppTest');
Running LaunchAppTest
.
Done LaunchAppTest
__________

Создайте полностью автоматизированный тест

Чтобы протестировать приложение без ручного вмешательства, используйте платформу для мокинга. Измените приложение, чтобы принять выбирающий файл сервис вместо того, чтобы реализовать его в приложении (dependency injection).

Создайте сервис FileChooser с методом Abstract, который реализует функциональность выбора файла.

classdef FileChooser
    % Interface to choose a file
    methods (Abstract)
        [file,folder,status] = chooseFile(chooser,varargin)
    end
end

Создайте FileChooser по умолчанию, который использует функцию uigetfile для выбора файла.

classdef DefaultFileChooser < FileChooser
    methods
        function [file,folder,status] = chooseFile(chooser,varargin)
            [file,folder,status] = uigetfile(varargin{:});
        end
    end
end

Измените приложение, чтобы принять дополнительный объект FileChooser. Когда названо без входных параметров, приложение использует экземпляр DefaultFileChooser.

function app = launchApp(fileChooser)
    if nargin==0
        fileChooser = DefaultFileChooser;
    end
    f = uifigure;
    button = uibutton(f,'Text','Input file');
    button.ButtonPushedFcn = @(src,evt)pickFile(fileChooser);
    label = uilabel(f,'Text','No file selected');
    label.Position(1) = button.Position(1) + button.Position(3) + 25;
    label.Position(3) = 200;
    
    % Add components to an App struct for output
    app.UIFigure = f;
    app.Button = button;
    app.Label = label;
    
    function file = pickFile(fileChooser)
        [file,folder,status] = fileChooser.chooseFile('*.*');
        if status
            label.Text = file;
        end
    end
end

Сделайте следующие модификации к LaunchAppTest.

  • Измените тест, чтобы наследоваться и matlab.uitest.TestCase и matlab.mock.TestCase.

  • Удалите блок properties и блок TestClassSetup. Поскольку макет задает вывод вызова метода chooseFile, тест не полагается на существование внешнего файла.

  • Измените метод тестирования testInputButton так, чтобы он сделал эти вещи.

    • Создайте фиктивный объект FileChooser.

    • Задайте ложное поведение, таким образом, что, когда метод chooseFile вызван входом '*.*', выходные параметры являются именем тестового файла ('input2.txt'), текущая рабочая папка и выбранный индекс фильтра 1. Эти выходные параметры походят на выходные параметры от функции uigetfile.

    • Нажмите кнопку и проверьте выбранное имя файла. Эти шаги эквивалентны в исходном тесте, но макет присваивает выходные значения, таким образом, вы не должны взаимодействовать с приложением, чтобы продолжить тестировать.

  • Чтобы протестировать кнопку Cancel, добавьте метод тестирования testInputButton_Cancel так, чтобы это сделало эти вещи.

    • Создайте фиктивный объект FileChooser.

    • Задайте ложное поведение, таким образом, что, когда метод chooseFile вызван входом '*.*', выходные параметры являются именем тестового файла ('input2.txt'), текущая рабочая папка и выбранный индекс фильтра 0. Эти выходные параметры походят на выходные параметры от функции uigetfile, если пользователь выбирает файл и затем принимает решение отменить.

    • Нажмите кнопку и проверьте, что тест вызывает метод chooseFile и что метка указывает, что никакой файл не был выбран.

classdef LaunchAppTest < matlab.uitest.TestCase & matlab.mock.TestCase
    methods (Test)
        function testInputButton(tc)
            import matlab.mock.actions.AssignOutputs
            fname = 'myFile.txt';
            
            [mockChooser,behavior] = tc.createMock(?FileChooser);
            when(behavior.chooseFile('*.*'),AssignOutputs(fname,pwd,1))
            
            app = launchApp(mockChooser);
            tc.addTeardown(@close,app.UIFigure);
            
            tc.press(app.Button);

            tc.verifyEqual(app.Label.Text,fname);
        end
        
        function testInputButton_Cancel(tc)
            import matlab.mock.actions.AssignOutputs
            
            [mockChooser, behavior] = tc.createMock(?FileChooser);
            when(behavior.chooseFile('*.*'),AssignOutputs('myFile.txt',pwd,0))
            
            app = launchApp(mockChooser);
            tc.addTeardown(@close,app.UIFigure);
            
            tc.press(app.Button);
            
            tc.verifyCalled(behavior.chooseFile('*.*'));
            tc.verifyEqual(app.Label.Text,'No file selected');
        end
    end
end

Запущение тестов. Тестовый прогон к завершению без ручного выбора файла.

results = runtests('LaunchAppTest');
Running LaunchAppTest
..
Done LaunchAppTest
__________

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

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте