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