功能代码的思维模式为创建, 重点在考虑用户、使用场景和数据流程上

测试代码的思维模式为破坏,怎样写测试代码用以扰乱分离用户及其数据

软件开发过程中乌托邦理想模式:功能开发人员、测试开发人员、用户开发人员在可用性和可靠性方面分工合作,达到完美:

  • 功能开发人员编写功能代码
  • 测试开发人员编写测试代码
  • 用户开发人员解决面向用户的任务,包括用例、用户故事、用户场景、探索式测试(?)

2.1 SET的工作

开发和测试流程

代码的组织形式、开发过程、维护是日常工作重点

(1)公共的代码库、和谐的工程工具、公司范围内的资源共享,成就了丰富的google内部共享代码库与公共服务, 有利于加速项目完成和减少项目失败。

共享的基础代码实践规则:

  • 复用已经存在的公共库
  • 公共的共享代码容易被知道(存储在代码库的共享区域),具有良好的可读性,容易理解
  • 公共代码尽可能被复用且相对独立
  • 依赖明确指出,不可忽略
  • 若共享代码某些地方有更好的解决方案,则需重构已有代码,此行为值得鼓励
  • 公共模块代码必须经过审核

(2)最小化平台依赖

操作系统尽可能地与google生产环境的操作系统一致, CPU和OS变化尽可能小。限制运行环境可以节省大量下游的测试工作,避免环境调试问题。保持简单,同样相对安全

(3)打包

打包是一个过程,将源代码编译成二进制文件,然后将二进制文件统一封装在一个linux rpm包里面

构建整体流程:

  1. 针对服务,编写功能代码,并编译通过
  2. 新服务构建目标设定为公共库
  3. 通过调用用库的方式编写单元测试用例,外部依赖用mock模块实现
  4. 为单元测试创建一个测试构建目标
  5. 构建并运行测试目标,做适当调整,知道所有测试运行成功
  6. 静态代码分析
  7. 递交代码审核

google产品由三部分组成:经过良好测试的独立库、可读性与可复用性不错的公共服务库、覆盖所有主要构建目标的单元测试套件

SET参与到测试目标构建中可,做更大规模的集成测试,编写mock和fake工具

SET职责

通过参与设计和代码开发的方式尽早介入到开发流程中。SET需要了解如何去测试SWE编写的代码,并解答测试问题

项目的早期阶段

若一个产品在概念上还没完全确定成型时去关心质量, 这是优先级混乱的表现;若测试长时间未介入到产品众,则产品可测试性也会很糟糕

团队结构

google产品团队最初由一个技术负责人和一个或者多个项目发起人组成:技术负责人负责设定技术员方向、开展合作、充当与其他团队沟通的项目接口人, 理解细节

设计文档

设计文档主要包括项目的目标、背景、团队成员、系统设计

审阅设计文档推荐要点:

  • 完整性:支出文档中残缺不全或需要特殊背景知识的地方, 鼓励作者添加更多的细节, 方便新人阅读理解
  • 正确性:语法、拼写等方面的错误
  • 一致性:图与介绍的一致性
  • 设计:考虑可用的资源,目标是否可以顺利达成?何种基础设计框架?设计是否过于复杂?能否简化?还是过于简单?需要增加什么内容?
  • 接口与协议:协议是否有清晰的定义?对外的接口和协议是否完整?是否满足统一的标准?
  • 测试:可测试性如何?是否需要新增测试钩子(为了给测试而增加的一些接口,泳衣显示系统内部状态信息)?这部分内容需要添加到设计文档中是否使用已有的测试框架?测试方面需要做哪些工作?

接口与协议

SET会对protocol buffer代码做系统全面的审查, 集成测试的运行依赖这些接口的实现。集成测试依赖mock和fake,因为有了它们,一些依赖服务的期望错误场景和条件异常,会比较容易构建

自动化计划

规模更小且目的性更强的自动化计划,并存在可以提供帮助的测试框架, 会吸引SWE一起参与测试

SET应该把精力花费在提高质量方面,而不是花费在维护那些不稳定的端到端测试套件上, 因此SET遵循下面的方法

  • 容易出错接口做隔离,针对它们创建mock和fake,这样可以控制接口之间的交互,确保良好的测试覆盖率
  • 构建轻量级自动化框架,控制mock系统的创建和执行
  • 公开产品质量方面的信息给所有关心的人, 使用报表和仪表盘来展示收集到的测试结果以及测试进度。将整个过程简化和信息公开透明化,获取高质量代码的概率增加

可测试性

SET第一要务就是可测试性, 质量顾问的角色

CL(chang list 变更列表)先经过自动化检查(代码风格、测试用例执行是否通过),然后代码审查(通过邮件方式通知审阅者), 反复进行, 直到递交者和审阅者满意为止

提交队列主要功能是保持“绿色”的构建, 这是构建系统和版本控制系统之间最后一道防线

提交队列和持续集成构建的由来:P29

在机器上持续不断的构建并运行相应的单元测试与集成测试, 后来发现该系统具有一定的通用性, 可以用来支持其他团队