近日,极狐(GitLab) 江狐会第十四期在北京圆满落幕。

会上,途游游戏运维安全部研发负责人刘勇基于使用极狐GitLab 提高单元测试 ROI 的实践与体会,进行了《途游游戏敏捷开发工程实践》主题分享,为线上线下众多云计算用户、企业 IT 和运维工程师、架构师、开发者,以及开源和 DevOps 的爱好者们提供一些参考。

本文整理自途游游戏刘勇分享的核心内容,欢迎在公众号【极狐GitLab】首页消息对话栏回复“途游”获取 PPT,enjoy~

单元测试在敏捷开发流程中有什么意义?


单元测试是指对软件中的最小可测试单元进行检查和验证,一个单元测试就是一段自动化代码,这段代码调用被测试的目标单元,检查目标单元的行为是否符合开发人员的预期。

如图 1 所示,单元测试处于测试金字塔的最底层,也就是软件研发的早期阶段,属于白盒测试,是开发的组成部分。

图 1

那么,单元测试在敏捷开发流程中有什么意义呢?

从研发质量角度考虑

敏捷的核心即拥抱变化,但变化带来风险。无论是因为重构、需求变更或其他导致代码必须要变更的时候,单元测试可以第一时间发现变更的代码是否会对业务逻辑造成破坏性的影响,这是单元测试最大的价值——守护程序的业务逻辑

第二,“Talk is cheap,show me the code”,单元测试为研发人员提供了被测试代码的功能和使用案例,相当于更详细的文档,能够对改善代码结构产生积极的影响。

第三,有了高质量的单元测试,开发人员可以对已有代码进行有信心的变更,不管这种变更来自于业务和需求的变化,还是来自于重构。

最后,任何看起来难以测试的代码也将难以维护、发展,并且在其整个生命周期中都会受到许多错误的影响。因此,单元测试促使开发人员重新思考他们的编码方式,提升编码质量

从测试的经济学角度考虑

如图 2 所示,85% 的 Bug 在 Coding 阶段产生,而传统的测试人员往往集中在 Function Test(功能测试)、System Test(系统集成测试)阶段,这些阶段修复 Bug 的成本数十倍增加,发布后的修复成本达到惊人数百倍

图 2

Bug 发现的越早,修复成本就越低。后期 Bug 的修复不仅增加沟通时间,还可能引入新的问题,增加测试验证时间,项目的进度也有延迟上线的风险。

因此,我们要尽可能地把测试左移,在软件开发的早期阶段通过单元测试发现 Bug  ,更低成本处理 Bug ,提高代码质量,优化测试过程的投资回报率。

图 3

总而言之,单元测试杠杠好!

那么如何实施单元测试?

基于极狐GitLab 的单元测试四步法


途游游戏使用极狐GitLab 进行软件研发实践,刘勇有一个深刻体会:极狐GitLab 能够很好地帮助你将花费很多精力、时间和成本,好不容易写出的单元测试的价值充分挖掘出来。

首先回答一个问题:单元测试放在哪里?

可以放在单独目录里,如Java,Maven tests 目录、Package 和被测代码在一起;也可以和源代码在一起,如 Golang。原则上要尽可能离源码近

如何实施单元测试?刘勇归纳了单元测试四步骤(AAAC)

  • Arrange 筹备:为测试做准备;

  • Act 执行:给予特定行为所需的上下文和输入并执行;

  • Assert 断言:判断结果是否符合预期;

  • Clear 清理环境:为后续测试保证上下文干净,测试之间彼此隔离没有依赖性。

1. Arrange 筹备:编写单元测试

Arrange 阶段就像多米诺骨牌之前的排列工作,为了接下来的行为可以被激发,包括但不限于准备所需的输入(对象、基础数据结构等)、启动/终止某服务如 MQ 或数据库、将一些数据预先存入数据库,为尚不存在的用户生成一些凭据等的事情。

极狐GitLab 有一个功能就是可以在容器里边提供很多预置的 Service,让数据库也好, MQ 也好,都可以很轻松地预先准备好。这样的话,当你在测试一个函数的时候,它的环境、数据库都会自动在你的 CI 环境中就绪,大幅提升单元测试的效率,是很贴心的服务。

✨ 单元测试准则参考

  • 每个测试范围职责单一(不要试图用一个测试函数测试10个功能点)

  • 执行速度快(总体执行时间不超过5分钟,单个用例执行时间3秒以内,TDD闭环时间)

  • 自动化测试思路,避免人工查看,比如用 assert 代替 print 信息人眼识别结果

  • 良好设计并命名的可复用单元测试体系

  • 测试可以很容易的在 CI 流水线中在程序员的开发机上运行,不需要搭建或者很容易自动化搭建所需的测试环境

  • 单元测试执行结果稳定,一个 10 次执行,8 次通过 2 次失败的单元测试是错误的

  • 每一个测试函数所依赖的单元测试的环境应该是固定并干净的,测试函数彼此隔离,一个测试函数所依赖的环境不能是另一个测试函数执行后的结果

2. Act 执行:应用单元测试

Act 阶段对应多米诺骨牌,即是指尖轻轻推动第一块触发牌。费了很多的时间和精力,终于写完了单元测试,也能跑了,这个时候我们怎么去用它呢

首先来看极狐GitLab 上的工作流(如图 4),途游游戏在此基础上稍加改动:把代码 Commit 之后,Push 到我们远端的服务仓库时会进行一次单元测试执行,在合并的时候会进行第二次次单元测试执行,在合并之后还会进行第三次单元测试执行。

图4

我们如何控制单元测试在何时执行?途游游戏在极狐GitLab上有两种触发方式,分别是:

(1)代码合并到主分支之前,每次代码 Push 到 MR 源分支,并基于合并后的代码(极狐Gitlab Merge Request Pipeline + Merge Result Pipelines)

首先,我们有一个主分支,往往是 Main 分支。这时候,如果我们要开发一个新功能,可根据这个新功能创建一个 Feature Branch 即特性分支,程序员会工作在特性分支上。

接着,我们会不断 Commit 代码,并且 Push 到在极狐GitLab 上创建的特性分支上,这个时候就会触发单元测试执行。

一般的 CI 工具只会执行在 Source Branch 上,就是源分支上,但极狐GitLab 有一个功能叫做 Merge Result Pipeline ,这是一个独特的功能,它的单元测试是跑在特性分支和组分支合并之后的代码上,而不需要你进行真正的合并,避免在特性分支的开发过程中,有其他人员抢先一步,在主分支上合并了其他的代码,而导致你的代码合并失败。

这也是途游游戏所秉承的 “测试前置”,即应用极狐GitLab 的 Merge Request Pipeline + Merge Result Pipeline 在特性分支上就发现问题,尽早解决问题。

(2)代码合并到主分支之后(CI/CD之前)

此时,途游游戏再次执行单元测试来守护代码,这里用到了极狐GitLab 的另一个功能:Job。一个抽象 Job 相当于 “类”,本身不会实例化,也不会真正地执行。做法是在前面加一个 “.”。

这样做的根本目标在于,需要在两种情况下执行同一个 Job,也就是 .unittest 这个 Job。这两种触发条件为:

1. 有新的代码被提交到某一个 Merge Request 的源分支上

2.代码被合并到默认分支后

图 5

3. Assert 断言:查看单元测试结果

单元测试的结果包括了测试覆盖率,以及若测试失败,其失败的结果。具体不同的语言,不同的测试框架,有不同的实现方式。

以 pytest 实现方式为例(如图 6),后面四行就是该单元测试的报告,用来衡量单元测试成功与否;前缀是与测试覆盖率相关的一些东西,在极狐GitLab 界面上可以看到这个结果,实现单元测试用例执行结果的可视化

pytest itom_cmdb_tests/
--create-db
--migrations
--vcr-record none
--junitxml=test_reports/itom_cmdb_testcase_report.xml
--cov-report xml:test_reports/coverage.xml
--cov-report term
--cov=itom_cmdb itom_cmdb_tests/tests/

图6 展示的是极狐GitLab 的 Merge Request 的 Code Review 视图:绿色杠杆就是有单元测试的一些代码,红色是单元测试没有覆盖到的代码。极狐GitLab 会自动获取相应信息,并且上传到极狐GitLab 的环境当中

图 6

4. Clear 清理:清除单元测试环境

在单元测试最后阶段,需要清理测试环境,例如还原全局配置、清理创建的文件目录等,为后续测试保留干净的上下文,确保测试之间彼此隔离没有依赖性。

以上就是途游游戏运维安全部研发负责人刘勇分享的单元测试主要内容,欢迎关注极狐GitLab 持续获取各类技术干货!

途游游戏 DevOps 实践|都说「单元测试」好,「AAAC四步法」少不了相关推荐

  1. 因涉及微信小游戏“欢乐斗地主”不正当竞争纠纷 腾讯获途游游戏赔偿56万元...

    2月1日消息,据天眼查公开信息显示,2月1日,腾讯科技(深圳)有限公司与在线途游(北京)科技有限公司不正当竞争纠纷一审民事判决书公布,案号为(2019)京0105民初73675号,审理法院为北京市朝阳 ...

  2. 你们想要的端游游戏源码素材他来咯 他来咯

    有小伙伴给我说需要端游游戏源码素材,还得是免费实用齐全的素材,小编呕心沥血为大家找到啦,赶紧收藏码住,别错过! 爱给网 登录问题: QQ一键注册,懒人福音 特色:资源质量佳,免费多,同时资源的分类体验 ...

  3. 火影忍者手游人最多的服务器,火影忍者手游:很多人都认为游戏在走下坡路,弃坑玩家越来越多?...

    火影忍者手游在市面上应该算是一款运营时间比较久的手游了,到目前为止已经运营了五年多的时间,在这期间也有很多玩家不断的弃坑,也有大量的新玩家入坑.似乎每年都会有玩家认为这游戏要凉了,在走下坡路了,维持不 ...

  4. Flink 在米哈游的应用实践

    摘要:本文整理自米哈游大数据实时计算团队负责人张剑,在 Flink Forward Asia 2022 主会场的分享,本篇内容主要分为三个部分: 发展历程和平台建设 场景应用实践 未来展望 Tips: ...

  5. 途游斗地主加密协议分析及破解

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 分析途游斗地主的加密协议." 作为一个手机棋牌游戏厂商,途游是排得上号的,它的途游斗地主一直很火热,隐约记得,这个厂商一直在搞斗地 ...

  6. DevOps 实践:千里之行

    在上一篇 DevOps 渊源:角色消融 中我们分析了在作坊式团队中的责任重叠,也回顾了 DBA 角色的消融.那么,如今我们讲的 DevOps 又是什么角色的消融呢? 我想你已经猜到了,接下来要消融的角 ...

  7. DevOps:从「蒸汽时代」到「高铁时代」,SUNMI DevOps转型之路 | 原力计划

    作者 | 文振熙.刘文沣 责编 | 徐威龙 封图| CSDN 下载于视觉中国 商米科技成立于 2013 年,总部位于上海市杨浦区创智天地,是一家具有产品创新基因和互联网基因的公司.商米在短时间内迅速成 ...

  8. 从「蒸汽时代」到「高铁时代」,SUNMI DevOps 转型之路 | 原力计划

    作者 | 文振熙.刘文沣 责编 | 徐威龙 出品 | CSDN博客 封图| CSDN 下载于视觉中国 商米科技成立于 2013 年,总部位于上海市杨浦区创智天地,是一家具有产品创新基因和互联网基因的公 ...

  9. 骞云科技 DevOps 实践

    随着公司业务的快速发展,需要加快开发流程的规范化和自动化,以提高产品的开发效率和交付效率.之前的开发测试和资源管理主要是半自动化的,个人生产力和资源利用率仍有很大提升空间. 在DevOps的具体实践中 ...

  10. 骞云科技DevOps实践

    随着公司业务的快速发展,需要加快开发流程的规范化和自动化,以提高产品的开发效率和交付效率.之前的开发测试和资源管理主要是半自动化的,个人生产力和资源利用率仍有很大提升空间.在DevOps的具体实践中, ...

最新文章

  1. 样式集(四)搜索框样式
  2. leangoo V5.4.2版上线
  3. numpy 图片填充_numpy/python中的洪水填充分割图像
  4. jquery1.9学习笔记 之选择器(基本元素五)
  5. python中的get函数_python之函数用法get()
  6. 格密码教程(六):高斯二维格规约,解决SVP问题
  7. esd/wim格式Win7/8.1/win10系统怎么安装两种方法教程
  8. 实战篇|风控策略效率的测试、调优与评估
  9. 在CF卡上建立文件系统和安装引导加载程序
  10. Oracle推断值为非数字
  11. centos7下给bond网卡配置bridge桥接
  12. 测试象棋水平用哪个软件好,佳佳象棋软件作者李国来对象棋软件引擎的专业看法及测试指导...
  13. 使用you-get下载blbl视频
  14. Oracle 存储过程简单实例
  15. flag--命令行参数定义多标签示例
  16. Bootstrap broker localhost9092 (id -1 rack null) disconnected
  17. 二维码门禁助力于打造更智能化的出入管理-码上开门,说走就走
  18. 分析30万条微博评论,看毕业生与翟天临的爱恨情仇|数据会说话
  19. 信奥中的数学之入门组(面向小学四年级至六年级以及初一学生)
  20. 10个降低PCB成本的技巧!PCB采购必须掌握!

热门文章

  1. MiiX私享会 · 第六期: BCH姜家志100分钟深聊BCH硬分叉与算力战!
  2. 电脑新建文件夹快捷键
  3. 一流程序员靠数学,二流程序员靠算法,低端看高端就是黑魔法!网友:我是七流靠复制
  4. 任正非自称不如钱伯斯!钱伯斯究竟是何许人?
  5. python django的查询语句
  6. 微信小程序服务器被ddos攻击,网站被DDOS攻击了怎么办
  7. 信息可视化图表设计指南
  8. java分号_java – 为什么这些分号不会产生错误?
  9. php中文手册 人间,写给成年人的人间参考手册 西瓜视频《2021,有一说一》今日上线...
  10. IDC发布中国AI云服务市场报告 百度智能云排名第一