Tag: Xcuitest

使用XCUITests更改设置

Xcode 9增加了编写测试的能力,而现在它可以与“设置”应用程序进行交互。 如果每个人都想禁用位置或将动态字体切换为大字体? -现在有可能。 首先,我们需要像普通应用程序一样午餐设置应用程序,并提供它的捆绑包标识符。 让settingsApp = XCUIApplication(bundleIdentifier:“ com.apple.Preferences”) settingsApp.launch() 您可以与设置进行交互,就像使用应用程序一样。 由于“ [MC] 从私人有效用户设置中读取”错误,目前无法使用交互记录。 我已经提出雷达来增加这种可能性。 假设我们要打开和关闭定位服务。 我们可以这样做: settingsApp.tables.cells.staticTexts [“ Privacy”]。tap() settingsApp.tables.cells.staticTexts [“位置服务”] .tap() 如果settingsApp.switches [“位置服务”] .isSelected { settingsApp.switches [“位置服务”] .tap() settingsApp.buttons [“关闭”] .tap() }其他{ settingsApp.switches [“位置服务”] .tap() } 最好在teardDown上终止设置,这样我们将在每次测试运行时进入主设置屏幕。 settingsApp.terminate() 这是测试的实际效果: 您可以在github上找到要使用的示例项目:https://github.com/PycKamil/XCUITestSettingsExample

XCTest中的快照测试

“这不是一个错误,这是一个功能”。 几乎每个团队成员都已经学会了这句话。 是的,很奇怪,可以说它存在一定数量的缺陷。 但不是关于显示效果不好的布局。 考虑到交付到商店的时间成本,这对于移动测试尤为重要。 我们有许多类似的工具可用于测试iOS应用程序中的布局。 但是大多数人只是从一个人那里分叉或提出了一个主意。 因此,在此XCNote中,我想谈一谈– iOSSnapshotTestCase 。 该工具最初是在Facebook的领导下作为一个开源项目创建的。 随着时间的流逝,进入存档的计划被传递给了Uber,该项目仍在成功开发中。 最令人高兴的是, iOSSnapshotTestCase继承自XCTestCase ,这显然意味着,我们根本不需要对自动化系统进行任何更改。 我还要注意,我们可以像XCUITest一样在XCUITest中使用iOSSnapshotTestCase。 太好了,让我们尝试。 一开始,我们应该: 在Podfile中添加一个额外的pod: 保存参考快照的功能由位于setUp()中的变量recordMode调节: recordMode = true //保存参考快照 recordMode = false //使用实际验证参考快照 为了对每个测试进行多个检查,我们应该将“ identifier”设置为FBSnapshotVerifyView和FBSnapshotVerifyLayer方法的参数。 如果需要通过XCUITest验证全屏快照,则可能会遇到以下问题:状态栏中会发生冲突(电池,时间等)。 可以解决此问题,尽管以一种有点荒谬的方式进行—在拍摄快照时,剪掉用于状态栏的几个像素。 主要问题是,由于iPhone X系列的状态栏尺寸不标准: 我们可以使用UIImage扩展来实现此拐杖: 此后,为了在所有iPhone机型上正确执行此裁切操作,我们将需要学习如何从测试中确定裁切结果。 为此,我们需要扩展UIDevice : 然后将像这样使用它: 有时我们可能需要验证全屏快照,但特定元素除外。 谁能画画? 还有油漆吗?)现在该重新油漆了,因为我们可以借助“ 着色 ”解决这个问题。 我不是在开玩笑😉。 为此,我们需要: 1.通过创建fill(element:XCUIElement)方法再次扩展UIImage ,该方法将在快照上绘制所选元素: 2.在先前创建的验证方法附近创建一个新方法verifyScreen(不包含元素:XCUIElement) : 综上所述,我想说的是,至少可以在移动设备上使用快照进行测试,并且最多可以加快我们的自动化测试的速度。 阅读完有关快照测试的文章后,如果您有任何疑问或澄清,我们将很乐意为您解答。 您可以在这里找到完成的项目: https://github.com/alter-al/sample_of_ios_snapshot_testing_2048 所以,祝你好运,玩得开心,以后再见(:

iOS XCUITest –黄瓜

在XCode中让iOS工程师对BDD感到兴奋。 免责声明:本主题与上下文有关,如何使用Cucumberish可以使iOS开发工程师或UI自动化测试团队受益。 本文旨在通过使用Cucumberish作为其本机iOS开发的一部分来使iOS工程师兴奋。 在介绍Cucumberish库之前,我想快速介绍一些初始要点。 什么是黄瓜/黄瓜/行为驱动开发(BDD) 黄瓜测试的结构 跨平台移动测试工具的一些注意事项 我是一名iOS工程师,并且一直在编写各种iOS自动化测试框架:UIAutomation(使用javascript),Calabash(使用ruby),Sen Testing(目标C),“ XCTest + Gherkin” cocoapods,以及目前的“ Cucumberish”。 我还找到了一种编写XCUITest来断言Google Analyics网络有效负载的方法。 这是一个非常有趣的主题,但是我将其保存在另一篇文章/演讲中……敬请期待。 1.什么是黄瓜/黄瓜/行为驱动的发展(BDD) Cucumber是一种软件工具,用于使用Gherkin语言执行行为驱动的测试(BDD)。 Gherkin Language本身与平台无关,它为产品所有者和业务分析人员提供了结构化的模板,以通过用例描述业务需求。 它的主要特征是“ Given-When-Then”子句的存在。 行为驱动开发(BDD) 与产品所有者和利益相关者合作以拟定可为客户带来价值的用例规范列表的过程。 这些规范使用Ghenn-When-Then Gherkin语言写入“功能”文件。 即使非工程师也很容易理解功能文件,这促进了整个组织的协作。 可以使用BDD工具(例如黄瓜,阿皮,黄瓜,葫芦,硒)将其自动化。 对于跨平台测试,功能文件是组织具有可在所有平台上使用的集中式规范的绝佳选择。 上面的BDD示例可以在Web和移动应用程序上使用。 在敏捷开发过程中常见。 2.黄瓜测试的结构 黄瓜测试套件包含一组功能文件。 它们每个都有一个“ .feature”扩展名。 每 功能文件包含一个或多个描述软件特定功能的方案。 使用多行用Gherkin编写的“步骤”来编写方案。 步骤定义是一小段代码 ,上面附加了一个模式 。 该模式用于将步骤定义链接到所有匹配的步骤,并且代码是Cucumber看到小黄瓜步骤时将执行的代码 。 [https://cucumber.io/docs/reference#step-definitions] 一旦定义了步骤,就可以继续为每个步骤编写测试/断言实现 。 请注意,如果使用适当的正则表达式格式,则可以使您的步骤对于测试套件更可重用。 3.关于跨平台移动测试工具的一些说明 在移动领域,市场上有一些工具试图通过引入单独的测试运行器来简化跨平台测试的复杂性。 iOS中使用的最受欢迎的是Calabash和Appium。 在我看来,以上问题是工程团队需要投资的额外开销。实现跨平台功能的另一种想法是,仅跨平台绑定通用功能文件,并允许灵活地选择最合适的测试运行器进行开发效率。 对于iOS开发,理想的情况是我们可以在XCode中执行Gherkin BDD功能文件,并且其步骤定义/实现可以用Swift编写。 哦,是的,还有一个更理想的标准:通过Cocoapods安装! […]

XCUITests课程入门复习

我已经在http://testautomationu.applitools.com/上学习了一段时间,当出现了来自Shashikant的有关iOS XCUITests的新课程时,我全力以赴并完成了工作,并获得了第一份证书! 我从事XCUItests已经有好几年了,而错误的想法课程将是多余的,但是男孩我已经学到了很多东西,可以直接帮助我工作。 页面对象的枚举是个绝招,很想看看如何将其扩展到多个屏幕和对象。 XCTContext是一个很好的小技巧,可以提供清晰的报告并分组测试块 Eyes SDK非常简单,可以在几分钟内添加视觉检查,并与组织良好的项目很好地集成。 Travis CI甚至没有Mac版本的付费墙! xcodebuild -list是简洁易用的命令,它总结了所有方案,并在您的项目中构建。 可以删除该测试,而不是删除或最差劲地评论一个不稳定的测试(我认为它会添加到-skip-testing选项中) 我不喜欢的一些东西: 在入门课程中使用BDD样式似乎不合适,特别是因为稍后引入了屏幕对象。 尽管某些项目/团队可能喜欢BDD,但这并不是所有自动化项目的事实。 有一个测验问题答案错误,这影响了我的学分 我们可以从xcodebuild或fastlane中运行BDD或任何其他xcuitest,如本课程后面所述。

XCUITest的一些好的做法

//在您的ViewController上 btnSend.accessibilityIdentifier =“ btn_send” //测试查询元素: app.buttons [“ btn_send”]。tap() 查看过渡 在实际显示视图之前,可能需要一些时间。 过渡动画,加载视图从Web或其他任何过程获取信息所消耗的时间。 因此,请确保在声明任何内容之前始终等待视图的存在。 让resultView = app.otherElements [“ view_result”] 让viewExists = resultView.waitForExistence(超时:10) XCTAssert(viewExists) XCTAssert(app.staticTexts [“ Xcode字词的结果”] .exists) 一个好的做法是识别每个UIViewController的视图 ,以便断言该视图是否存在,您不依赖于可以很容易更改的标签文本,而是依赖于可访问性标识符。 页面对象模式+方法链接 将有关每个ViewController的信息包装在不同的对象( Page )中。 这样,测试可以使用该对象而不是查询元素本身。 类SearchPage { 函数类型(查询:字符串) func tapSend() } //使用Pages进行测试: searchPage.type(查询:“ Xcode”) searchPage.tapSend() 为了使测试更具可读性,您可以使用方法链接,如下所示: 类SearchPage { 函数类型(查询:字符串)->自我 func tapSend()-> ResultPage } //使用Pages +方法链接进行测试 searchPage .type(查询:“ Xcode”) […]

Swift Localhost:使XCUITest再次出色

XCUITest的最简单的网络存根 端到端(E2E)UI测试不仅由于多个依赖关系而脆弱,而且执行起来也很慢且昂贵。 在我以前的工作中,我记得我们的组织花大量时间运行E2E测试,却由于本地客户端错误而导致测试失败,这真令人沮丧。 通过进行客户端集成测试,可以避免此类不必要的故障。 除了单元测试之外,鼓励iOS工程师编写UI自动化测试,作为完成功能所需工作的一部分。 这些测试将使用localhost模拟外部依赖关系。 我将使用此博客文章来说明使用cocoapods和XCode为现有的iOS项目设置localhost XCUITest的人多么容易。 通过4个步骤设置iOS XCUITest Localhost 这是4个简单的步骤(LAIM),用于在iOS项目中设置localhost XCUITest。 (L)本地主机 将SwiftLocalhost(https://github.com/depoon/SwiftLocalhost)安装到您的iOS项目中。 对于iOS 9,我们需要在“ Exception Domains”下将“ localhost”添加为项。 对于iOS 10及更高版本,只需添加NSAllowsLocalNetworking并将其设置为YES。 (M)模拟 创建用于准备模拟URLResponse数据的帮助程序类/函数。 在这里,我们可以指定用于测试的模拟响应文件的位置。 记录所有到达本地服务器的出站URLRequest。 对于给定的用例,我们可以使用SwiftLocalhost断言iOS应用正在按特定顺序发送特定的出站请求。 专注于模拟 工程师可以只关注模拟响应的内容,而无需知道如何启动本地Web服务器。 请记住,SwiftLocalhost的目标仅仅是实现客户端UI集成测试,而不是断言端到端的行为。 测试用例中的嘲弄 相同的XCUITest测试功能中描述了模拟响应的设置。 这有助于使测试用例更具可读性,尤其是在同一范围内可以看到测试代码和模拟响应时。 只需使用Swift 您只需要XCode和Cocoapods即可运行SwiftLocalhost。 iOS开发人员可以放心使用Swift作为应用程序开发语言和UI测试编程语言。 Cmd + U 使用SwiftLocalhost的最大优势在于其执行简单。 iOS开发人员只需按Cmd + U即可触发UI自动化测试。 因此,无需使用bash / shell来启动本地Web服务器。 此外,连续集成作业仅需要选择XCUITest方案即可运行测试。 是的,就是这么简单。 展示柜 为了展示在现有的iOS项目中设置SwiftLocalhost是多么容易 ,我分叉了一个我在Github上随机找到的iOS应用程序存储库项目,并应用了本文中突出显示的技术。 [派生] https://github.com/depoon/ios-movies-app [原始] https://github.com/mkamhawi/ios-movies-app […]