Tag: 测试

使用Fastlane和Travis CI建立发行自动化

曾经有种感觉,就像您花费大量的办公时间来构建测试仪一样。 您正在构建版本,而不是对它们报告的错误进行修复。 好吧,如果您这样做了,那么您很幸运。 我们将讨论如何使用iOS开发人员可以使用的两个最简单的工具解决该问题。 快车道 特拉维斯CI 在将Swift集成到项目中(用Objective-C编写)之前,我们的构建时间非常短。 但是随着我们开始越来越多地在Swift中编写代码,这种情况发生了变化。 创建存档只需要3到5分钟的时间,而花费了15到20分钟的时间。 我们尝试了Apple建议的所有优化技术,但令我们沮丧的是,仅几分钟就对我们有所帮助。 如果您要花一些时间来上传构建版本,则很容易花费我们30-40分钟。 因此很显然,我们必须解决此问题,因为它会占用开发人员的时间及其生产力。 所以我们开始吧 如果您想直接跳到本教程,请向下滚动。 对于好奇的人,这里有一些关于我为什么选择Fastlane和Travis的见解。 快车道: 该工具使您可以非常轻松地自动化构建过程。 您的所有进程都位于这些很小的“通道”中,这些通道是可读的,因此,即使是新手,也可以通过查看代码确切地知道发生了什么。 而且,fastlane提供的输出非常有见地并且易于阅读。 管理代码签名:O !!! Fastlane提供与Fabric,HockeyApp,Testflight等第三方应用程序的完美集成。我们使用Fabric从测试人员下载构建的位置上传构建。 由于我想避免使用Fabric编写集成代码,因此Fastlane对我来说是一个显而易见的选择。 它拥有一个了不起的开发人员社区,您可以找到最常见问题的解决方案。 特拉维斯CI: 我不得不使用CI工具来分发我的构建,因此我选择在Jenkins和Travis之间进行一次小型调查。 以下是Travis与Jenkins相比的一些优势: Travis集成了GitHUB Web挂钩! 它还为您提供了一些漂亮的功能,例如在拉取请求中显示构建状态,队列管理,仅在最新提交时运行作业等。 您在Jenkins上确实有GitHUB插件,但是这一次您需要花费时间来集成它。 特拉维斯不需要任何设置。 我只需要创建一个帐户就可以了。 Travis是基于云的解决方案,因此您无需像Jenkins那样依赖于系统。 无论如何,足够了……。 让我们继续前进!!! 该工具将使我们的生成生成过程自动化。 我们将使用fastlane的两个工具: 匹配—管理不同分发方案的证书和配置文件 健身房—创建iPA 在系统上安装fastlane brew cask install fastlane 转到您的项目文件夹并运行 fastlane init 这将在项目目录中创建一个名为fastlane的文件夹,其中包含要在其中写入“ 泳道”的fastfile 。 通道遵循非常简单的结构: 车道:build do 选项 […]

知道如何进行单元测试的绝佳过程(您的Swift代码)

我将向您展示一种方法,该方法可以确定应测试的内容以及一些概念,使编写测试时的生活更加轻松。 在我职业生涯的某个时刻,我知道单元测试的重要性,但是我不知道如何测试代码。 许多人都面临着同样的问题。 我们阅读了有关如何开始的文章,但仍然很难将我们学到的东西应用到我们自己的代码中。 通常,我们没有那些仅对两个参数求和并返回结果的函数,我们在许多示例中都可以看到它。 好吧,我遇到了一个过程,这对我来说真的很容易。 我要说的第一件事是,您无需更改体系结构即可开始单元测试。 当某些开发人员听到某种结构可以使代码更具可测试性时,这是一个错误。 然后他们等到转移到这种新的编码方式开始编写测试。 让我们不要那样做! 如果要测试现有代码,则可能需要重构某些部分,但绝对不要更改您的体系结构! 消息是对象在面向对象的世界中彼此交谈的方式。 您希望对象执行方法时将消息传递给该对象。 获取属性值是相同的,并且适用于其他所有条件! 知道要测试什么的过程包含三个简单的步骤 ,并且都涉及消息。 1.确定消息的类型 消息有两种可能的类型:查询和命令。 这可能很明显,但是查询是当您要求某事时,而命令是当您告诉它要某事时。 查询具有返回值,但是在命令没有返回值时却不会更改任何状态,但是会产生一些副作用。 查询 =返回什么,什么也没改变 命令 =不返回任何内容并更改某些内容 2.标识消息的来源 一条消息可能有三个来源:传入,传出和发送给自己。 传入 :当一个对象从外部(另一个对象)接收到消息时。 传出 :当对象向外部发送消息时。 自我发送 :猜猜是什么?! 当对象向自身发送消息时。 3.遵循以下图表: 哦! 多么棒的图表! 对?! 保持这种状态直到对您自然。 第一个例子是采用Equatable。 该函数具有返回值,并且不会更改任何状态。 这是一个查询! 它是公共的,可以由另一个想知道两个Wallet是否相等的对象调用。 进来! 传入查询:声明结果。 传入查询非常简单。 您有一个预期的结果,然后调用该函数并断言它(如果它返回了预期的结果)。 (单词sut代表sut系统。在下面的示例中也将使用它) 第二个例子:在loadView之后,您想确保您的插座正确钩住! 他们在这一点上不应该零。 该函数没有返回值,调用后应设置出口。 因此,它有副作用。 所以,这是一个命令! (副作用是直接公开的,因为出口是sut上的财产 ) 该模块是公共的,可以从外部调用。 […]

AppCode和单元测试

由于不稳定,XCode的质量每天都在下降。 这些天,我正在尝试AppCode,感觉好多了。 但是对于一直使用XCode的人来说,几乎不可能迁移到AppCode,因为它看起来或感觉上都不像XCode。 在我的职业生涯中,我曾从事过各种IDE的工作,从Visual Studio,PhpStorm,PyCharm,Android Studio,Eclipse,最后是用于iOS开发的XCode。 在XCode中,即使重新启动计算机后,XCode中的小菱形测试按钮也会消失并且永远不会显示,更不用说重新启动XCode了。 有没有想过为什么? 查看我的这篇博客文章,以找回它们。 这就是为什么我想尝试用于iOS开发的新IDE的原因之一,而我在这里使用AppCode。 与XCode不同,AppCode并未配置其他目标。 我们将必须手动配置它们。 请按照以下步骤操作,您将一路顺风。 从“选择运行/调试配置”菜单中单击“编辑配置”。 在打开的窗口中,单击左上角的“ +”,将弹出上面显示的菜单。 选择XCTest / Kiwi选项。 在“名称”字段中为测试目标命名。 如果要测试类或方法,只需为“测试种类”选择“类/方法”。在“类”字段中,可以将其保留为空白以测试测试目标中的所有类,也可以测试特定的类。 键入测试类的名称后,“方法”下拉菜单将显示该特定类中的所有测试,您甚至可以选择测试一个类的单个方法。 这提供了非常好的灵活性。 将“目标”设置为项目中的测试目标。 单击“应用”。现在,您将在“选择运行/调试配置”下拉菜单中看到测试目标的配置。 选择测试目标和设备,然后单击“运行”按钮。 瞧! 您的测试将开始运行。 撰写本文时使用的AppCode版本为2016.1.2。

慢速网络上的iOS测试

有时,我的客户告诉我,他们无法连接到服务或具有错误数据。 服务器和应用程序上没有错。 也许网络环境慢是问题所在。 在我的开发环境中,我拥有高质量的wifi和蜂窝网络。 我该如何重现这种情况。 您可以轻松地在设备上测试问题。 设置>开发人员>网络链接调节器>状态>启用(选择eanble)并选择配置文件(可能是网络状况很差)。 然后,您可以在慢速网络上测试您的应用程序。 如果还不够,您想调整一些值以进行更多测试。 您需要复制配置文件,然后编辑所需的一些值。

2018年iOSDC

即将到来的区块链对iOS的影响 Bob Lee |是韩国欧爸bobthedeveloper 是韩国欧爸的英文演讲,分享关于blockchain的介绍与应用。 一开始就说明了中国只有少数人口才有银行帐户,但人人都有手机的状况下,每个人都能在App中开发自己的货币,区块链就可以达到交易平等,不被中间商(国家,苹果)抽成的人们能获得直接利益。 但我自己是觉得,这样的App在送审时就会被挡下来了吧😂 在看完Bob的资料之后发现,他是我之前在udemy上看过的讲师啊,酷,iOSDC请讲者好给力啊! CoreML自己的AI自己训练之你就是那条龙 张景隆|是开发了CWMoney的大大! 介绍用python2.7做ML,最让我惊艳的介绍了用mockup转storyboard的插件还是库,但因为没有说是哪个插件也找不到当天简报,如果有人告诉是什么东西我会超感谢的,我好想知道啊!😂 然后提到seefood这个App,就跟我之前上次在Angela课上学到的App一样! 之前写过用过用CoreML或coffee的内容 Swift4 Day39:SeeFood图像识别 Swift4 Day55:影像辨识— — 1000种物件 Swift4 Day51:影像识别— —花(2/2) UnitTest最后一哩路 詹岳勋| KKBOX Group负责KKTV iOS app开发 听完觉得,KKBOX真的太帅了,人才啊,好想毕业去应征被洗一下脸啊! 单元测试好酷,在活动中也有用实际的案例介绍,光是讲切功能的时候就觉得真是走对教室了,真的学到很多,希望自己之后也能活用这些很棒的技能。其中也有提到很多交涉间的心法感觉很受用! iOS 11:设计与开发的关系(下) Taylor Hu | UXabc创办人及UI,数位产品设计师

XCTest快速执行用户界面测试

哦! blz ?? Uma perguntinha marota: Quanto tempo demora aexecuçãodos seus testes de UI? 通用演示文稿(例如,依赖于seu projeto,de Quantoscenáriosvocêtem等)。 厄瓜多尔的尼古拉·尼斯·康塞西和佩斯萨尔·阿尔萨斯·马尼拉·德·法泽尔等人在国际音乐节上发表了一些演讲。 Então,尤里卡!!! Desco ri quepossívelexecuta-los em paralelo,ou seja,rodar os testes emváriossimuladores ao mesmo tempo !! =) Irei dividir esse artigo em duas partes好吗? 第1部分-Rodar o mesmo teste emváriossimuladores (重要的有效布局) 第2部分-模仿偶像 QA,jáouviu falar做快车道吗? “ fastlaneéuma plataforma decódigoaberto destinada是简化的Android e […]

单元测试—具有Nimble + Snapshot的UIView

大家好,我目前正在撰写一系列文章,展示如何为iOS编写某种测试,这是第一篇。 在上一篇文章中,我谈到了TDD和一些测试框架,这些框架在讨论iOS平台上的测试时对我有很大帮助。 在这里,我们将看到如何对XIB文件创建的UIView进行单元测试,或使用制图通过代码对UIView进行单元测试。 如果您想了解有关制图的更多信息并查看代码,可以在这篇文章中查看。 现在让我们了解测试! 设置您的项目 首先,我们需要在项目上安装Quick,Nimble和Nimble + Snapshot。 您可以通过将Podfile pod ‘Nimble-Snapshots’和Podfile pod ‘Nimble-Snapshots’到Podfile来Podfile 。 不要忘记在测试目标上设置这些框架,如果没有框架,则可以在项目中创建一个新框架。 为此,您可以选择项目->目标-> +-> iOS单元测试包,并为其命名。 您的Podfile应该如下所示: 我们的swift文件只是一个简单的UIView自定义类: 使用查看代码 现在,让我们使用视图代码创建相同的测试。 首先,创建新的UIView自定义类文件,添加两个UITextField和一个UIButton并使用制图添加约束。 就像我们之前使用XIB进行的测试一样,这些屏幕截图将在您的项目文件夹中创建。 您可以随时检查它们。 Nimble + Snapshot如何工作? 您可能会问我-我怎么知道我何时打破观点或我打破了什么? Nimble + Snapshot会创建差异屏幕截图,而在您破坏测试时会失败。 让我们以实际的方式来看一下。 让我们注释一下我们的textFieldDidChange()方法以删除隐藏/显示行为。 如果您查看日志(可以按png过滤),Nimble + Snapshot会打印失败测试图像的路径。 打开Finder->转到->转到文件夹(Cmd + Shif + G)并粘贴路径。 路径类似于:/ /Users/youruser/Library/Developer/CoreSimulator/Devices/adeviceid/data/Containers/Application/anapplicationid/tmp/LoginViewTests/failed_LoginView_should_show_loginButton_if_user_set_username_and_password@2x.png 该文件夹包含三个图像:引用,失败和差异。 根据这些图像,您可以查看代码中的错误并进行修复。 测试UIView是了解您在编码时是否破坏某些东西或代码是否按预期运行的好方法。 如您所见,我们不需要编写测试来验证显示/隐藏行为,我们通过快照视图进行检查。 如果您想了解有关Snapshot和UITesting的更多信息,可以在realm.io上查看此演讲。

Swift中的单元测试笔尖

这是一个简短的教程,展示了如何将TDD原理应用于iOS项目中的笔尖设置,希望这将使您对一般的笔尖和TDD实践有更好的了解。 第一: 打开Xcode并创建一个新的单视图项目。 随便叫什么,但要确保启用了单元测试。 检查您的项目并删除所有样板代码。 您的ViewController应该看起来像这样:

使用解析器组合器在Swift中进行高级UI测试

我一直喜欢Cucumber风格在iOS上进行UI测试。 但是我真的不喜欢在计算机上管理15000个红宝石版本,更不用说确保团队运行相同的版本,gem(我在看着你calabash-ios )等等。 我也希望它简单:只需读取代码,然后按“运行测试”即可。 因此,我决定在Swift中编写一个简单的Gherkin解析器。 我希望测试的结构如下: 方案:导入按钮起作用 鉴于我在主屏幕上 当我点击“导入”时 然后打开导入屏幕 func I_am_on_the_home_screen(){ … } func the_import_screen_opens(){ … } 该方案位于最上方,执行功能位于其下方。 请注意,没有“ I_tap_Import”功能,我希望tap和type具有足够的通用性,以使我的框架能够理解它。 解析中 POC版本基本上是在进行字符串比较和模式匹配,但是您可以想象,这不是非常有效和灵活。 对于“真实”版本,我使用了解析器组合器。 观看Swift讨论解析数学表达式的视频时,解析器组合器引起了我极大的兴趣。 联机有一些解析器组合器的介绍,因此在这里我不会做太多详细介绍,但是它的大致工作原理是这样的:基本解析器(例如,字符)使用…悬念…组合器组合在一起! 创建更复杂的解析器( 字符串解析器= n × 字符解析器),并且可以应用一些逻辑来创建语法(字符串是直到行尾的每个字符) 我花了几天的时间来“获取”它,但是一旦我将所有内容放到白板上,一切都变得有意义。 简而言之,它解析场景时忽略了前导和尾随空格。 当有一个“ tap ”关键字时,它将使用加引号的字符串作为参数来调用预建的tap函数(例如, Given I tap on “continue”调用app.buttons[“continue”].tap() 当有’ type ‘关键字时,它将使用加引号的字符串作为参数来调用预构建类型函数(例如, Given I type “hello” in field “id”调用app.textFields[“id”].typeText(“hello”) )) 如果没有关键字,它将调用带下划线的分隔线命名函数(例如, Then I […]

MVVMC —在Runtastic适应MVVM设计模式

为什么我们关心建筑 在Runtastic,我们已经创建了38个iOS应用程序,我们的团队已经发展到20个iOS开发人员,并且我们的iOS代码库包含超过700,000行代码。 不断壮大的团队会导致代码库不断壮大,从而导致更高的复杂性和更多的代码依赖性。 除非您关心体系结构并在创建软件组件时遵循一些规则,否则这可能会以灾难告终: 遵循单一责任原则 可测试性设计 有明确的依赖性 保持代码可读性和可维护性 我们都从苹果公司的MVC开始,它可以变成Massive View Controller(在那完成了)。 尝试运行`find。 型f -exec wc -l {} + | 在项目的根目录中对-n`进行排序 。 您可能会像我们一样找到具有数千行代码的ViewController。 意识到使用MVC遵守上述规则时,我们面临着越来越多的挑战,因此我们着手寻找其他设计模式。 作为iOS社区中的当今热门话题,您可以在各种设计模式之间进行选择,包括MVC,MVP,MVVM或VIPER。 经过研究后,我们决定采用MVVM,但仍未解决一些问题,例如路由(显示新屏幕)或数据绑定。 因此,我们还仔细研究了VIPER,它在解决这些问题方面确实有很好的想法。 但是在VIPER中,我们经历了不利的一面,即存在大量的样板代码以及不习惯这种模式的开发人员的陡峭学习曲线。 最后,我们将从VIPER中学到的知识整合到我们自己的MVVM设计模式中。 MVVMC —什么是C? C代表“calçots”,这是加泰罗尼亚语起源的一种特定类型的洋葱,与我们的同事和这种模式的发起者相同。 在Runtastic博客上阅读全文