Tag: Ahmed Sulaiman

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: 我们更换 与 然后我们添加一个新变量: […]

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

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