持续交付发布可靠软件的系统方法(交付生态圈)第十二章:数据管理
《持续交付发布可靠软件的系统方法》读书笔记
应用程序可以通过删除前一个版本,使用新版本替换旧版本的方式部署,但是大多数系统,数据无法使用这种方式进行变更,一旦某个系统发布到了生产环境中,关联的数据将不断增加。数据往往是系统中最有价值的部分。当我们需要对数据系统进行结构修改或者内容修改时,就需要相关的策略。对数据的修改是不可避免的,关键在于将数据迁移过程自动化。目前有一些工具对数据迁移提供了较多支持,它们还允许对数据库进行版本化管理。另一个重要部分是测试数据的管理。
数据库脚本化任何数据库的修改都应该通过自动化过程来管理。包括数据库的初始化,数据库所有的迁移都需要脚本化,并将脚本提交到版本控制库中。几乎所有的数据管理系统都支持通过自动化脚本进行数据存储的初始化工作。
清除原有的数据库
创建数据库结构、数据弯路实例以及模式等
向数据库加载数据
在大多数据项目中,数据库的使用要复杂得多。
增量式修改绝大多数据系统,对数据库更新时,要保留它们的数据。由于在部署时需要保留数据库中的已有数据,所以需要有回滚策略,以便部署失败时使用。这就需要对数据库进行版本控制。
在数据库中创建一个数据,用来 ...
持续交付发布可靠软件的系统方法(交付生态圈)第十四章:版本控制进阶
《持续交付发布可靠软件的系统方法》读书笔记
版本控制用来维护应用程序每次修改的完整历史,包括源代码、文档、数据库定义、构建脚本和测试等。团队可以在一个代码版本控制库上一起开发应用程序的不同部分。一旦团队人数超过一定数量,就需要规划版本控制库的使用,让开发更加高效。
分支与合并分支,即为选择的基线创建一个副本,该副本与原基线相互独立,开发者能在两个工作流上同时开发。团队为什么使用分支?
物理上:系统物理配置而分支,即为文件、组件和子系统而分支
功能上【最常见】:系统功能配置而分支,即为特性、逻辑修改、缺陷修复和功能增加,以及其他可交付的功能而分支
环境上:系统运行环境而分支,即由构建平台和运行时平台的不同而分支
组织上:团队的工作量而分支,即为活动/任务、子项目、角色和群组而分支
流程上:团队的工作行为而分支,支持不同规章政策、流程和状态而分支
在开发中,经常会遇到分支合并的情况,除非那些为了发布或者技术预研而创建的分支。两次合并时间间隔越长,每个分支上工作的人越多,合并发生冲突的可能性就越大。以下两种方法来减小冲突:
创建更多的分支来减少在每个分支上的修改。这只是将痛苦 ...
持续交付发布可靠软件的系统方法(基础篇)第一章:软件交付的问题
《持续交付发布可靠软件的系统方法》读书笔记
软件构成部分:可执行的代码、配置信息、运行环境、数据
不同环境下只进行一次编译
对环境的任何修改都应该作为配置信息管理,配置信息的更改都需要经过测试
如果运行环境需要修改,则修改后的环境也需要进行测试。环境包括:操作系统配置、应用程序依赖的软件集、网络配置及任何基础设置、外部系统
数据结构发生变化,同样需要经过测试
反馈流程:指完全以自动化的方式尽可能地测试每一次变更
创建可执行代码的流程
单元测试
质量检测:测试覆盖率以及其他与技术相关的度量项
功能测试验收
性能、有效性、安全性等非功能测试
探索性测试,给客户/最终应用演示
自动化测试反馈【commit阶段】
运行速度快
尽可能全面,75%代码库覆盖率
环境中立,相对生产环境简单廉价
如果出现问题,绝不发布【commit之后测试】
运行速度慢一些,适合并行执行
即使有些测试问题,也可以发布应用程序
运行环境尽可能与生产相同
不同版本、不同环境的配置放在版本控制中
开发人员都拥有自己的专属开发环境
无论部署在什么目标环境都应采用同一种部署方法
开发环境是特例,可以有多变性部 ...
持续交付发布可靠软件的系统方法(基础篇)第三章:持续集成
《持续交付发布可靠软件的系统方法》读书笔记
持续集成要求每当有人提交代码时,就对整个应用进行构建,并对其执行全面的自动化测试集合,一旦出现问题,开发团队应停下手中的工作,修复问题。持续集成的目标是:让正在研发的软件一直处于可工作的状态。
实施持续集成的先决条件
版本控制,与项目相关的所有内容都必须提交到一个版本控制库中(产品代码、测试代码、数据库脚本、构建与部署脚本、以及所有用于创建安装运行和测试该应用的程序的东西)
自动化构建:必须满足人和计算机都能通过命令行自动执行应用的构建、测试以及部署过程
团队共识:持续集成是一种实践,需要团队所有成员都遵循规则
一个基本持续集成系统
第一次在持续集成工具上执行构建时,可能会缺少一些必须的软件及配置,请将所操作的工作记录下来,并放在自己项目的知识共享库中,应花一些时间将应用程序所依赖的所有软件和配置项提交到版本控制系统中,并将重建全新环境的整个活动变成一个自动化的过程
查看一下是否有构建正在运行,如果有,等它运行完。如果它失败了,则与团队其他人一起将它修复,后再提交自己的代码
一量构建完成且测试全部通过,就从版本控制库中将该版本的代码更新到自 ...
持续交付发布可靠软件的系统方法(基础篇)第二章:配置管理
《持续交付发布可靠软件的系统方法》读书笔记
配置管理指一个过程,通过该过程,所有与项目有关的产物,以及它们之间的关系都被唯一定义、修改、存储与检索。
使用版本控制
对所有内容进行版本控制(所需的支撑软件配置信息,操作系统配置信息、DNS区域文件和防火墙配置等)
配置管理是持续集成交付过程的基础。
软件配置管理灵活性:先专注于提供具有高价值且可配置程度低的功能,冒烟测试就是一种缓解配置验证问题的方法配置分类
推荐应使构建打包生成的包,面向所有环境,并不植入配置信息
应用程序的配置管理
将特定于测试环境或生产环境的实际配置信息存放于与源代码分离的单独代码库,需要注意配置信息的版本,一定要与相应的应用软件的版本相切尔西
不要把密码放在版本控制系统中
获取配置信息:文件系统、从某个中心仓库中获取配置信息
配置信息:区分应用、版本、环境,都需要满足以下:
新增一个环境,能为这个配置应用的新环境指定一套新的配置信息
新建应用程序的一个新版本,确保在部署新版本时,使用新的配置,但是一量需要回滚时,还能够使用旧版本的配置
将新版本从一个环境移到另一个环境,确保新环境上的新配置里有效
重定向到一个数 ...
持续交付发布可靠软件的系统方法(基础篇)第四章:测试策略的实现
《持续交付发布可靠软件的系统方法》读书笔记
项目在一开始阶段,测试人员就会与开发人员及客户一起写自动化测试。这些测试应该在开发前就写好。以上这些测试仅仅是系统进行功能测试,容量、安全性及其非功能性试也应尽早建立,为它们写自动化测试套件。确保不符合需求的问题尽早暴露。
业务导向且支持开发过程的测试在开发一个用户故事之前,应写好验收测试,采取完美的自动化形式。系统的验收测试应运行在类生产环境(UAT)验收测试有价值的特性:
它加快了反馈速度
减少了测试人员的工作负荷
让测试人员集中精力做探索性测试和高价值的活动
这些验收测试也是一组回归测试套件
行为驱动开发,可以以这些测试中自动生成需求说明文档
并不是所有的东西都需要自动化。我们倾向于将自动化验收测试限于完全覆盖Happy Path的行为,并仅覆盖其它一些极其重要的部分。每一种测试都应该覆盖应用程序的80%验收测试一般都是端对端测试,但是这样很多时候验收测试的失败并不是因为真正的缺陷,而是因为界面的变更,这将导致增大了验收测试脚本的维护。有两种方法解决这个问题:
在测试与用户界面之间增加一个抽象层,以便减少因用户界面变更而导致的 ...
持续交付发布可靠软件的系统方法(部署流水线)第七章:提交阶段
《持续交付发布可靠软件的系统方法》读书笔记
提交阶段的运行应该少于5分钟,一定不要超过10分钏提交阶段的首要目标是创建可部署的产物
提交阶段的原则与实践
提供快速有用的反馈
何时令提交阶段失败
编译错误
测试失败(包括单元覆盖率低于60%)
精心对待提交阶段
提交阶段中有构建用的脚本和运行单元测试、静态分析等脚本。
随着项目的进行,不断改进提交阶段的脚本的质量、设计和性能
确保将脚本做成模块化,将那些经常使用且很少变化的常见任务与需要修改的任务分开
将部署流水线中不同阶段所用的代码分别写在不同脚本中
不要写出与具体环境相关的脚本,即要把具体环境配置与构建脚本分离
让开发人员也拥有所有权如果必要的话,即使是很普通的变更也都应该由开发人员和运维人员来执行
在超大项目团队中指定一个构建负责人
监督和指导对构建的维护
鼓励和加强构建纪律
在团队开始接触持续集成时,构建纪律还没建立起来时,提醒作用
团队成员轮流当,比如每星期轮换一次
提交阶段结果提交阶段的输入是源代码,输出是二进制包和报告(测试结果和代码分析报告)
制品库
制品库仅保存某些版本,而不是全部。如果在部署流水线某个 ...
持续交付发布可靠软件的系统方法(部署流水线)第九章:非功能需求的测试
《持续交付发布可靠软件的系统方法》读书笔记
性能、吞吐量、容量概念性能:对处理单一事务所花时间的一种度量,既可以单独衡量,也可以在一定的负载下衡量。吞吐量:系统在一定时间内处理事务的数量,通常它受限于系统中的某个瓶颈容量:一定的负载下,当每个单独请求的响应时间维持在可接受范围内时,系统所能承担的最大吞吐量。非功能性:有效性、容量、安全性、可维护性等。
非功能需求管理将非功能需求与功能需求一样对待。
创建一些具体任务来管理非功能需求
有必要的话,向功能需求中加入非功能需求的验收条件
如何为容量编程
为何要做容量测试高德纳著名格言:在97%的时间里,我们都应该忘记那种小的效率提升:过早优化是所有罪恶之根。然而,我们也不能让另外非常关键的3%的机会与我们擦肩而过。一个优秀程序员不会因为这个原则而对其置之不理,他们非常聪明,只会在识别出那段关键代码后,才会非常细心地去查看。在找到解决方案之前,必须先找出问题的根源。容量测试会告诉我们是否存在问题,以便我们可以修复它。不要枉自猜测,而要先进行度量。
解决容量问题现代软件系统中,最昂贵的是网络通信或磁盘存储,在性能和应用程序的稳定性方面,跨进程 ...
持续交付发布可靠软件的系统方法(部署流水线)第五章:部署流水线解析
《持续交付发布可靠软件的系统方法》读书笔记
什么是部署流水线部署流水线是指软件从版本控制到用户手中这一过程的自动化表现形式。价值流图
产品可行性评估
产品探索
产品计划与评估
开发
最后测试与审核
发布
3天
1周
7天
10天
10天
10天
3天
7周
1周
2天
2小时
开发到发布的流水线:会有很多次构建通过这一流程走向最后的发布
流水线各个阶段:交付团队->版本控制库->构建和单元测试->自动化验收测试->用户验收测试->发布
一般而言,只要某个构建使这个流程任一阶段失败,都会停止,不会进入下一个阶段。
提交阶段【自动化测试(主要是单元测试),代码分析】
自动化验收测试阶段【功能与非功能测试】
手工测试阶段【对自动化测试的补充,探索性测试,集成测试等】
发布阶段【部署到生产环境或试运行环境】
最基本的部署流水线
部署流水线的相关实践
只生成一次二进制包。对于不需要编译的语言,二制包指的是所有源文件的集合。这些二进制包应保存在文件系统的某个位置,让流水线后续阶段能够轻松访问到,但不要放在版本控制库中。二进制包应与 ...
持续交付发布可靠软件的系统方法(部署流水线)第八章:自动化验收测试
《持续交付发布可靠软件的系统方法》读书笔记
验收测试通常是在每一个通过提交测试的软件版本上执行的。
验收测试的目的:对于一个单独的验收测试,它的目的是验证一个用户故事或需求的验收条件是否被满足。如功能验收条件和非功能验收条件。
如果每次提交测试后都在该版本上运行自动化验收测试,会有如下效果:
反馈环大大缩短,能够更快地定位问题
测试、开发人员和客户需要紧密合作才能创建一个良好的自动化测试套件,这会促进他们之间的良好合作
有助于让每个人更关注业务的价值
验收测试与单元测试的区别:验收测试是针对业务的,单元测试是面向开发的。
创建验收测试
分析人员与测试人员和客户紧密合作,定义验收条件
分析人员向开发人员讲解需求,以及它的业务上下文,并检查一遍验收条件
测试人员与开发人员讨论,并就“哪些自动化验收测试来证明验收条件被满足”达成一致
开发人员认为工作完成是指所有单元测试和组件测试通过,验收测试全部实现,并证明系统满足需求。此时可以向分析人员、测试人员和客户进行演示
应用程序驱动层应用程序驱动层是一个知道如何与应用程序打交道的层次。它所用的API是以某种领域语 ...