当前位置: 首页 > 科技观察

每日一学IOS92:UI测试

时间:2023-03-19 22:13:15 科技观察

自动化测试用户界面工具对于开发软件非常有用,可以快速帮助你定位问题。成功的测试过程可以为最终发布的软件带来信心。在iOS平台上,我们使用Automation来执行此操作。这涉及打开一个单独的应用程序、Instruments,以及编写和运行JavaScript脚本。整个过程痛苦而漫长。UI测试在Xcode7中,Apple引入了一种管理应用程序界面测试的新方法。UI测试允许您查找、交互并验证UI元素的属性和状态。在Xcode7中,UI测试伴随着测试报告,并与单元测试一起运行。XCTest在Xcode5中被集成到测试框架中。在Xcode7中,增加了测试UI的能力。允许您在特定点设置断言并查看当时的UI是什么样子。可访问性(Accessibility)为了让UITesting起作用,框架需要与你的许多元素建立直接联系,然后安排操作。您可以定义特定的点,或在UI上创建调整,并分配点击或滑动。但这在不同尺寸的设备上失败了。这是可访问性可以提供帮助的地方。Accessibility是Apple很久以前发布的一个框架,提供给有一定身体残疾(比如失明)的人,让他们可以操作和使用你的应用程序。他将你的UI以语义化的方式提供给这些用户,让他们进行丰富的操作。您可以(并且应该)使您的元素具有可访问性。原因有很多,比如自定义控件,不能自动发现。UITesting能够通过您的应用提供给Accessibility的功能,为测试不同尺寸的设备提供解决方案。它还确保您不必在重新组织UI后重写一组测试。它不仅可以帮助您测试自己的UI,还可以帮助您的应用程序更好地支持某些身体残疾的人。UI记录一旦您设置了可访问的UI,您将为UI创建测试。如果您的UI很复杂,则为UI编写测试非常耗时、枯燥且非常困难。感谢Xcode7,Apple引入了UIRecording。它允许您在现有项目中创建新的或创建测试。当您打开它时,测试代码会在您在设备或模拟器上工作时自动创建。好了,介绍到此结束,是时候用一个例子来看看怎么用了。创建一个UI测试示例我们将通过UI测试套件创建一个示例来展示UI测试的工作原理。最终的demo可以在Github上下载,大家可以跟着我们一起练习和查看结果。在Xcode7中创建,当你创建一个新的项目时,如果你选择包含UITests,就会为你创建一个新的target,你可以在弹出的框中设置你想要的所有配置。CheckIncludeUITests这个项目非常简单,但是足以帮助我们演示UITesting在Xcode7中是如何工作的。storyboard界面中有一个menuViewController,它包含一个开关和一个按钮。单击按钮以推送到detailViewController页面。当开关处于关闭状态时,禁止推送。详情页有一个按钮和一个标签,点击按钮会增加标签的值。创建UI控件并编写方法后,使用UIRecording。我们可以编写测试单元来保证代码的改动不会影响方法的效果。XCTestUI测试API在我们记录测试操作之前,我们需要决定将断言放在哪里。为了能够测试我们的UI,我们可以使用XCTest框架,它现在扩展了三个新的API。XCUIApplication这是您要测试的应用程序的代理。它可以启动你的应用程序,每次都会在一个新的进程中。这可能需要一些时间,但这意味着每次测试您的应用程序时,它都会执行需要完成的操作,使其处于干净、新鲜的状态。XCUIElement这是您要测试的应用程序的UI元素的代理。元素具有类型和唯一标识符。您可以将它们组合起来,找出您的元素在构成应用程序表示的树结构中的何处组合。XCUIElementQuery当你要查找元素时,你会使用XCUIElementQuery,每一个XCUIElement都是基于一个query。查询必须在您的元素树中找到相应的元素,否则它将失败。异常信息会提示不存在,可以查看是否显示在树上。XCUIElementQuery是通用的,如果您查找支持辅助功能的元素,查询将返回一组结果。现在我们已准备好编写进一步解释上述API的测试。测试1——保证开关关闭时导航不生效首先我们定义一个测试方法。functestTapViewDetailWhenSwitchIsOffDoesNothing(){}定义方法后,让我们将光标移动到方法上,然后单击Xcode窗口底部的记录按钮。记录现在应用启动了,点击开关关闭,然后点击“ViewDetail”按钮,下面的代码会自动插入到`testTapViewDetailWhenSwitchIsOffDoesNothing`方法中。letapp=XCUIApplication()app.switches["ViewDetailEnabledSwitch"].tap()app.buttons["ViewDetail"].tap()现在再次点击录制按钮,录制将停止。如您所见,实际上并没有推送到detailViewController页面。但是此时测试并不知道,我们需要加一个断言来判断没有变化。我们可以对比一下导航栏的title值,虽然不够优雅,但是对于现在的demo来说已经足够了。XCTAssertEqual(app.navigationBars.element.identifier,"Menu")添加这行断言并运行,发现测试仍然通过。如果把导航栏的标题改成“Detail”,你会发现测试不会通过。让我们尝试最终的测试代码,并附上一些解释行为的注释。测试1#p#测试2-确保开关打开时导航正常工作唯一的区别是开关已启用,因此应用程序会将详细信息页面加载到屏幕上。XCTAssertEqual方法来验证它是否正确。代码2测试3-确保增加按钮确实增加了标签的值。在这个测试中,我们需要验证点击增加按钮时标签的值会增加1。前两行代码与前面的示例非常相似,因此我们将它们复制到这里。letapp=XCUIApplication()//Taptheviewdetailbuttontoopenthedetailpage.app.buttons["ViewDetail"].tap()下一步我们要获取按钮,我们多点击几次。所以我们要让按钮成为一个变量。我们不必手动编写代码和调试它。再次录制,点击增加按钮,会自动为你添加如下代码。app.buttons["IncrementValue"].tap()我们停止录制,把代码改成下面这样。letincrementButton=app.buttons["IncrementValue"]这种方法使我们不必手动编写代码。以同样的方式,我们得到了标签变量。letvalueLabel=app.staticTexts["NumberValueLabel"]现在我们有了可以与之交互的感兴趣的元素。在下面的测试中,我们测试点击button按钮10次,看label的值是否相应增加。我们可以记录10次,但现在我们已经有了变量,我们可以编写一个循环来测试它。代码3中的三个测试远非完整的测试,但向您展示了一个可以轻松扩展的良好开端。为什么不自己写一个测试来练习呢。比如验证按钮是否启用,当开关关闭时能否导航成功?有时您会发现自己在录制时单击了某个元素,但生成的代码看起来并不正确。通常这是因为您的元素不可用于辅助功能。要确定这是否是原因,您可以打开Xcode的辅助功能检查器。accessibilityinspector打开AccessibilityInspector后,按CMD+F7,鼠标悬停在元素上,可以看到热点下完整的元素信息。当您找不到该元素时,这可以为您提供一些线索。找到问题后,您可以打开InterfaceBuilder。在“属性”窗格中找到“辅助功能”选项卡。它允许您设置元素的可访问性。这是用于设置GUI的辅助功能属性的强大工具。辅助功能面板当测试失败时当测试失败时,如果您不确定为什么?有很多方法可以帮助您修复错误。首先,你可以看看测试报告。testFailure当您打开此视图并将鼠标悬停在一个步骤上时,您会注意到该方法右侧有一个小眼睛图标。点击这个眼睛图标会给你当时的截图,你可以清楚地看到你当时的UI状态,从而发现错误。与单元测试一样,您可以设置断点,让您更容易发现问题。可以输出UI的层级,元素的属性等等,找到原因。为什么进行UI测试UI自动化测试是在对应用程序进行更改时增强信心和提供质量保证的好方法。我们已经看到添加UI测试并在Xcode中运行它们是多么容易。它不仅可以帮助您发现问题,还可以帮助残障人士使用您的应用程序。Xcode的一个特别好的功能是能够从持续集成服务器测试您的应用程序。这可以利用Xcode的bot进行测试,从命令行意味着如果测试失败,您将尽快收到通知。