Этот пример показывает, как записать тест, который использует среду тестирования приложения и платформу для мокинга. Приложение содержит диалоговое окно выбора файла и метку, указывающую на выбранный файл. Чтобы протестировать приложение программно, используйте фиктивный объект, чтобы задать поведение селектора файла.
Создайте приложение 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, чтобы получить доступ к Входной кнопке файла в объекте приложения.
app = launchApp;

Создайте класс LaunchAppTest, не используя макеты. Тест принимает файл, input2.txt существует в вашей текущей рабочей папке. Если это не существует, создайте его. Тест нажимает Входную кнопку файла программно и проверяет, что метка совпадает с 'input2.txt' 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 __________
Чтобы протестировать приложение без ручного вмешательства, используйте платформу для мокинга. Измените приложение, чтобы принять выбирающий файл сервис вместо того, чтобы реализовать его в приложении (внедрение зависимости).
Создайте сервис 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.
Нажмите кнопку и проверьте выбранное имя файла. Эти шаги эквивалентны в исходном тесте, но макет присваивает выходные значения, таким образом, вы не должны взаимодействовать с приложением, чтобы продолжить тестировать.
Чтобы протестировать Кнопку отмены, добавьте метод тестирования 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