В этом примере показано, как записать тест, который использует среду тестирования приложения и платформу для мокинга. Приложение содержит диалоговое окно выбора файла и метку, указывающую на выбранный файл. Чтобы протестировать приложение программно, используйте фиктивный объект, чтобы задать поведение селектора файла.
Создайте 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 __________
matlab.mock.TestCase | matlab.uitest.TestCase