前几天 Cocoapods release 了 1.3.0 ,一个比较令人激动的功能是可以在 pod 内部添加测试了。

过去我们如何添加测试

在过去不支持这个功能的时候,如果要为一个 pod 添加测试就需要另外一个工程依赖之,然后把测试文件都添加到离此 pod 十万八千里的地方,如下图所示,

这样子的弊端是十分明显的,

首先就是代码和测试分离了(关于为什么要把代码和测试放到一起,这篇文章解释地很清楚)。这种分离还不是同一个 project 中不同 target 的分离,而是不同 project 的那种分离。也就是说,我为了看到这个 pod 中的测试,还必须要下载对应的 project 打开才能看到。

其次,这个 pod 中的测试没法办作为一个 target 单独运行。当然了,这只是个小问题。

现在我们如何添加测试

那 CocoaPods 1.3 之后是怎样了呢?

可以看到,源码和测试已经在一起了。如果我们想看到对应 pod 中的测试,现在已经不需要下载它 Example 或者 Demo 的 project 来看了,而是可以直接在对应的 pod 文件夹中看到,十分方便。而且这个 pod 中的测试可以通过一个单独的 target 运行起来(如果看不到需要在 Manage Schemes 中把测试 target 勾选 show)。于是上面两个问题都得到了解决。

举个例子

我的一个 pod pangu.Swift 收到了一条来自 @Gao JiJi 的 issue,

作为一个有追求的 engineer,怎么会不写测试呢?我们就以这个 repo 为例,看看如何为这个 pod 添加测试。

首先你要确保 Cocoapods 的版本 >= 1.3,版本不够的同学可以执行,

1
gem install cocoapods

打开对应的 podspec,添加下面几行,

1
2
3
4
5
6
7
8
9
Pod::Spec.new do |s|
# ...
s.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'Tests/*.swift'
end
end

意思是我们添加了一个叫 Teststest_spec,里面测试文件的位置在 Tests/*.swift

如果你的测试需要依赖其它 pods,可以像 sub_spec 一样,添加 test_spec 的 dependency,具体做法 cocoapods 中的那篇文章中有写。

然后我们就可以在 Tests 目录中添加测试文件了,添加完毕后别忘记自己测试一下,然后就可以升级个版本然后 push 到 spec repo 中了。是的,就是这么简单。

对于此 pod 使用者,如果你不想看到它的测试,那什么都不用做就好了。但是如果你想在工程里看到并运行对应的测试,就需要给 Podfile 中的引用添加一个参数 testspecs

1
2
3
4
5
target 'Demo' do
pod 'Pangu-Swift', :testspecs => ['Tests']
end

这个参数对应的是它 podspec 中的 ‘Tests’。

更改之后记得 pod install,这样,此 pod 中的测试文件就都被引入了,而且还多一个测试的 target 以支持单独运行。

Something else

  • testspec 和 subspec 一样,都支持多个。如果你的 pod 测试太多,可以把它们拆到不同的 testspec 中
  • 写测试是一种美德