轻松测试项目。Yandex报告

我们在iOS的Yandex.Maps团队中使用针对CocoaPods的小插件和几个实用程序类创建测试项目。创建项目既快速又可靠。但是也许我们太麻烦了,用必要的设置和依赖关系手动组装项目并不难吗?在报告中,我从相反的角度出发:首先,我研究了手动过程,然后研究了我们的过程。


-首先,有一点背景。Yandex.Maps被收集超过一分钟。在我的计算机上,构建应用程序需要花费三分钟多一点的时间。我们在测试项目中进行开发,以便在每个装配上花费更少的时间。我们有足够的模块化,对于每个模块,我们都在做一个测试项目。在此测试项目中,正在开发功能。

现在,创建一个测试项目需要15分钟到一个小时。这是因为必须配置项目。也就是说,您需要配置签名,以便我们可以在与以前相同的设备上进行开发。有必要配置必要的库。在开发功能本身的过程中,我们会不断地返回并完成测试项目,以使其满足我们的需求。

为什么我们需要测试项目?为了节省组装时间。项目越小,组装速度越快,我们越有机会在设备上启动我们的应用程序,并且对我们的开发越舒适。



测试项目中应该包含什么?我们应该能够在用于启动和调试主应用程序的相同设备上启动,调试我们的应用程序。

该项目应配置为与主项目尽可能相似,以便在将功能从测试项目转移到主项目的过程中,我们不会感到惊讶。或者至少将收到的惊喜数量减少到最少。

在测试项目中,我们还需要一个最小的环境,这样我们就不会浪费时间创建UIWindows,设置库,翻转在库中处理授权的应用程序的调用等。

CocoaPods app_spec


我今天的整个故事将围绕CocoaPods功能app_spec构建。



App_spec就像常规子规范一样,只是它不生成可以连接的框架,而是可以在设备上启动的应用程序。



开箱即用,CocoaPods允许我们将Info.plist和xcconfig推送到app_spec中。这已经使我们能够很好地建立我们的项目。

但是如果我们要在每个pods_spec中编写庞大的字典,并为Info.plist和xcconfig赋值,那么我们将自己增加podspec,并且修改它们很不方便。如果需要更改某些内容,则必须进入每个podspec文件并使用笔进行编辑。无论如何,这是不方便的。



为了摆脱这一点,我们为CocoaPods创建了一个非常简单的本地插件。它甚至完全适合一张幻灯片。而且他做的一件事是:给我们DSL许可CocoaPods,该许可使用Info.plist和xcconfig中已经阻塞的值创建app_spec。这已经使我们能够配置签名,配置那些我们希望在测试项目中看到的重要内容。



问题:如何将权利转移到权利,更准确地说,将权利转移到哪里存储权利,以便我们可以将路径硬编码到插件中。

有两种方法。或指出仅位于我们存储库中的文件的路径,例如,指向主项目的权利。或在插件中存储测试项目的特殊权利文件。并使用相同的插件,将其复制到我们的developmentpod中。



我们选择了第一条道路,在这里我们遇到了一些困难。事实是,在我们的存储库中,podpo位于不同的子文件夹中。因此,我们无法为它们指明从developmentpod到授权文件的相对路径。

重要的是在此处强调您必须指定相对路径,因为该路径保留在pods_spec中。这意味着他将参与存储在Podfile.lock中的支票金额的计算。并且如果有绝对路径,那么这将影响支票金额。这意味着支票金额会有所不同,具体取决于调用$ pod install的文件夹,存储库所在的位置以及运行$ pod install的计算机。通常,这会导致冲突。



现在,我将展示同一插件的另一个小扩展,它使我们能够计算这些权利的相对路径。

我们知道从插件到包含权利的文件的相对路径(如果它们在同一存储库中)。而且在$ pod安装启动期间,我们知道了我们的developmentpod之路。此代码中的所有魔术都是高亮显示的行,我们在知道这两个绝对路径的情况下简单地计算了相对路径。



那么,当我们已经以这种方式配置了app_spec时,我们得到了什么?我们可以立即在相同设备上运行测试项目。我们获得了大量需要的设置,包括权利。

环境


我想谈的第二件事是环境,这是我们立即开始编写代码所需的最低限度必要环境。



在我们的例子中,我们需要已经配置了MapKit并已转移了密钥,并且在AccountManager中进行了呼叫转移。这是我们的授权库。她还需要引发系统调用,还需要传递密钥,包括通过引用传递应用程序的打开。

我们还需要一个带有地图和导航堆栈的开始屏幕,以便我们可以使用与Maps中相同的导航堆栈,并且可以更轻松地将要素从测试项目转移到主项目。这样的切入点使我们无需考虑即可立即开始编写有用的代码。



以您的情况为例,例如,设置Facebook SDK,您还需要将密钥传输到该SDK。您的库进行登录,您几乎肯定需要跳过应用程序打开链接。某种启动Windows启动控制器,以及用于运行要在测试项目中开发的主脚本的相同入口点。



我们是如何做到的?通过制作单个AppDelegate模板。在那里,我们初始化所有必要的环境,库。我们转发所有必要的电话,转移必要的钥匙。创建测试项目后,我们仍然需要为测试项目创建一个新的AppDelegate并从模板继承。

之后,我们将覆盖模板AppDelegate完成所有必要操作后调用的唯一方法。现在我们已经有了启动ViewController并在其之上可以运行我们要在测试项目中调试的脚本。

是/成为


如何在额头上创建一个测试项目,以及如何使用我今天描述的方法来创建它?

在额头上创建一个测试项目:

-我们转到Xcode,创建一个新项目(“文件”>“新建项目”)。

-输入名称(最好没有错误),在Bundle ID上签名。我们正在建立这个项目。

-更改Swift的版本,更改目标版本。我们正在尝试在设备上全部运行,编辑签名等。这是一个沉闷的过程。

-接下来,我们创建一个podfile,在其中连接依赖项,安装pod。

-之后,我们开始进行非常繁琐的工作,然后轻柔地配置AppDelegate,并传递所需的库初始化部分。

-使用我们的ViewController创建一个启动UIWindows

只有在那之后,我们才能启动有用的代码。相当不愉快的程序,请同意。

我们如何使用我在今天的报告中描述的最佳实践来创建测试项目?

-我们使用扩展名为CocoaPods创建了sample_app_spec,并以此作为开始。

-创建一个AppDelegate,并从模板AppDelegate继承它。

之后,我们可以开始编写有用的代码。

以这种方式创建测试项目更快,更可靠。我们绝对不会在签名设置中犯错误,我们绝对不会在项目设置中犯错。开始工作所需的所有环境都会立即接近我们。

能更容易吗?


您可以提出一个问题-这样可以更容易吗?当然。



我确定了三个难度级别。第一个是我今天谈到的,当时我们为CocoaPods制作了一个插件,该插件可以修复权利的路径,同时还提供了一个模板AppDelegate。

第二种方法是努力与利润之比的理想选择。它仅包含CocoaPods的插件,这是今天的故事中的第一个。也就是说,它只是替换Info.plist和xcconfig中的值。它已经使生活变得容易得多。

如果您不需要测试应用程序中的权利文件,或者您的测试应用程序彼此之间非常不同并且不需要通用组件,则此方法非常适合您。

第三种方法是最简单的,不需要任何准备。刚开始使用app_spec。从app_spec生成的项目是在与主项目相同的工作区中创建的。因此,它已经继承了例如Swift,目标版本以及您在Workspace中拥有的所有设置。您开始与他合作会容易得多。谢谢您的关注,今天,我将告诉您如何轻松创建测试项目,以及我们如何在Yandex.Maps中创建测试项目。

-首先,有一点背景。 Yandex.Maps被收集超过一分钟。在我的计算机上,构建应用程序需要花费三分钟多一点的时间。我们在测试项目中进行开发,以便在每个装配上花费更少的时间。我们有足够的模块化,对于每个模块,我们都在做一个测试项目。在此测试项目中,正在开发功能。

现在,创建一个测试项目需要15分钟到一个小时。这是因为必须配置项目。也就是说,您需要配置签名,以便我们可以在与以前相同的设备上进行开发。有必要配置必要的库。在开发功能本身的过程中,我们会不断地返回并完成测试项目,以使其满足我们的需求。

为什么我们需要测试项目?为了节省组装时间。项目越小,组装速度越快,我们越有机会在设备上启动我们的应用程序,并且对我们的开发越舒适。



测试项目中应该包含什么?我们应该能够在用于启动和调试主应用程序的相同设备上启动,调试我们的应用程序。

该项目应配置为与主项目尽可能相似,以便在将功能从测试项目转移到主项目的过程中,我们不会感到惊讶。或者至少将收到的惊喜数量减少到最少。

在测试项目中,我们还需要一个最小的环境,以便我们不会浪费时间创建UIWindows,设置库,将调用打开以将应用程序打开到处理授权的库等。

CocoaPods app_spec


我今天的整个故事将围绕CocoaPods功能app_spec构建。



App_spec就像常规子规范一样,只是它不生成可以连接的框架,而是可以在设备上启动的应用程序。



开箱即用,CocoaPods允许我们将Info.plist和xcconfig推送到app_spec中。这已经使我们能够很好地建立我们的项目。

但是如果我们要在每个pods_spec中编写庞大的字典,并为Info.plist和xcconfig赋值,那么我们将自己增加podspec,并且修改它们很不方便。如果需要更改某些内容,则必须进入每个podspec文件并使用笔进行编辑。还是没有钢笔。无论如何,这是不方便的。



为了摆脱这一点,我们为CocoaPods创建了一个非常简单的本地插件。它甚至完全适合一张幻灯片。而且他做的一件事是:给我们DSL许可CocoaPods,该许可使用Info.plist和xcconfig中已经阻塞的值创建app_spec。这已经使我们能够配置签名,配置那些我们希望在测试项目中看到的重要内容。



问题:如何将权利转移到权利,更准确地说,将权利转移到哪里存储权利,以便我们可以将路径硬编码到插件中。

有两种方法。或指出仅位于我们存储库中的文件的路径,例如,指向主项目的权利。或在插件中存储测试项目的特殊权利文件。并使用相同的插件,将其复制到我们的developmentpod中。



我们选择了第一条道路,在这里我们遇到了一些困难。事实是,在我们的存储库中,podpo位于不同的子文件夹中。因此,我们无法为它们指明从developmentpod到授权文件的相对路径。

重要的是在此处强调您必须指定相对路径,因为该路径保留在pods_spec中。这意味着他将参与存储在Podfile.lock中的支票金额的计算。并且如果有绝对路径,那么这将影响支票金额。这意味着支票金额会有所不同,具体取决于调用$ pod install的文件夹,存储库所在的位置以及运行$ pod install的计算机。通常,这会导致冲突。



现在,我将展示同一插件的另一个小扩展,它使我们能够计算这些权利的相对路径。

我们知道从插件到包含权利的文件的相对路径(如果它们在同一存储库中)。而且在$ pod安装启动期间,我们知道了我们的developmentpod之路。此代码中的所有魔术都是高亮显示的行,我们在知道这两个绝对路径的情况下简单地计算了相对路径。



那么,当我们已经以这种方式配置了app_spec时,我们得到了什么?我们可以立即在相同设备上运行测试项目。我们获得了大量需要的设置,包括权利。

环境


我想谈的第二件事是环境,这是我们立即开始编写代码所需的最低限度必要环境。



在我们的例子中,我们需要已经配置了MapKit并已转移了密钥,并且在AccountManager中进行了呼叫转移。这是我们的授权库。她还需要引发系统调用,还需要传递密钥,包括通过引用传递应用程序的打开。

我们还需要一个带有地图和导航堆栈的开始屏幕,以便我们可以使用与Maps中相同的导航堆栈,并且可以更轻松地将要素从测试项目转移到主项目。这样的切入点使我们无需考虑即可立即开始编写有用的代码。



以您的情况为例,例如,设置Facebook SDK,您还需要将密钥传输到该SDK。您的库进行登录,您几乎肯定需要跳过应用程序打开链接。某种启动Windows启动控制器,以及用于运行要在测试项目中开发的主脚本的相同入口点。



我们是如何做到的?通过制作单个AppDelegate模板。在那里,我们初始化所有必要的环境,库。我们转发所有必要的电话,转移必要的钥匙。创建测试项目后,我们仍然需要为测试项目创建一个新的AppDelegate并从模板继承。

之后,我们将覆盖模板AppDelegate完成所有必要操作后调用的唯一方法。现在我们已经有了启动ViewController并在其之上可以运行我们要在测试项目中调试的脚本。

是/成为


如何在额头上创建一个测试项目,以及如何使用我今天描述的方法来创建它?

在额头上创建一个测试项目:

-我们转到Xcode,创建一个新项目(“文件”>“新建项目”)。

-输入名称(最好没有错误),在Bundle ID上签名。我们正在建立这个项目。

-更改Swift的版本,更改目标版本。我们正在尝试在设备上全部运行,编辑签名等。这是一个沉闷的过程。

-接下来,我们创建一个podfile,在其中连接依赖项,安装pod。

-之后,我们开始进行非常繁琐的工作,然后轻柔地配置AppDelegate,并传递所需的库初始化部分。

-使用我们的ViewController创建一个启动UIWindows

只有在那之后,我们才能启动有用的代码。相当不愉快的程序,请同意。

我们如何使用我在今天的报告中描述的最佳实践来创建测试项目?

-我们使用扩展名为CocoaPods创建了sample_app_spec,并以此作为开始。

-创建一个AppDelegate,并从模板AppDelegate继承它。

之后,我们可以开始编写有用的代码。

以这种方式创建测试项目更快,更可靠。我们绝对不会在签名设置中犯错误,我们绝对不会在项目设置中犯错。开始工作所需的所有环境都会立即接近我们。

能更容易吗?


您可以提出一个问题-这样可以更容易吗?当然。



我确定了三个难度级别。第一个是我今天谈到的,当时我们为CocoaPods制作了一个插件,该插件可以修复权利的路径,同时还提供了一个模板AppDelegate。

第二种方法是努力与利润之比的理想选择。它仅包含CocoaPods的插件,这是今天的故事中的第一个。也就是说,它只是替换Info.plist和xcconfig中的值。它已经使生活变得容易得多。

如果您不需要测试应用程序中的权利文件,或者您的测试应用程序彼此之间非常不同并且不需要通用组件,则此方法非常适合您。

第三种方法是最简单的,不需要任何准备。刚开始使用app_spec。从app_spec生成的项目是在与主项目相同的工作区中创建的。因此,它已经继承了Swift版本,目标版本以及您在Workspace中拥有的所有设置。您开始与他合作会容易得多。
谢谢您的关注。

All Articles