你的测试写全了吗?

2020 年 11 月 24 日

你的测试写全了吗?

QA设计的测试用例大部分都是面向业务的端到端测试,怎么能保证从DB来的数据通过层层service能顺利的到达前端并被正确的展示出来呢?我们可以尝试以UI和DB作为data flow的两端串起所有的测试。


场景


想象一个典型的场景,一次 sign off 接近尾声:


QA:这个些case都有测试吗?

DEV:打开各种IDE,UT cover了case A,JT cover了case B,API test cover了case C


Sign off 结束了,但是代码里的测试真的覆盖了 QA 预期的全部用例吗?


假设一个系统的数据都存储在 DB 中,而 UI 是系统与终端用户交互的部分,那么数据在 DB 和 UI 之间通过各种 service 的互相调用而展示或存储的过程就是一种 data flow。


QA 设计的测试用例大部分都是面向业务的端到端测试,怎么能保证从 DB 来的数据通过层层 service 能顺利的到达前端并被正确的展示出来呢?我们可以尝试以 UI 和 DB 作为 data flow 的两端串起所有的测试。


举个例子


某项目有一个叫 FileSharing 的 website,用户可以在上面共享文件。


系统的设计是 FileSharing Frontend 向 FileSharing Backend 发请求获取 file 和 user 信息,FileSharing Backend 向 File Service 发请求获取 file 信息,File Service 从 DB 读取 file 信息。


其中一个需求是当前用户可以看到自己和其他用户上传的文件,而他人上传且未被该用户下载过的文件名应该显示为粗体。


根据这个需求设计出两个 test case:


  • User should see new file in bold

  • User should see downloaded(or upload by himself) file not in bold


以这两个 case 为例,下图展示了数据在代码中的流动过程:



数据的流动方向是从 DB 到 UI,检查测试代码可以先从数据消费终端的 UI 开始,目的是期望测试可以证明每一步正确处理和返回信息。


第一步:FileSharing Frontend


在 file-store 的测试文件里找到两个相关测试


  • should _be _shown _as _new _file

  • should _not _be _new _file _after _download


并且通过 file-store 的代码:


get isNew() {    return !!this.isNewDocumentFromOthers;}
复制代码


可以知道需要后端返回 isNewDocumentFromOthers


结论 : 查看代码已知 file-store 是前端页面的数据源,这个测试是在 file-store level,没有测试保证 html 画出来相应的 item


第二步:FileSharing Backend


打开 user 的 file 页面时,前端发了 3 个请求:


/files/user/types/user/verified
复制代码


根据上一步得到的信息可以知道/files 就是要找的请求


{    "id": "9a4af273-2d4e-4491-8f10-a93d2ba15e42",    "country": "US",    "fileName": "Instruction of FileSharing System",    "documentType": "Message",    "isNewDocumentFromOthers": true,    "uploadedAt": "12/16/2019",    "uploadedBy": "ad77d3fc-e0af-499e-8a71-ab020073db34",    "year": 2000  }
复制代码


在 FileController 的测试文件里找到一个测试


  • should<em> flag</em> new<em> files</em> uploaded<em> from</em> others


并且通过 FileController 的代码:


public bool IsNewDocumentFromOthers(Guid userId){    return IsUploadedFromOthers() && DocumentType != DocumentType.Consent &&           (DownloadHistories == null ||            DownloadHistories.ToList()                .TrueForAll(HasNotDownloadedByUser));}
复制代码


可以知道 FileSharing Backend 需要 File Service 传来 IsUploadedFromOthers/DocumentType 和 DownloadHistory 的信息


结论 :这个测试是在 API level,基本可以覆盖当前测试用例,不过根据测试金字塔,API 更多应该关注是否返回了需要的 property,而 property 的值可以被下层的 UT 验证


第三步:File Service


在 FileController 的测试文件里找到一个测试,但是只验证了 file 的 name/year/country


  • should _get _by _user _id


结论 :没有验证返回 FileSharing Backend 需要的 IsUploadedFromOthers/DocumentType 和 DownloadHistory 信息


测试覆盖分析


整理以上的步骤可以得到下面的图(标出了现有/缺失测试的部分)



如果从改善当前测试的角度出发,能得到当前测试结构下的测试用例覆盖表:


(绿色表示测试基本可以覆盖用例,黄色表示有测试但是覆盖不全,在这个例子里 File Service 需要验证能返回正确的 Uploadby/DocumentType 和 DownloadHistory 的信息)



再从 data flow 的角度看可以发现更多问题:


  • UI层面没有对html做测试(风险较大)

  • 现有的测试大部分集中在API层面,service层以下的UT测试比较少

  • 服务之间缺乏契约测试导致修改一个API的时候只能人工检查被影响的范围

  • 测试使用的内存DB可能跟实际DB有差别(风险较小)


理想情况下,所有 data 经过的地方都需要有测试保证 data flow 不会断(数据被正确的处理和传输)。


改进


基于以上项目现状,可以得出几个投入产出比较高的 action:


  • 在signoff的时候DEV可以试着给QA说明现有代码的结构,解释数据流动的方式,帮助QA理解目前测试覆盖的范围,评估没有测试的部分风险有多大,找出manual test的重点

  • 后端service数据传递时如果是靠API测试验证,则需要保证每个property都被测到

  • 保证前端每个view model的行为和状态都有JT cover


敏捷项目中开发写测试所依据的理论主要是测试金字塔,但是测试本身该写到哪一层并没有明确的标准可以遵循,当试着跳出测试金字塔的理论,从数据这个根源沿着 data flow 去看现有的测试,就会有一些新的发现,从根本上找出缺失或冗余的测试,确保测试做到更有效的覆盖。


作者介绍


王蕾 ,ThoughtWorks 测试工程师,有多年大型复杂系统质量保证经验。


本文转载自 ThoughtWorks 洞见。


原文链接


你的测试写全了吗?


2020 年 11 月 24 日 10:10885

评论

发布
暂无评论
  • 视觉感知测试

    对于界面布局,传统的测试都是由人工对比设计图和产品界面。当界面有修改之后,再由人通过肉眼去检查修改(包括正确的和错误的修改),这样即费时而且测试结果又不稳定,因为人是有情绪的。但是我们认为如果一个界面通过第一次的人工验证并发布之后,它就是一个正确的标准界面,并且是包含了人工测试价值的资产。当下一次测试的时候,这部分价值就应该被保留并重用起来,用于减少新的一次测试的时间,从而实现界面的快速回归测试。为了解决上面提到的各种问题,视觉感知测试孕育而生。它使用传统的对图片进行二进制比较的办法,结合敏捷迭代开发的理念,产生的一种针对界面布局的自动化测试方法。

  • 手工服务部署和测试 (上)

    2019 年 8 月 13 日

  • 一种有效的测试策略

    文章介绍Jimmy Bogard在做一个大型项目时实施的一种有效的测试分层策略:包括系统测试、皮下测试、单元测试。作者认为最有价值的测试策略是从全系统测试开始,然后往下移,直至单元测试。当一个应用程序对业务有决定性作用时它将不得不面临变更,这样的全盘考虑特别有效。

  • 那些 BDD 中用到的工具们

    BDD框架通过提供DSL,帮助业务人员,测试人员,开发人员定义需求的验收标准,共同得到一个明确的需求完成的定义。通过和webdriver集成,使这个验收标准变得可执行,大大减少了手工验证的压力,当软件通过了这个验收标准,则意味着这个需求已经开发完成。

  • 敏捷测试 之 借力 DSL

    随着敏捷越来越广为人知,敏捷测试也更多受到了大家的关注。在这里,我想谈一下我在敏捷项目中遇到的一个自动化测试相关问题以及我们如何借助DSL领域专用语言来解决它。

  • Selenium DDT:使用 DDT 模块实现数据驱动的测试

    2020 年 8 月 27 日

  • 132|微信支付:测试支付确认接口是否可用

    2020 年 12 月 21 日

  • 如何测试 ASP.NET Core Web API

    在本文中,我们将研究如何测试你的ASP .NET Core 2.0 Web API解决方案。我们将了解使用单元测试进行内部测试,使用全新的ASP .NET Core的集成测试框架来进行外部测试。

  • 利用 Spec Flow 编写自动化验收测试

    验收或功能测试是验证系统是否满足需求的一种测试。这些测试作为黑盒测试的一种,与其内部具体执行无关。而MustafaSaeed HajAli则向我们展示了如何使用SpecFlow来自动化这些测试。

  • 探索式测试的秘密

    很多人都会问到底什么是探索式测试,也有很多人知道很多时候我们就是在做探索式测试(只是我们自己不知道而已),不管怎样,我们都期望把很好的测试方法或手段传承下去,让新加入测试行业的同学都可以吸收这个武林秘籍。

  • 使用 Selenium 执行远程测试

    2020 年 9 月 3 日

  • 09 丨关联和断言:一动一静,核心都是在取数据

    今天,我们通过两个例子来思考一下,到底该怎样理解关联和断言。

    2020 年 1 月 3 日

  • 使用 pytest 重构项目:实现用例依赖、测试报告、数据参数化

    2020 年 8 月 20 日

  • 如何进行高效的 Rails 单元测试

    在笔者开发的系统中,有大量的数据需要分析,不仅要求数据分析准确,而且对速度也有一定的要求的。没有写测试代码之前,笔者用几个很大的方法来实现这种需求。结果可想而知,代码繁杂,维护困难,难于扩展。借业务调整的机会,笔者痛定思痛,决定从测试代码做起,并随着不断地学习和应用,慢慢体会到测试代码的好处。本文忠实的记录了在这个过程中所获得的经验,介绍了如何进行高效的Rails单元测试。

  • 通过 demo 学习 OpenStack 开发 --API 服务 (4)

    《通过demo学习OpenStack开发》专栏是刘陈泓的系列文章,专栏通过开发一个demo的形式来介绍一些参与OpenStack项目开发的必要的基础知识,希望帮助大家入门企业级Python项目的开发和OpenStack项目的开发。刘陈泓主要关注OpenStack的身份认证和计费领域。另外,还对云计算、分布式系统应用和开发感兴趣。 上一篇文章说到,我们将以实例的形式来继续讲述这个API服务的开发知识,这里会使用Pecan和WSME两个库。

  • 一个 Golang 项目的测试实践全记录

    一个链路涉及了4个服务,本文带你了解它是如何进行测试的。

发现更多内容

架构师课程第六周总结

dongge

week06 作业

雪涛公子

架构师0期第六周命题作业

何伟敏

官方剧透:1.11 发版前我们偷看了 Flink 中文社区发起人的聊天记录

Apache Flink

flink

Doris服务节点临时失效处理过程时序图

任小龙

极客大学架构师训练营

架构师训练营——第6周学习总结

jiangnanage

WEEK6-学习心得

蒜泥精英

week6 总结

雪涛公子

java 后端博客系统文章系统——No6

猿灯塔

分布式总结

周冬辉

nosql zookeeper 分布式 CAP原理

week6 学习总结

任小龙

极客大学架构师训练营

Android | 《看完不忘系列》之Glide

哈利迪

android

架构师训练营第六周作业

Bruce Xiong

Lesson 6 分布式系统架构-分布式数据库、NoSql、ZooKeeper -心得笔记

edd

字节跳动基于Flink的MQ-Hive实时数据集成

Apache Flink

flink

架构师训练营第六章总结

吴吴

分布式数据库设计中关键几点

dony.zhang

CAP原理

WEEK6-作业-对CAP理解

蒜泥精英

第六周总结

晨光

第六周·命题作业·CAP原理

刘璐

极客大学架构师训练营-cap原理

Geek_zhangjian

week06作业

Safufu

架构师第六周培训学习总结

小蚂蚁

架构师训练营第六章作业

吴吴

第六章学习总结

李白

架构师培训第六周习题

小蚂蚁

架构师训练营 第六周 作业

极客

架构是训练营

第六周学习总结

CP

信创舆情一线--英国禁用华为5G设备

统小信uos

5G

架构师训练营——第6周作业

jiangnanage

高并发下数据库方案演进

superman

分库分表 极客大学架构师训练营

你的测试写全了吗?-InfoQ