持续集成 测试开发之路----CI (开发部分的持续集成)

孙高飞 · 2016年06月30日 · 最后由 孙高飞 回复于 2016年10月18日 · 3937 次阅读

背景

如今软件行业发展到今天,大家都有一个共识就是产品质量光靠测试来保证是扯淡的。应该从团队的各个角度都对产品质量做一层保障。我们架构师和 CTO 也总是跟我说:不要总从技术角度着手,你要想办法从流程上提高效率,增加质量保证。想办法让所有人都参与到测试当中去,只是你自己在测试不叫 QA,你只是测试人员。能从各个方面保证产品质量你才是 QA。虽然他们没怎么做过测试工作,但不得不说他们的方向是正确的,在这样的领导下面干活确实痛快。我说要搞 CI 就支持我搞 CI,我说让开发人员写单元测试就帮我去游说开发的同学们写 UT。从毕业到现在第一次干活干的这么痛快过。领导给个正确的方向,然后就让小弟们自由发挥,他全力支持。这样的模式真的是我梦寐以求的工作环境。据说 06 年我们老板在 ACM 夺冠的时候,就是我们架构师负责测试的。所以他特别重视测试,每一个测试的候选人都要他面一次。 我只能说我是走运的。在这样的环境下工作能避免很多在其他公司碰到的无形的屏障
好了,说了很多废话。我这人啊,一上了年纪就喜欢啰嗦。咳咳,说正题。之前我和领导一直在游说开发的同学写单元测试。效果不错,API 模块的覆盖率已经到 36% 了。但是仍然需要一套 CI 的机制来辅助单元测试的执行和 bug 定位等工作。我之前就说过测试开发很重要的工作之一就是帮助其他人更容易的进行测试工作。所以这个活理所应当的在我身上了。

测试框架的选型

首先从框架选型开始吧。开发的同学们着实不了解这些。所以需要我向他们推荐一些东西。

  1. Junit:本来想用我熟悉的 testng,但是开发的同学说测试 springmvc 只能用 Junit。所以只能这样了
  2. mockito:大名鼎鼎的 java mock 框架。解耦,提高覆盖率,行为测试的神器(专门开会培训了一下开发怎么用)。
  3. mockmvc:想测试 springMVC 的 controller 的话,只能用这玩意了
  4. hsqldb:java 的 memoryDB,能够模拟真实的数据库,但是运行在内存中。单元测试的不二神器,提高运行速度,跟真实环境解耦。

OK,从上面可以看到,我们通过各种 mock 和 memoryDB,已经跟真实的环境彻底解耦了。这样其实在CI非常重要的一步自动化部署环境,我们已经可以忽略不做了。同时还提高了覆盖率和运行速度。

CI 工具(Jenkins)

这个不用说了,大部分用的都是这个。需要装一些插件,我列几个主要的吧。

  1. git hub
  2. gitlab
  3. jacoco
  4. extend email
  5. HTML report publisher
  6. 。。。等等各种跟 git 相关插件,我现在想不起来了

我们的需求其实是这样的。由于之前框架选型的时候我们跟真实的环境彻底分离,所以其实我们的运行速度是十分快的。所以我们要求每一次开发 push 或者 merge 代码的时候都触发执行一次。每一次拉取最新的代码(需要开发有良好鲜明的分支策略)。然后生产测试报告,覆盖率报告,git 状态,代码变化记录等等。所以我就按下面的步骤开始工作了。

具体步骤
首先源码管理是必须的,在源码管理里面使用 git

构建触发器

注意上图中后面的 URL,那是 Jenkins 当前 job 的 service 的 URL,是需要你加到 git 的 webhooks 中的, 如下图

这样当你勾选 push 和 merge 的 events 的时候,git 就会通知 Jenkins 触发 job。这就是 webhook 的作用,这样避免了 SCM 的那种轮询式监控 git 的低效率

覆盖率设置

github 设置

github 的设置,可以让你得到详细的代码变更信息,这个也很重要

我们看看效果

OK,主要的设置我们了解了,下面我们看看运行的效果吧。

首先,我们从 build 的历史中可以看到,是哪个开发的同学的哪个 push 或者 merge 操作触发了我们的 build

然后,我们看看 job 的整体信息。上面有历史的测试结果趋势和代码覆盖率的趋势图。最新的测试结果和代码变更

每个 build 的详细信息

我们点进去一个运行记录后,发现我们可以得到一些信息:*这次 push 或 merge 的代码变更信息,单元测试的结果,fail 的 case 的详细信息,代码覆盖率的信息,这次 build 的分支信息等 *。 我们点进去每一个信息后都有详细的信息,例如:如果我点击 changes 中的代码变更信息。我们就跳到了 git 的 commit 的详细信息中去了,如下图。

这个功能满重要的,如果开发的单元测试突然失败的话,我们可以看一下这次运行相对于上一次都有哪些代码改动。很可能就是这些代码改动造成了单元测试的失败。bug 定位的利器

总结

其实大家还可以扩展很多功能,Jenkins 还是挺强大的。例如你可以控制一旦执行成功就 merge 到其他分支中等等策略。不过这有点配置管理工程师的意思了。我暂时还不关注。其实大家也看到了,这过程中我一行代码没写。做的事情无非就是推行单元测试的 CI,制定一个流程,推荐和培训开发人员怎么使用测试框架,怎么设计代码可测试性比较好,在 Jenkins 上配置一些 job。看上去有点打杂的架势。跟我们想的测试没什么关系。但是我觉得,我们这些人之后的发展,也许会越来越靠这方面,现在各个企业都在缩减专职测试人员的数量,全民测试的时代,也许不远了。我也算给大家踩踩坑,看看这种模式可行不。目前来说发现的 bug 还是挺可观的,只是开发一直编写 UT 和维护这些 UT 的成本我们以后要控制一下,增加一些更有用的策略,不盲目追求覆盖率,协商比较合理的流程和规范等等,不过这些就让我去慢慢的踩坑吧

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 30 条回复 时间 点赞

好文,学习

说得挺详细,赞~

问个初级问题,你们现在是每次提交都全量单测吗?还是根据 diff 只跑变更部分?

每个坑都发上来让我们学习学习,哈哈

#2 楼 @chenhengjie123 暂时还是分层跑整个层的全量哈,像那种分析 push 代码的路径跑相对 case 的技术我还木有实现。那种技术感觉比较高大上~我还没开始弄呢。等什么时候单元测试慢到影响效率了再说吧。暂时我们用 mock 用 memoryDB 跟真实环境解耦,跑的还是很快的。数秒就结束了。不知道咱们社区有没有前辈搞过这种分析代码路径的技术。我只是在 Google 测试之道中看他们用过,还没真见到过这种技术的实现

#4 楼 @ycwdaaaa 这个我也不清楚。

不过你们的单测 1 分钟内就跑完,确实也没太大必要做这么复杂的。

#5 楼 @chenhengjie123 恩,等跑的慢的时候再说吧。估计那种技术实现起来挺复杂的。现在也没工夫研究他了

弱弱的问一下显示代码变更的插件是什么?

#7 楼 @apm017 git hub 和 gitlab

#8 楼 @ycwdaaaa 感谢回答,svn 也有相同功能的插件吗?

#9 楼 @apm017 这个不太了解~你搜一下吧。 话说现在很少有人用 svn 了吧

1.git 的 hook 上添加了 Jenkins 的 service url
2.Jenkins 勾选了 Build when a change is pushed to GitLab.
Build on Merge Request Events
3.在 git 上测试 Test hook ,提示 success 了,但是没有触发 Jenkins 的 job
4.push 代码也不能触发 Jenkins job
这能是什么原因呢?

学习了很棒

#11 楼 @cherry520 你好像只勾选了 merge 的事件。 push 的事件没勾选吧?

#13 楼 @ycwdaaaa 在 Jenkins 中勾选了 merge、push,下面的都勾选了,如图

对 git 里的链接使用 jmeter 或者 postman 直接 post 请求,Jenkins 就会执行
在 git 中使用 Test hook,提示成功,但是 Jenkins 不执行

#14 楼 @cherry520 jenkins 的 job 的 URL 也输入进去了? 就是你打马赛克的那段

#15 楼 @ycwdaaaa

这样对吗?这个不是 Jenkins 直接出的链接,那个链接提示不对,这个是 Jenkins 上执行 job 的链接

#15 楼 @ycwdaaaa
是这个链接

#17 楼 @ycwdaaaa 这个自动显示的链接也是试过,也是不能触发,直接执行还是 404

#18 楼 @cherry520 那应该不能啊。这就是 webhook 的入口啊

#19 楼 @ycwdaaaa 弄半天了没弄好😭 感觉这个配的没问题,就是加你说的链接,估计是其他的问题,我再找找,谢谢

#19 楼 @ycwdaaaa webhook 的入口 返回 404,那应该是 Jenkins 不能用吧

#21 楼 @cherry520 git 的服务器能 ping 通 jenkins 么?

#22 楼 @ycwdaaaa 这个没试,没权限我试试,

这个 Jenkins 不需要什么插件或是配置,就直接能用的吧?

#24 楼 @ycwdaaaa 那就确定不是 Jenkins 的配置问题了,我找人确认下是否通,感谢耐心指导

#19 楼 @ycwdaaaa

可以用了,使用的这种 token 的,我的用下面的那个不能打开,问了下说是开启了安全认证之类,还没太懂,先用着。

#26 楼 @cherry520 嗯,能用就好~恭喜~

#27 楼 @ycwdaaaa 谢谢,先不用懂了,先用着,用着用着就懂了

楼主,testNG 可以和 mockito 一起用吗

#29 楼 @hustar0102 可以啊,这没什么冲突的

ABEE ycwdaaaa (孙高飞) 在 TesterHome 的发帖整理 中提及了此贴 01月12日 13:47
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册