Tag: Lisa Dziuba

如何轻松为iOS项目设置GitLab持续集成

从未使用过它时,如何使Gitlab-CI / CD 和 Fastlane集成? 我们最近在Lodoss团队面对了这一挑战。 在本初学者指南中,我将分享我们的分步过程,最初的期望和最终结果。 因此,您将能够轻松地自行配置GitLab-CI / CD和Fastlane。 我们为什么要持续集成? 一切都应有目的地完成。 我们考虑了自动化的以下必要要点: 自动运行Swiftlint 提高代码质量 减少体力劳动 自动运行UI和单元测试作业 这不是我们需要的全部清单,但是,这是一个很好的起点。 在我们的工作中,我们通常使用以下GitFlow ,并且还使用它来自动化CI / CD流程。 这是描述我们想要获得的成功案例的序列图: 此外,如果有必要(例如,从功能分支进行紧急构建以向管理人员显示新功能) ,则可以通过使用标签来使用所有这些序列。 为什么选择GitLab-CI? 我们有GitLab,但找不到使用其他东西的任何理由。 因此,我们决定使用它,为什么不使用😎? 对我而言,GitLab-CI / CD比Jenkins更面向开发人员。 至少因为它是针对管道,标签和分支的,而不像詹金斯那样有工作。 而且我们必须使用这些东西来获得必要的工作,而不是不用代码进行配置。 GitLab-CI / CD似乎是一种用于在远程计算机上运行脚本的工具。 没有更多,但足够了。 一段时间后,我们意识到使用Fastlane并没有关系。 因为它能够满足我们的所有需求。 结果,我们摆脱了其他工具的束缚。 因此,我强烈建议您使用Fastlane代替手动脚本或其他方法。 为什么选择Fastlane? Fastlane是自动化iOS和Android应用程序Beta部署和发布的最简单方法。 🚀它可以处理所有繁琐的任务,例如生成屏幕截图,处理代码签名以及发布应用程序。 我们决定使用Fastlane,因为它: 让生活更美好 减少自动化时间 拥有清晰的文档 提到的原因还意味着团队中的其他开发人员将很容易学习。 当然,简单的过程比复杂的过程要好。 设置GitLab-CI和Fastlane 设置您的Xcode项目 在Xcode中创建一个新项目。 为项目命名。 转到项目方案,然后如下图所示打开共享标志: […]

Swift中网络单元测试的完整指南

面对现实吧,编写测试在iOS开发中并不那么流行(至少与为后端编写测试相比)。 我曾经是一个单独的开发人员,但最初并未受过本地“测试驱动”开发人员的培训。 因此,我花了很多时间研究如何编写测试以及如何编写可测试的代码。 这就是为什么我要写这篇文章。 我想分享我在Swift中进行测试时发现的东西。 希望我的见解可以节省您在丛林中奔波的时间。 在本文中,我们将讨论测试101的开始: 依赖注入 。 想象一下,您正在编写测试。 如果您的测试目标(SUT,被测系统)以某种方式与现实世界相关,例如网络和CoreData,则编写测试代码会更加复杂。 基本上,我们不希望我们的测试代码依赖于现实世界中的事物。 SUT不应依赖于其他复杂系统,因此我们能够更快,时间不变和环境不变地对其进行测试。 此外,重要的是我们的测试代码不要“污染”生产环境。 “污染”是什么意思? 这意味着我们的测试代码将一些测试内容写入数据库,将一些测试数据提交至生产服务器,等等。这就是存在依赖项注入的原因。 让我们从一个例子开始。 给定一个应该在生产环境中通过Internet执行的类。 Internet部分称为该类的依赖项。 如上所述,当我们运行测试时,该类的Internet部分必须能够用模拟或伪造环境代替。 换句话说,该类的依赖关系必须是“可注入的”。 依赖注入使我们的系统更加灵活。 我们可以在生产代码中“注入”真实的网络环境。 同时,我们还可以“注入”模拟网络环境来运行测试代码,而无需访问互联网。 TL; DR 在本文中,我们将讨论: 如何使用依赖注入技术设计对象 如何在Swift中使用Protocol设计模拟对象 如何测试对象使用的数据以及如何测试对象的行为 依赖注入(DI) 开始吧! 现在,我们将实现一个名为HttpClient的类。 HttpClient应该满足以下要求: HttpClient应该使用与分配的URL相同的URL提交请求。 HttpClient应该提交请求。 因此,这是我们的HttpClient的第一个实现: 似乎HttpClient可以提交“ GET”请求,并通过闭包“ callback”传递返回的值。 HttpClient的用法 问题是:我们如何测试它? 我们如何确保代码满足上面列出的要求? 直观地,我们可以执行代码,为HttpClient分配一个URL,然后在控制台中观察结果。 但是,这样做意味着我们每次实现HttpClient时都必须连接到Internet。 如果测试URL在生产服务器上,那似乎更糟:您的测试运行在一定程度上确实影响了性能,并且您的测试数据已提交到真实世界。 如前所述,我们必须使HttpClient“可测试”。 让我们看一下URLSession。 URLSession是HttpClient的一种“环境”,它是Internet的网关。 还记得我们所说的“可测试”代码吗? 我们必须使Internet组件可更换。 因此,我们编辑HttpClient: 我们更换 与 然后我们添加一个新变量: […]

破解核心数据测试

核心数据是一个框架,它隐藏诸如对象生命周期和对象图管理之类的持久层的逻辑,以帮助您以高级方式管理模型层对象。 是的,Core Data对许多开发人员来说都是有争议的。 但是,它仍然是有用的框架:性能良好,并且得到Apple的支持。 关于核心数据的单元测试,有很多不错的文章,但是大多数文章集中在模拟上下文。 由于发布了持久性容器类NSPersistentContainer,因此越来越难以模拟上下文并将测试写入容器。 因此,在本文中,我将探讨一个新主题:为NSPersistentContainer编写测试,增强型核心数据。 我们将一起使用NSPersistentContainer设置核心数据堆栈,并为此编写测试。 TL; DR 我们将学习如何: 使用NSPersistentContainer构建核心数据栈 使用内存永久存储 引入两个测试双打:“假”和“存根” 做一个异步测试 先决条件 迅捷3 Xcode 8 核心数据基础知识 iOS 10(由于我们将使用NSPersistentContainer,因此需要iOS 10)。 以下是一些有关核心数据的好文章: 完整的核心数据应用程序(代码在Objective-C中,但是概念相同) 核心数据入门教程 我们的任务 现在,我们有一个简单的任务:实现待办事项列表系统,在其中我们可以创建,读取,更新和删除待办事项(CRUD)。 而且这个待办事项系统应该永久保存数据,以便即使我们终止应用程序也可以稍后获取它们。 因此,我们需要实现这些方法: 创建待办事项 提取所有待办事项 删除待办事项 提交对永久存储的更改 由于我们只想在需要时执行保存,因此我们不会在创建/编辑/删除方法中将NSManagedObjectContext .save()视为副作用。 相反,我们将其设为独立方法。 当用户按下“保存”时将允许保存数据,或者当用户离开当前视图时将其保存。 尽管通过使用NSPersistentContainer在iOS 10之后设置Core Data堆栈更容易,但最好具有一些基本知识。 我们将在以下各节中采用这些概念。 因此,在下一节中,我将简要介绍Core Data堆栈。 核心数据栈 根据苹果公司的说法,核心数据栈是框架对象的集合,这些对象是核心数据初始化过程的一部分。 核心数据堆栈中包含4个基本组件: 托管对象上下文 (NSManagedObjectContext):为托管对象提供便签本 持久性商店协调器 (NSPersistentStoreCoordinator):汇总所有商店 托管对象模型 (NSManagedObjectModel):描述商店中的实体 持久对象存储 :包含已保存的记录。 […]

轻松管理Swift项目中的不同环境

想象一下,您已经完成了应用程序的开发和测试,现在可以将其提交生产版本了。 但这是问题所在:您所有的API密钥,URL,图标或其他设置都针对测试环境进行了配置。 因此,在提交您的应用程序之前,您将必须修改所有这些内容以适合您的生产模式。 显然,这听起来不太好。 另外,您可能会忘记在庞大的应用程序中进行某些更改,因此您的服务将无法正常运行。 代替这种凌乱的方法,最好有几个环境并在需要时简单地更改它们。 今天,我们将通过最流行的方法来尝试组织不同的环境: 使用注释。 使用全局变量或枚举。 使用带有全局标志的配置和方案。 将配置和方案与多个* .plist文件一起使用。 1.使用注释 当您有2个分离的环境时,您的应用程序需要知道它应该连接到哪个环境。 想象一下,您拥有Production , Development和Staging环境以及API端点。 处理此问题的最快,最简单的方法是拥有3个不同的变量并注释其中2个: 这种方法非常肮脏,凌乱,会使您哭泣很多。 有时我会在黑客马拉松上使用它,因为代码的质量不起作用,而速度和灵活性才是关键。 在任何其他情况下,我强烈建议您完全不要使用它。 2.使用全局变量或枚举 另一种流行的方法是使用全局变量或Enum (这会更好)来处理不同的配置。 您将必须在3种环境中声明您的Enum ,并在某处(例如在AppDelegate文件中)设置其值: 这种方法要求您每次更改代码时都只在代码中设置一次。 与以前的方法相比,此方法要好得多。 它非常快速,可读性强,但有很多局限性。 首先,在运行任何环境时,您始终具有相同的捆绑ID。 这意味着您将无法同时在设备上拥有两个具有不同环境的相同应用程序。 一点都不舒服。 同样,在每个环境中使用不同的图标也是一个好主意,但是采用这种方法,您将无法更改图标。 同样,如果您忘记在发布应用程序之前更改此全局变量,则肯定会遇到问题。