一年岁月大家从几人的开发协会发展到十多少人的团伙,一般会弹框输入密码

代码覆盖率 — Coveralls

Coveralls
We help you deliver code confidently by showing which parts of your
code aren’t covered by your test suite. Free for open source repos.
Pro accounts for private repos. Instant sign up through GitHub and
Bitbucket.

在明星项目Express的Github项目主页中,你可以看出这般的价签:

图片 1

Coverage Status

结缘着TravisCI的自动化单元测试,加上这多少个测试覆盖率,提高你对品种的信念。

至于 LeanCloud 的测试意况

  • 仓储框架,数据层.适合写单元测试
  • 系列早起就有单元测试
  • 交付一个 PR, Jenkins 上跑单元测试
  • 覆盖率 80%
  • 直接写测试, 用来检测正在开发的新接口
  • 直白写测试, 再次出现 bug
  • 积累的测试越多越强大
  • 二种现象: 改完部分代码后, 本地跑有关的测试, 发现某些不经过: Jenkins
    自动化跑测试的时候, 发现新型改动引起其他题目, 某些测试不经过
  • 放心的文告与重构, 剩出手动验证的年华

高速进展关联 — Slack

Slack
A messaging app for teams who see through the Earth

深信大部分集体都是利用微信举办联系的,
再四遍,最为一个有逼格的协会,我们应用了Slack举行集体上的关联,在Slack上,你可以创制频道(Channel),不同Channel不同的人举办着不同的话题交流。大家有宏图的Channel、产品的Channel、开发的Channel。我最欣赏的是,Slack可以接入很多第三方服务,Github是内部一个。

联网Github之后,项目的每一个Commit、PR之类的动态消息,会被推送到聊天室中。

助你随时掌控项目动态。

Slack接入Githu只是内部的一个小功用而已,更强有力的在于Slack本身,利器咋样用,待君逐步体会。

,Slack有一个硬伤:不会不错上网,用持续呀。

Mousepose

屏幕上鼠标地方/按键高亮

武装Github — ZenHub

ZenHub
Project management inside GitHub
Transform your GitHub issues

正如Zenhub所说,这是一款项目管理工具,嵌入式集成到Github中。作为插件,它的UI完全迎合了Github,以至于你难以启齿分别出什么功用是Github的,哪些效率是Zenhub的。

比方你用了ZenHub,它会提供给您:

  1. 一套任务面板,给不同的天职提供不同的泳道,直观的体现每个任务的速度。于是乎我丢弃了Teambition。
  2. 一套个人的Todo
    List
    ,如果有一个issue或者一个PR需要您来处理,但您现在没有空,你可以把它添加到Todo
    List中,于是乎我又遗弃了Wunderlist。
  3. 一套花色图标与总计,结合着Github自带的品类图表,那些提供更多维度的数据,可是个人感觉意义不太大。
  4. 再加一些小彩蛋,由于它是用作插件格局嵌入到Github中的,所以会在许多地方提供部分这样这样的按钮,等着您去发现了。

Travis CI

travis-ci

  • 设置 Test Scheme 为 shared
  • Travis 上连续 Github 账号, 读取项目
  • .travic.yml
  • Travis 免费版可以给开源项目测试, 收费版给个人项目测试
  • Travis 测试相比较慢
  • 要是会用 Jenkins 自己搭建自动化测试框架, Travis 弹指就会

language: objective-c
xcode_workspace: XXX.xcworkspace
xcode_scheme: XXX

一年时间我们从几人的支出团队发展到十几个人的公司,最初的我们只有六个后端加多少个前端,而且里面三个依旧实习生。
但今时不等从前,现在我们有前端、后端、测试、运维、设计、产品、交互,成功集齐了三个兵种,可以召唤神龙,赐我们一个飞快的开支集团。
用作一个敏捷性的支出公司,我们要保持高效的迭代速度的还要确保高质料的代码,这是一个劳顿的过程。

Lioo

  • 翻看 framework 的编译架构 lipo -info
  • lipo 合并不同架构的 framework

代码Review — Reviewable

Reviewable
GitHub code reviews done right

假如您认为Github自带的Review还不够满意的话,可以品尝一下这款产品。
当你提交一个PR之后,在您的PR中,会在你的评论框中置放这样的按钮

点击进入Reviewable的页面对应的PR举办review。

与此同时一个PR没有做到Review此前,是会一向被警告,让你警惕举行联合。

何以要写单元测试

  • 当发现自己改了代码后,平时需要手动验证是否正常时
  • 客户反映问题, 使用测试找到题目
  • 开发新接口, 编写相应代码后加盟测试
  • 察觉改了代码后, 平日引起其他地点的 bug 时
  • 六个人合作的品类, 可能付出其旁人的类型
  • 高质料/流行的开源项目一般都有充足的单元测试

本子管理 — Git~hub

「起先的先河,我们如故子女」(出自《新加坡路的日子》)

千帆竞发的始发,我们如故用着SVN,代码存储在商店的服务器中,只有一个拨出,提交代码无需审核,无需单元测试。因为我们只有几人……

作为一个有逼格的集体,后来大家用上了Git,并且把代码迁移到Coding中去,然后引入了名为「git
flow」的工作流,关于这一个工作流能够参考我们非凡的作品:「公司级开发:Gitflow
Workflow工作流」

Coding真的是一款很正确的出品,可称之为业届良心。

干什么当初并未一向用Github,因为私有仓库贵啊……

但,作为一个有逼格的团协会,我们是不会满足于此的。Coding自身的劳动很不利了,然而相对于Github的部分正式的第三方服务,贫乏了那么一些竞争力。大家立刻想接入持续集成的劳动,不过没法找不到支撑Coding的第三方服务,代码Review也并未一个更让我们舒心的体验,我肯定大家要求相比较高。再添加Coding的五遍down机,其中两次是大家准备发布新本子的这个早上…..

归根到底有一天,我们老大两眼发光的跟大家说:我们要买Github的劳动了,申请到资本了。

于是,我们浩浩荡荡的迁徙代码库。

搬迁到Github之后,大家开首接入各方工具,提升我们的工作成效(钱可不能够白花啊)。

Pod

  • 地点引用 Pod, –no-repo-update –verbose
  • 发布 pod, podfile 配置

最后

再两回,作为一个有逼格的公司,我们照样不会满意现状。


设若本文对您有用
请不要吝啬你们的Follow与Start
那会大大辅助我们后续创作

「Github」
MZMonster
@MZMonster
JC_Huang
@JerryC8080

框架平息

  • expecta expect(error).not.beNil()
  • specta describe(“”) it(“”)
  • Kiwi describe(“”) it(“”)
  • Tdd和 BDD 框架的弊端: 和 Xcode 结合不好, 比如没有测试按钮,
    右边栏没有列全单元测试

穿梭集成 — TravisCI

TravisCI
Test and Deploy with Confidence
Easily sync your GitHub projects with Travis CI and you’ll be testing
your code in minutes!

不领悟您有没有好奇Github上的有的影星项目的这么的竹签:

图片 2

Build Status

以此是Express的构建状态的标签,格式是svg,它会依照Express的构建状态改变。假诺Express的某两回提交是未曾经过TravisCI构建的,他会成为
build failing。(有心人可以点击这一个标签进入看看。)

咱俩投入TravisCI紧要目标是用于自动化的单元测试,每三遍Commit与PR,TravisCI都会从Github仓库中拉取代码,然后实施我们写好的单元测试,通过与否会通过情景显示出来。
集合的人倘诺见到build
failing,就不会联合了,这在必然水平上保险与加强了代码的质地。

TravisCI除了可以用来自动化单元测试,还足以自动化部署,能够设定,通过测试之后,就活动部署上线。

TravisCI对于公开仓库是免费的,但对此私有仓库是要收费的,而且价格也不便民。
如果你认为贵,这里还有一个得以代表的:CircleCI
TravisCI可以做的,它都得以做得到,而且会提供一个免费的私有仓库。

好用的工具

  • Revel(越狱) 分析任意 app 的 ui 界面
  • Flex(越狱)
    分析任意 App 的网络请求, ui 界面, 本地文件, NSUserDefaults, Log 等

再也推送 Podspec

def is_podspec_exists(name, version)
    podspec_url = "https://github.com/CocoaPods/Specs/blob/master/Specs/#{name}/#{version}/#{name}"
    url = URI.parse(podspec_url)
    req = Net::HTTP::Get.new(url.to_s)
    http = Net::HTTP.new(url.host, url.port)
    http.use_ssl = true
    res = http.request(req)
    res.code == '200'
end

Jenkins 配置

  • 要让 Jenkins 能读到您的代码
  • 布置 Hook, 当提交 Github PR 时, 发送响应的事件到 Jenkins 上
  • Jenkins 要明白是哪一个 PR, 来拉取最新的代码
  • 设置 Jenkins 测试脚本
  • 当测试败北之后, 要让 Genkins 通告 Github 页面
  • 测试战败后, 可发送通知到 Slack 或邮件

export LC_ALL="en_US.UTF-8"
pod install --verbose --no-repo-update
if [ -e test.sh] then 
    ./test.sh
fi

覆盖率

从 Xcode7 开首,自带覆盖率高爆效率. 设置要点:

  1. Scheme 中开启 Gather Coverage Data
  2. 针对 App Target 来测试, 而非 Test Target
  3. We’ve Got You
    Covered
  4. 什么查看单元测试具体运作需要精晓怎么代码

图片 3

覆盖率.png

Xcode 7 之后的脚本

xcodebuild                          \
    -workspace AVOS.scworkspace     \
    -scheme AVOSCloudIMTests        \
    -sdk iphonesimulator            \
    clean                               \
    test &&                         \
xcodebuild                          \
    -workspace AVOS.scworkspace     \
    -scheme AVOSCloudTests          \
    -sdk iphonesimulator            \
    clean                               \
    test                                \

Jenkins 如何知道测试失利或者成功

  • 依照进程重临值. 假设是0, Jenkins 认为测试成功, 否则失败
  • Xcode 7 在此以前, 即便 Xcodebuild test 失败了, 依旧重临0; Xcode 7 事后,
    失利了回去65

实现思路

  • Jenkins 读取你的代码
  • 读取发布版本
  • unlock keychain, 构建一个门类会弹出输入密码框, 来读取签名的 keychain

execute_command('security unlock-keychain -p "xxx" ~/Library/Keychains/login.keychain')

在命令行中解Keychain, 一般会弹框输入密码

iOS 单元测试异步处理

#define WAIT(name)                                                          \
do {                                                                        \
    [self expectationForNotification:name object:nil handler:nil];          \
    [self waitForExpectationsWithTimeout:60 handler:nil];                   \
} while(0)

#define NOTIFY(name)                                                            \
do {                                                                            \
    [[NSNotificationCenter defaultCenter] postNotificationName:name object:nil];\
} while(0)     


- (void)waitNotification:(const void *)notification {
    NSString *name = [NSString stringWithFormat:@"%p", notification];
    [self expectationForNotification:name object:nil handler:nil];
    [self waitForExpectationsWithTimeout:AV_YEAR_SECONDS handler:nil];
}

- (void)postNotification:(const void *)notification {
    NSString *name = [NSString stringWithFormat:@"%p", notification];
    [[NSNotificationCenter defaultCenter] postNotificationName:name object:nil];
}

长途自动化测试

  • 搭建 Jenkins
  • 当地空闲的 Mac 电脑或将 Mac 电脑拿到多少基本
  • 测试脚本, 设置项目
  • Github PR 构建插件:
    ghprb
  • 配置 Jenkins Job
  • 地面测试能发布出测试的 70% 好处, 远程自动化则表明出 100% 的好处
  • Github 上配备 Setting->Webhooks ,添加搭建的自动化测试平台,
    就可以进行自动化测试

自动化 Pod 推送

def push_podspec_in_path(path)
    iterate_r(path, 'podspec') do |file|
        podspec_name = File.basename(file, ".podspec")
        podspec_version = version[1..-1]
        exists = is_podspec_exists(podspec_name, podsepc_version)
        if exists
            log("#{podspec_name} #{podsepc_version} exists!")
            next
        else 
            log("#{podspec_name} #{podsepc_version} not exists, now try to push it")
        end

        ok = false
        for i in 0..10
            ok = system("pod truck push #{file} --verbose --allow-warning")
            if ok
                log("success to push #{file}")
                break
            else 
                log("failed to push #{file}")
            end
        end

        if !ok
            exit_with_info("")
        end
    end
end

怎么写单元测试

  • 模块化代码, 数据层与 UI 层分离
  • 最少的测试代码达到最高的覆盖率
  • 异步处理
  • 框架选用
  • 覆盖率

expecta

远程打包发表

  • 发表脚本
  • Jenkins 上配置 Job 运行
  • LeanCloud 上是公布框架, 远程打包 SDK 推送到 Github 仓库,
    同步网站更新
  • 针对 App, 四核没必要远程打包发布

相关文章