Tag: Wwdc 2017

Xcode 9的新增功能:值得期待的5大功能。

苹果的WWDC 2017正在进行中,对于开发人员我们已经有了一些好消息! 在平台状态联盟主题演讲中,我最喜欢的是围绕Xcode进行的改进。 因此,我决定将自己最希望在Xcode 9中玩的东西排在前5位。请注意,新的Xcode编辑器已在Swift中从头开始完全重写,这使得它在许多方面都快得多🎉 1.在Swift中重构 终于啊! 我一直期待着这件事,因为Swift一直存在,他们终于交付了! Cmd + Shift + F消失了,您错过了一些变量重命名,或者不小心修改了一个不相关的变量。 剪切+粘贴+修改以提取方法的方法已经一去不复返了。 我们终于可以使用这些了! 尽管Xcode像今天提供JetBrains一样提供高级重构工具还有很长的路要走,但它提供了最常见的工具,例如添加代码段,提取方法和变量以及与Swift,Objective-C甚至Storyboard文件一起使用的全局重命名。 我们必须从某个地方开始吗? 2.更聪明地修复its Xcode的另一个不错的改进是更智能的“修复它”。 还记得实现UICollectionViewDataSource , CMD +单击它,然后从中复制粘贴所需方法的时间吗? 好吧,有了新的Xcode,您只需单击即可获得所有这些! 除了添加缺少的协议要求之外,还有“修复它”的功能,可以为抽象方法添加缺少的替代,添加缺少的实现存根,围绕仅在特定iOS版本中可用的API添加if else语句等。 从长远来看,这可以极大地提高您的开发速度。 3.模拟器…s! 🔄 🎉🎉! 现在,我们可以启动多个模拟器,无论是iPhone还是iPad! 我只是尝试了一下,它看起来很棒。 另外,它们是完全可调整大小的。 4.无线调试📲 是的,您没看错! 为您的iOS应用程序进行无线测试和调试! 不再需要使用该电缆。 我们长久了 等待这一天。 5.源代码控制📑 最后但并非最不重要的一点是,Apple在Xcode内添加了一个很棒的Source Control Navigator。 它显示您的工作副本,分支的详细信息,文件更改等。您还可以执行诸如创建分支之类的操作。 作为Atom和VSCode的用户,我很高兴Xcode决定采取类似的方法将某种形式的Source Control集成到编辑器中。 另一个很酷的事情是与Github的合作! 它已完全集成到Xcode中,您现在可以克隆存储库,签出自述文件,添加星标等等。 奖金 作为奖励,我想添加两件事: Xcode现在有一个MarkDown编辑器,很好! 还记得将文件从一个组移动到另一个组时非常烦人的组与文件夹问题吗? 好了,有了新的Xcode,它终于解决了! 您不必再担心🎉

Xcode 9的动手XCUITest功能

注意:本文最初发布在我的个人博客上。 继续阅读此处,因为某些GIF尚未上传到Medium。 在WWDC 2017上,有一个关于“测试中的新增功能”的精彩会议,主要讨论XCTest和XCUITest框架的新功能。 苹果公司开发人员工具团队在使用XCUITest进行UI测试以及与Xcode Server进行持续集成方面进行了重大改进。 在本文中,我们将通过Xcode 9和命令行中的实际示例探索所有新功能。 探索过程中创建了Github存储库Xcode9-XCTest。 您可以将这篇文章引用到该GitHub存储库,以自己尝试一下。 宣布了许多与针对Apple平台(尤其是iOS和macOS)的测试有关的新事物。 其中一些如下。 XCUISiriService 本地化测试 异步测试 UI测试性能改进 活动,附件和屏幕截图 多应用测试 xcodebuild:无头测试 xcodebuild:并行测试 内置Xcode服务器 测试过程中有很多增强功能,包括Siri集成,XCTest中的Waiting,xcodebuild中的Core Simulators等。 让我们一一介绍。 XCUISiriService 使用XCUISiriService,我们现在可以与Siri界面进行交互。 我们可以通过传递来自XCUITests的语音识别文本来控制Siri,Siri将采取相应的行动。 想象一下,我们想使用XCUISiriService打开一个Apple News应用程序,我们可以从测试中做到这一点。 func testXCUISiriService(){ XCUIDevice()。siriService.activate(voiceRecognitionText:“打开新闻”) } 几个月前,当我与Xcode 8.3一起宣布使用XCUISiriService从XCTest控制Siri时,我写了一个详细的博客,它还在Github XCUISiriServiceDemo上创建了演示项目,但API语法有所变化,但示例仍然有效。 实际例子 在Xcode 9中打开Xcode9-XCTest项目,然后从Xcode9_XCTestUITests.swift文件运行testXCUISiriService()测试。 您可以看到Siri将打开Apple News应用程序。 本土化 使用Xcode 9,我们可以使用Xcode方案在不同的Language和Region中运行测试。 在编辑方案时,我们会看到“测试”选项,以使用特定的语言和区域运行测试。 通过更改方案设置,我们可以轻松地用不同的语言和地区测试我们的应用程序。 异步测试 在很多情况下,我们需要等到事情发生以进行测试执行为止,例如打开文档,等待服务器的响应等,但这在UI测试场景中最常见。 到目前为止,XCTest通过创建期望来处理异步测试,并且测试将一直等到期望得到满足。 XCTest超时将导致测试失败。 期望与XCTestCase紧密相关。 现在,XCTest具有新的类XCTWaiter,它使我们可以显式定义与XCTestCase分离的期望。 它具有作为公共API的初始化程序,然后涵盖了不同的等待条件。 XCTWaiter等待一组期望被实现。 我们现在可以这样定义期望: […]

编写可扩展XCUITests的技巧— WWDC 2017

在WWDC 2017上,有一个关于可测试性工程的精彩演讲,重点关注测试代码以及​​应用程序代码质量的重要性。 演讲介绍了通过编写出色的测试代码来提高应用程序可测试性的各种方法。 最重要的一点是第二部分,其中分享了改善UI测试的可伸缩性的技巧。 在这篇文章中,我们将看到Apple工程师分享的那些技巧。 请记住,这不仅仅是在WWDC上发表的演讲的复制粘贴,本文还提供了一些在Github 可扩展XCUITest上的演示项目的真实示例,以证明这些观点。 WTF是可扩展的测试代码吗? 即使未在生产中执行,测试代码也与应用程序代码一样重要。 我们绝对应该使我们的应用程序可测试,但还要付出一些努力使测试代码更具可伸缩性。 因此,可扩展测试代码的好处是 更快地运行我们的测试 使我们的测试即使对于非技术人员也更具可读性 以更好的方式组织测试代码,避免重复 轻松添加新的测试用例 示例应用 让我们探讨一下Apple工程师共享的一些技巧,这些技巧可通过示例应用程序Expandable-XCUITest使测试代码可扩展 ,该应用程序具有6种不同颜色的按钮,分别是红色,绿色,蓝色,黑色,灰色和黄色。 这是一个非常简单的应用程序,但请想象我们必须测试一些东西,例如 轻按所有颜色 只需点击RBG颜色 点击非RBG颜色。 不可缩放的UI测试如下所示: func testTapAllColorNonScalable(){ XCUIApplication()。buttons [“ RED”]。tap() XCUIApplication()。buttons [“ BLUE”]。tap() XCUIApplication()。buttons [“ GREEN”]。tap() XCUIApplication()。buttons [“ BLACK”]。tap() XCUIApplication()。buttons [“ YELLOW”]。tap() XCUIApplication()。buttons [“ GRAY”]。tap() } 再次测试RGB和非RGB值,我们几乎必须重复同样的事情。 您可以在此处查看测试类Non_Scalable_XCUITestUITests.swift ,并猜测它有多混乱。 通过使用讲座中描述的技术,我们绝对可以做得更好。 编写可伸缩XCUITest的技巧 通过使用一些常见的面向对象的原理(例如抽象和封装),可以共享一些技巧以使测试可伸缩,可维护且更快。 让我们来看一些技巧 抽象的XCUIElement查询 如果存在多次使用XCUIElement查询的情况,请将其存储为变量。 在上面的示例中,我们点击了6次按钮,但唯一改变的是按钮的颜色。 我们可以轻松地将其包装到方法中。 […]

Swift 4的Codable

几乎可以肯定的是,在应用程序开发过程中的某个时刻,您需要(或者您将很快:])序列化一些对象或值,并解析对模型的JSON响应。 如果我是对的,那么这可能值得您花时间。 在Swift中,我们曾经使用NSCoding协议来序列化对象。 为了符合NSCoding我们常常最终使类从NSObject继承,然后经过一会儿cha和samba以及异常长的时间之后,我们最终设法实现了预期的init(coder:)和encode(with:)方法。 但是structs正确吗? 好吧,大多数人在将第三方框架引入其项目时找到了解决方案。 希望有关序列化和映射的斗争已经结束。 现在怎么办? Swift 4引入了一个称为Codable的协议,该协议由其他两个协议组成: Encodable和Decodable 。 Codable允许我们几乎无需费力地对classes , structs和enums进行序列化和反序列化。 包括String , Int , Array , Dictionary在内的大多数类型都符合此协议。 因此,当我们创建一个包含已经符合Codable属性的新类型时,我们无需再编写一行代码。 如下所示, Person类型符合Codable : struct Person:可编码{ 命名:字符串 年龄:整数 让朋友们:[人]? } 将 Person 序列 Person JSON: let person = Person(姓名:“ Brad”,年龄:53,朋友:无) //对不起,Bradlet编码器= JSONEncoder() 让jsonData =试试encoder.encode(person)String(data:jsonData,编码:.utf8)! // {“ name”:“ Brad”,“ age”:53} Voilà,人员价值就这样转换为数据。 现在让我们反序列化 : 让解码器= […]