编写使用应用测试和模拟框架的测试
这个例子展示了如何编写一个使用应用测试框架和模拟框架的测试。该应用程序包含一个文件选择对话框和一个指示所选文件的标签。要以编程方式测试应用程序,请使用mock对象来定义文件选择器的行为。
创建应用程序
创建launchApp
应用程序在您当前的工作文件夹。该应用程序允许用户选择输入文件,并在应用程序中显示文件名。文件选择对话框是一个等待用户输入的阻塞模式对话框。
函数app = launchApp f = uiffig;Button = uibutton(f;“文本”,“输入文件”);按钮。ButtonPushedFcn = @(src,evt)pickFile;Label = uilabel(f,“文本”,“未选择文件”);label.Position(1) = button.Position(1) + button.Position(3) + 25;label.Position(3) = 200;将组件添加到应用程序结构中用于输出app. uiffig = f;app.Button = button;app.Label =标签;函数file = pickFile() [file,folder,status] = uigetfile()“* *”。);如果状态标签。Text = file;结束结束结束
为了在测试前探索这个应用的属性,在命令提示符下创建一个应用实例。这一步对于测试来说不是必需的,但它有助于探索应用测试使用的属性。例如,使用app.Button
要访问输入文件按钮。
app = launchApp;
测试应用程序与手动干预
创建LaunchAppTest
类而不使用mock。测试假设文件input2.txt
存在于当前工作文件夹中。如果不存在,创建它。测试按下输入文件按钮,并验证标签是否匹配“input2.txt”
。必须手动选择该文件。
classdefLaunchAppTest < matlab.uitest.TestCase属性测试文件=“input2.txt”;结束方法(TestClassSetup)函数checkTestFiles (tc)导入matlab.unittest.constraints.IsFiletc.assumeThat (tc.TestFile IsFile)结束结束方法(测试)函数testInputButton(tc) app = launchApp;tc.addTeardown (@close app.UIFigure);tc.press (app.Button);tc.verifyEqual (app.Label.Text tc.TestFile)结束结束结束
运行测试。当文件选择对话框出现时,选择input2.txt
允许MATLAB继续进行测试。选择任何其他文件都会导致测试失败。
结果= runtests(“LaunchAppTest”);
运行LaunchAppTest。完成LaunchAppTest __________
创建完全自动化的测试
要在没有人工干预的情况下测试应用程序,请使用mock框架。修改应用程序以接受文件选择服务,而不是在应用程序中实现它(依赖注入).
创建一个FileChooser
提供服务摘要
方法,该方法实现文件选择功能。
classdefFileChooser%选择文件的接口方法(摘要)[file,folder,status] = chooseFile(chooser,varargin)结束结束
创建默认值FileChooser
它使用uigetfile
文件选择功能。
classdefDefaultFileChooser < FileChooser方法函数[文件,文件夹,状态]= chooseFile(选择器,varargin)[文件,文件夹,状态]= uigetfile(varargin{:});结束结束结束
更改应用程序以接受可选选项FileChooser
对象。在没有输入的情况下调用时,应用程序将使用的实例DefaultFileChooser
。
函数app = launchApp(fileChooser)如果margin ==0 fileChooser = DefaultFileChooser;结束F =图;Button = uibutton(f;“文本”,“输入文件”);按钮。ButtonPushedFcn = @(src,evt)pickFile(fileChooser);Label = uilabel(f,“文本”,“未选择文件”);label.Position(1) = button.Position(1) + button.Position(3) + 25;label.Position(3) = 200;将组件添加到应用程序结构中用于输出app. uiffig = f;app.Button = button;app.Label =标签;函数file = pickFile(fileChooser) [file,folder,status] = fileChooser. choosefile (“* *”。);如果状态标签。Text = file;结束结束结束
做如下修改LaunchAppTest
。
将测试更改为从两者继承
matlab.uitest.TestCase
和matlab.mock.TestCase
。删除
属性
Block和TestClassSetup
块。的输出chooseFile
方法调用时,测试不依赖于外部文件的存在。改变
testInputButton
测试方法,这样它就会做这些事情。类的模拟对象
FileChooser
。定义模拟行为,以便当
chooseFile
方法使用输入调用“* *”。
,输出为测试文件名(“input2.txt”
),当前工作文件夹,选定的过滤器索引为1。的输出类似于uigetfile
函数。按下按钮并验证所选的文件名。这些步骤与原始测试中的步骤相同,但是mock分配输出值,因此您不需要与应用程序交互即可继续测试。
为了测试取消按钮,添加测试方法
testInputButton_Cancel
所以它会做这些事情。类的模拟对象
FileChooser
。定义模拟行为,以便当
chooseFile
方法使用输入调用“* *”。
,输出为测试文件名(“input2.txt”
),当前工作文件夹,选定的筛选器索引为0。的输出类似于uigetfile
当用户选择了一个文件,然后选择取消时的函数。按下按钮,确认测试调用
chooseFile
方法,并且该标签表明未选择任何文件。
classdefLaunchAppTest < matlab.uitest.TestCase & matlab.mock.TestCase方法(测试)函数testInputButton (tc)导入matlab.mock.actions.AssignOutputs帧=“myFile.txt”;[mockChooser,behavior] = tc.createMock(?FileChooser);当(behavior.chooseFile (“* *”。),AssignOutputs(fname,pwd,1)) app = launchApp(mockChooser);tc.addTeardown (@close app.UIFigure);tc.press (app.Button);tc.verifyEqual (app.Label.Text、帧);结束函数testInputButton_Cancel (tc)导入matlab.mock.actions.AssignOutputs[mockChooser, behavior] = tc.createMock(?FileChooser);当(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“未选择文件”);结束结束结束
运行测试测试运行到完成,无需手动选择文件。
结果= runtests(“LaunchAppTest”);
运行LaunchAppTest ..完成LaunchAppTest __________
另请参阅
matlab.mock.TestCase
|matlab.uitest.TestCase