RD为什么也需要云

秦可卿
• 阅读 5768

Test Driven Development

虽然敏捷开发这个词已经臭大街,但是我仍然坚信TDD是正确的开发方式。其核心原理很简单就是更快的feedback cycle,即便TDD不能让我们可以在写代码之前就想好要写什么,但是起码它可以让我们在写完两三行代码之后就运行到那几行代码并验证一下。这总好过上线的时候发现php error去回滚要强吧。

Behavior Driven Development

传统的TDD被人诟病的地方在于细粒度的unit测试。我现在写代码,很少去写unit test来保证类或者包级别的行为了,因为懒。相比一个类的职责边界不清楚,更要命的问题是在 rd <-> pm 之间缺少一个文档来保证其契约。所谓Behavior Driven Development(BDD)的意思就是我们要写测试去记录下来我们和产品经理达成的那些共识,也就是“Live” “Contextual” “Document”:

  • 文档:这个东西应该是产品经理可以读得懂的东西,而不是什么python脚本

  • 有上下文:总是在描述一个场景里的某一个侧面,而不是所有细节

  • 可验证:如果文档不可以做为测试被验证,那么文档什么时候写出来就是什么时候过期被抛弃

BDD + Micro Service

微服务是必然的趋势,因为一个组织总是倾向于生长。我们看到的现状就是想要真正做到有一份文档记录产品经理和研发之间的默契,并且让这份文档是可测试的,我们就需要集成多个Micro Service去做一个接近端到端的集成测试。这种测试对于获得开发效率来说至关重要,因为团队间沟通和返工的成本是非常高的。和Micro Service在其他层面带来很多技术挑战一样,Micro Service的盛行对于测试驱动开发来说也是全新的他挑战。因为要驾驭一个多服务集成的应用做集成测试,需要超越junit的更广博的知识和耐心。传统的BDD工具更多是在制造各种各样的语法糖让代码写得像文档一样,然而并没有什么卵用。这里就一个很大的工具gap,需要新一代的工具让BDD适应这个micro service的时代,比如 https://github.com/taowen/devenv

无论是何种方式实现,我们可以看到的是在Micro Service时代,在Polyglot时代,靠一个语言的一个进程内的测试是很难实现测试驱动开发的了。我们越来越倚重集成测试来获得开发者改进代码的信心,以及不断快速迭代的开发效率。

Slow Local Build

大量的集成测试带来的一个直接后果是需要非常长的本地build的时间才可以知道我的这次改动是不是破坏了之前的功能。如果之前是一个单体的java应用,可能整个验证用junit在进程内mock掉一些heavy的服务可以跑得飞快,但是在现在这种多语言微服务的架构下,就不得不把所有进程都启动起来,然后跨进程甚至分布式地来验证整个系统。模块级别的测试不是答案,大部分的micro service拆分都是不合理的。

所以,我们RD也需要云。

新技术带来的机会

一个理想的开发云应该可以分布式地执行开发者的local build,即便是上百个集成测试也可以在一分钟内全部跑完。我构想可以利用三项技术:

这个过程应该是这样的:

  1. rsync上传本地开发中的代码到测试服务器上

  2. 把整个应用在docker容器内启动

  3. 利用 CRIU 技术把docker容器状态打一个快照

  4. 运行一个全流程的冒烟测试验证本次部署是ok的

  5. 把 CRIU 打的快照批量的恢复出一堆docker容器(docker提供了一致的文件状态,CRIU提供了一致的进程执行中状态)

  6. 甚至可以批量地在一堆机器上分布式地恢复出一堆docker容器

  7. 这些docker容器跑一个集成测试并报告执行结果

  8. 全部执行完之后,开发者从测试服务器获得最终的测试报告

  9. 如果有测试fail,利用docker+CRIU开发者可以完全在本地恢复出远程的集成测试的执行时状态并本地重现错误

其实说白了就是 docker + CRIU 的革命性技术让我们第一次拥有了每个虚拟机只跑一个测试的能力。神码tear down不干净导致测试random fail,都不再是问题。这样的开发云目前还没有,但是我相信已经有人在造了~

点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
4年前
前端面试之常见手写代码
为什么要写这类文章作为一个程序员,代码能力毋庸置疑是非常非常重要的,就像现在为什么大厂面试基本都问什么API怎么实现可见其重要性。我想说的是居然手写这么重要,那我们就必须掌握它,所以文章标题用了死磕,一点也不过分,也希望不被认为是标题党。作为一个普通前端,我是真的写不出PromiseA规范,但是没关系,我们可以站在巨人的肩膀上,要相信我们现在要走
菜园前端 菜园前端
2年前
想学会flex布局,我强烈推荐你来看看这篇文章!!
原文链接:为什么要使用flex布局?flex布局是目前比较流行的一种布局,因为它十分简单灵活,区区简单几行代码就可以实现各种页面的的布局,以前我在学习页面布局的时候我深受其float、display、position这些属性的困扰。使用flex属性就可以写
Wesley13 Wesley13
4年前
SQL性能简单优化(作为初级程序员的想法)
随笔背景:虽然参与正式项目开发已经近两年了,但是之前涉及的数据都不是很大,就算数据量够了,但是也没涉及到统计,所以之前开发的时候仅仅注意业务逻辑是否正确,代码是否精简。本次做的一个项目,写数据统计的接口,刚开始也只是注意逻辑,不过后来数据量仅仅到了40万的时候,一个按照年龄区段获取各年龄的普及率接口竟然花了近一分钟,所以开始了我的优化路程。一、从SQL上
待兔 待兔
5年前
Java8 几个很好用的方法,真的很香
JDK8应该是Java中最坚挺一个版本,这个版本新增很多特性,让我们开发起来多了很多便利。不过最近Review项目代码的时候发现,虽然很多项目工程已经使用了JDK8,但是工程代码却很少使用到JDK8新特性、新方法。如果单从代码正确性上来说,老方式写法写当然没有什么问题,那唯一的缺点其实就是代码行数比较多,比较繁琐。那同样的需求,使
Stella981 Stella981
4年前
Scala快速入门系列
写在前面的话因为Spark是由Scala开发的,所以在开发Spark应用程序之前要对Scala语言学习。虽然Spark也支持Java、Python语言,但是作为一名Java程序猿,还是决定要学习Scala哈。Scala是运行在JVM上一门语言。开发效率非常高、语法丰富简洁,三两行Scala代码能搞定Java要写的一大坨代码。
Stella981 Stella981
4年前
Golang代码测试:一点到面用测试驱动开发
摘要:TDD(TestDrivenDevelopment),测试驱动开发。期望局部最优到全局最优,这个是一种非常不错的好习惯。了解Golang的测试之前,我们先了解一下go语言自带的测试工具。gotest工具Go语言中的测试依赖gotest命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的
Stella981 Stella981
4年前
JavaScript优化技巧
作为开发人员,我们一直在寻找让我们的代码更快更好的方法。但在此之前,编写高性能代码需要做三件事:了解语言及其工作原理基于用例进行设计调试!修复!重复记住这一点任何傻瓜都可以编写计算机可以理解的代码,优秀的程序员编写人类可以理解的代码。丁·福勒我们来看看如何使JavaScript代码运行得更快。延迟
Wesley13 Wesley13
4年前
Java Servlet单元测试
JavaServlet单元测试1\.解决痛点虽然目前主流的开发方式,很多都是通过controll或者微服务提供api.但是不免还是需要写几个servlet完成接口开发.按照常规,servlet调用服务层代码,只需做下服务层单元测试就好了.可是,这里就忽略了请求参数处理过程的测试,按照以往,如果需要测试,往往是先运行一个t
Wesley13 Wesley13
4年前
TDD 测试驱动开发
测试驱动开发,英文全称TestDrivenDevelopment,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。1概述KentBeck先生最早在其极限编程(XP)方法论中,向大
陈哥聊测试 陈哥聊测试
2年前
TDD、BDD、ATDD都是什么、有什么区别?(上)
软件开发是一个迭代过程,包括编写、测试和改进代码,直到满足需求。测试驱动开发(TDD)、行为驱动开发(BDD)和验收测试驱动开发(ATDD)是支持该过程的三种方法。
陈哥聊测试 陈哥聊测试
2年前
TDD、BDD、ATDD都是什么、有什么区别?(下)
在一文中,探讨了探讨TDD、BDD和ATDD的概念。虽然TDD、BDD和ATDD都是软件开发中使用的测试方法,但它们在方法和重点上有所不同。TDD、BDD和ATDD之间的主要区别在于关注点、抽象层级和协作。1、关注点TDD侧重于测试代码并确保它满足需求。B