写点什么

如何在复杂的分布式系统中做测试

2019 年 2 月 22 日

如何在复杂的分布式系统中做测试

2019欧洲测试大会上,Sarah Wells 演讲指出:复杂分布式系统的复杂性并非存在于代码中,而是存在于服务或功能之间;测试就是寻求如何在发现问题与交付价值间达成平衡;测试人员通常具有对系统功能的最好理解;测试人员能对可能出现问题做出很好的假设,然后非常快速地进行验证。


Wells 在她的主题演讲中,探讨了系统在复杂化和分布式后所发生的变化。对于单体系统而言,虽然可能很难定位实现特定功能的代码位置,但是很容易判别请求在系统中的流转,并且大多数通信是在进程之间的。Wells 认为,分布式系统的复杂性已从系统内部转移到系统之间。


使用微服务可简化代码,但会使基于 http 或队列实现的路由复杂化。Wells 支持在路由上可能会出现更多的问题。用户常常会收到一些表示请求失败的瞬态错误,这些错误会在重复数秒后变为成功。她认为明智的做法建立一种补偿和重试机制,但采用这种做法意味着用户更难以完全掌控发生在响应请求中的情况。


Wells 建议用户使用基于风险的方法,让测试工作聚焦于那些真正重要的事情上。她提出,用户需要能够快速确定发生错误的时间,尽快修复错误,并且必须要建立具备观测出错位置能力的系统。


Wells 提到,对于复杂分布式系统的测试,用户需在尽早发现问题和尽早交付价值间取得平衡。其实,一些问题直到系统投入生产后才能被发现,进而做出优化以快速识别和修复这些问题,她认为用户最好能接受这一点。


InfoQ 报道全程覆盖2019欧洲测试大会。在Sarah Wells主题演讲后,InfoQ 就复杂分布式系统的测试问题对她做了一次专访。


InfoQ:您对于复杂分布式系统的测试有哪些建议?


Sarah Wells:我们发现,无论是开发人员还是测试人员,在着手构建复杂分布式系统时,都无法试图在本地启动完整的系统副本。用户花费了大量时间去创建很好的生产系统副本,但却从未妥善管理它们。

需强调的是,我们这里讨论的是复杂系统。如果你无法评估特定更改可能会影响到的范围,那么就得花大量的时间做回归测试,我们发现这是个瓶颈,而且往往并不能发现问题。

和许多事情一样,问题主要存在于沟通上。如果开发人员能详细阐述了他们刚完成的工作,那么通常测试人员就能准确地找出变更可能带来的最大风险。

持续交付和微服务是对此最具帮助的做法。许多变更通常非常小型,并且相互独立。微服务具有非常明确的界限。《加速,精益软件和DevOps科学:建立和扩展高绩效技术团队》一书中提及的研究表明,那些频繁发布小型单独变更的组织,通常这些变更的失败率也比较低。

我认为应在系统间建立契约。但我不确定的是,维护契约测试的成本是否会高于错误的风险。我的想法是,将目标锁定为团队间的边界,而非系统内。


InfoQ:监控和日志如何支持测试?甚至它们将如何替代测试?


Wells:分布式系统的许多问题,几乎与最新发布的代码没有关系。这些问题可能与运行代码的环境有关,或是可能是由于服务之间的依赖关系,即更改为另一个可导致意外错误的服务。服务可能属于不同的团队。用户甚至可能不知道某个服务调用了自己的 API。

因此一个更改一旦投入生产系统,至少能够尽早发现问题并回滚。

可以通过类似于综合监控的手段,不断测试关键的业务功能,或者监控业务能力水平,也就是检查事件的实际完成情况。以内容发布为例,我们可以检查在我们的区域中存储的所有相关数据是否正确更新,否则就给出警告。

我们也在更底层的环境中运行测试。这些测试替代了那些十分脆弱的验收测试。当做任何变更时都要修改设置,这是件非常痛苦的事。而且很多变更是做架构类的调整。

我们所构建的系统必须提供可观测能力,以便在第一时间定位错误。

这意味着,绝对有必要将全部日志汇集于单个日志存储中,并且需要对日志做结构化以易于查询。在复杂系统中请求会经由多个服务,所需存储的日志规模可能会高于单体系统几个数量级,因此用户可能最终会对日志做抽样。在这种情况下,需要确保任一特定时间的所有日志都得到存储,并且能够通过唯一的事务标识关联所有相关日志。

用户可能还希望获取一些度量,但很容易发生过度获取的问题。用户切实需要的应是那些最高层级服务的度量,即客户呼叫、报告请求率、错误率(可能是请求率的一部分)以及请求持续时间等。这些度量通常称之为 RED 度量。


InfoQ:在出现错误时,测试人员的作用是什么?他们的价值何在?


Wells:根据我的经验,对系统功能具有最好理解的人,除了产品负责人(PO,product owner)就是测试人员。我已经看到很多测试人员逐渐转型为产品负责人。

这表明了两个问题。第一,测试人员对即将发生的问题具有很好的预判。

其次,测试人员将能够很快地验证假设问题。他们知悉 API 的调用,网站的流程。

此外,在出现问题前,测试人员也能提供大量价值。我认为,很显然混沌工程需要测试人员的参与。因为混沌工程就是开展探索。如果关闭某处系统会发生什么情况?如果密钥过期会发生什么问题?这些假设和弹性测试对于复杂分布式系统是非常重要的,也具有很大的价值。


查看英文原文: Testing Complex Distributed Systems


2019 年 2 月 22 日 08:005135
用户头像

发布了 378 篇内容, 共 97.2 次阅读, 收获喜欢 224 次。

关注

评论 2 条评论

发布
用户头像
怎么测试 还是不懂
2021 年 05 月 29 日 15:34
回复
用户头像
把 you 翻译成"用户",小编有点外行了。。。
2019 年 02 月 22 日 20:24
回复
没有更多了
发现更多内容

常用手机软件清单

彭宏豪95

效率工具 App 手机 移动应用

有关Kotlin Companion 我们需要了解到的几个知识点

王泰

Java 编程 kotlin 编程语言

写作平台使用感受

小天同学

产品 体验 反馈

程序员陪娃看绘本之启示

孙苏勇

生活 程序员人生 读书 成长 陪伴

dubbo-go 中如何实现路由策略功能

joe

golang Apache 开源 微服务架构 dubbo

太慢是不行的

池建强

创业 产品

如何画一个闹钟

池建强

视觉笔记

Facebook在用户增长到5亿时的扩容策略

Rayjun

团队管理 扩容

终极 Shell

池建强

Linux Shell

理性主义和实证主义

王泰

理性主义 实证主义 哲学 软件工程

用python爬虫保存美国农业部网站上的水果图片

遇见

Python GitHub 爬虫

死磕Java并发编程(3):volatile关键字不了解的赶紧看看

七哥爱编程

Java Java并发 volatile

回"疫"录(2):不知者无畏

小天同学

疫情 回忆录 现实纪录

软件世界中的个人英雄与团队协作

王泰

团队管理 软件工程 团队协作

关于HSTS - 强制浏览器使用HTTPS与服务器创建连接

遇见

https 安全 浏览器 TLS 证书

【SpringBoot】为什么我的定时任务不执行?

遇见

Java Spring Boot 定时任务 debug

软件工程的史前时代 -- Therac-25 事件

王泰

质量管理 软件工程 软件危机 软件测试

Zoom的加密算法,到底有什么问题?

范学雷

算法 编码习惯 产品设计 安全 编程语言

敏捷(组织)转型的6个准备条件

Bob Jiang

团队管理 敏捷 组织转型

我敢说 80% 的程序员都掉进了「老鼠赛跑」的陷阱

非著名程序员

读书笔记 程序员 程序人生 提升认知

【SpringBoot】为什么我的 CommandLineRunner 不 run ?

遇见

Java Spring Boot

回"疫"录(1):口罩危机也许是一种进步

小天同学

疫情 回忆录 现实纪录

过滤数组中重复元素,你知道最优方案吗?

麦洛

数据结构 数组 数组去重

像经营咖啡店一样扩容 Web 系统

Rayjun

Web 扩容

个人知识管理精进指南

非著名程序员

学习 读书笔记 知识管理 认知提升

【SpringBoot】给你的 CommandLineRunner 排个序

遇见

Java Spring Boot

Disruptor为何这么快

Rayjun

Java Disruptor

死磕Java并发编程(6):从源码分析清楚AQS

七哥爱编程

Java Java并发 并发编程 AQS

一个值得推荐的人才测量标准

Selina

Nginx代理Oracle数据库连接

遇见

MySQL nginx oracle 反向代理

揭秘|为何程序员们能一直保持高收入?

丁长老

学习 程序员 写作 高薪

如何在复杂的分布式系统中做测试-InfoQ