iOS自动化测试:Xcode UI测试入门
如何编写iOS自动化测试? 如何使用Xcode UI测试框架通过Screen Object Pattern编写可靠且可维护的测试? 阅读本文以了解答案。
XCUITest框架简介
第一步,我们需要选择自动化框架。 在本教程中,我们将利用XCUITest Framework。 一个允许测试用户与屏幕实际交互的框架。 它由Apple开发,为用户界面和集成测试提供了强大的功能。
设置Xcode项目以进行UI测试
Xcode UI测试要求访问应用程序源代码,并且必须在计算机上安装Xcode。 首先,我们需要创建UI测试目标:
- 打开Xcode项目
- 文件>新建>目标
- 选择iOS UI测试套件
- 输入您的组织信息并选择一种编程语言(本教程中将使用Swift)
使用XCUI Test Recorder编写第一个测试
XCUI Test Recorder允许我们记录用户与屏幕的交互并在测试中使用生成的代码:
- 导航到测试导航器
- 选择要记录的测试功能
- 按下UI记录器按钮
- 在设备上执行测试
为了完成我们的测试,我们应该添加断言来进行验证,以确保预期元素显示在主屏幕上
//预期显示的元素
让玩家= app.collectionViews.staticTexts [“测试”]
//声明该元素已显示
XCTAssertTrue(player.exists)
使用辅助功能检查器检查元素
XCUI测试记录器非常适合简单的测试,但是记录器生成的代码需要修改,有时它不能为Element提供正确的定位器。 更好的方法是使用辅助功能检查器:
- 开放辅助功能检查器
- 单击开始检查按钮
- 检查元素以定义定位器
当我们知道Element调试描述时,我们可以根据该值编写Locator:
让playerBalance = app.staticTexts [“ $ 99.999”]
获取屏幕调试描述的另一种方法是在Xcode控制台中打印可访问性层次结构:
print(app.debugDescription)
屏幕对象模式简介
在编写用户界面和集成测试时,我们希望使用可读代码创建可维护的测试。 受用于Web应用程序测试的页面对象模式的启发,在本教程中,我们将遵循屏幕对象模式:
- 为每个屏幕创建屏幕对象
- 定义元素定位器
- 实施我们将在测试中使用的屏幕测试方法
为每个屏幕创建屏幕对象后,我们需要在测试用例类中对其进行初始化:
// MARK:屏幕对象初始化器
让settingsScreen = SettingsScreen()
让addPlayerScreen = AddPlayerScreen()
让homeScreen = HomeScreen()
使用“屏幕对象模式”将使我们能够更快,更清晰,更易于遵循的代码创建新测试:
func testAddPlayerWithDefaultBalance(){
/ **
添加具有默认余额的新播放器,并断言添加的播放器显示在主屏幕上
* /
homeScreen.addPlayer()
addPlayerScreen.setPlayerNameWith(testPlayerName1)
addPlayerScreen.addPlayer()
XCTAssertTrue(homeScreen.isPlayerDisplayed(名称:testPlayerName1,余额:defaultPlayerBalance,货币:defaultCurrency))
}
下一步
- 使用Fastlane工具执行测试以在CI服务器上运行
- 生成测试报告和屏幕截图
- 在真实设备和模拟器上并行执行测试
结论
XCUITest是功能强大的测试自动化框架,用于为本机iOS应用程序编写可靠的测试。 使用现有的Xcode Project进行设置很容易,并且不需要高级编码技能即可开始编写测试。
屏幕对象模式提高了测试代码的可读性,并使维护现有测试和创建新测试变得更加容易。 带有Application Source Code的完整Test Framework设置示例可在GitHub上获得 ,我强烈建议您进行检查以了解上下文的更多详细信息。
请继续关注更多教程和快乐测试🙂
关于作者
Maksim Akifev是一位技术熟练的质量保证工程师,在测试自动化,安全性和渗透性测试方面拥有丰富的经验,他可以帮助金融,医疗保健和网络安全等各个行业的公司构建可靠的产品。
- Youtube Live Streaming API – 创建实时流失败,“请求未指定任何iOS包ID”
- 有没有办法自定义UITableViewCell的backgroundView的大小?
- 没有得到didReceiveMemoryWarning当应用程序在后台
- 服务器端Swift — MVC
- iOS:Siri不可用不会返回AVAudioSessionInterruptionOptionShouldResume
- 我如何使用UISearchController在UISearchBar在我的导航栏,并具有范围button的iOS 8?
- 如何在故事板中移回根视图控制器?
- 在使用应用程序期间丢失可达性连接时popup警报(IOS xcode swift)
- 在Swift中轻松进行结构初始化