主要内容

编写使用应用测试和模拟框架的测试

这个例子展示了如何编写一个使用应用测试框架和模拟框架的测试。该应用程序包含一个文件选择对话框和一个指示所选文件的标签。要以编程方式测试应用程序,请使用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.TestCasematlab.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 __________

另请参阅

|

相关的话题