抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

矩阵化你的 Rails 功能测试

2007 年 4 月 23 日

在他最近发布的测试工具 ZenTest 3.5.0 版本里,Dyan Davis 增加了一个新的方法以应对多案例(Case)测试的情况。他建议的方法是使用矩阵。想像一下在你的应用中要同时测试几个属性(带有直交状态的:可读VS. 不可读……)。基本上你会采取下面四个方法:

def test_edit_user_readable<br></br>    <span>some_setup_to_initialize_user_readable_context</span><br></br>    <span>some_action_here_edit</span><br></br>    <span>some_assertion_error_read</span><br></br>end<p>def test_edit_user_writable</p><br></br>    <span>some_setup_to_initialize_user_writable_context</span><br></br>    <span>some_action_here_edit</span><br></br>    <span>some_assertion_edit</span><br></br>end<p>def test_view_user_readable</p><br></br>    <span>some_setup_to_initialize_user_readable_context</span><br></br>    <span>some_action_here_view</span><br></br>    <span>some_other_assertion_view</span><br></br>end<p>def test_view_user_writable</p><br></br>    <span>some_setup_to_initialize_user_writable_context</span><br></br>    <span>some_action_here_view</span><br></br>    <span>some_other_assertion_view</span><br></br>end这儿很容易就可以看出其中有些代码能被提取或者分解出来。但是 Ryan 做的更彻底,他把代码组织成一个矩阵,列首代表不同的 Setup 案例,行首代表要做的 Action,交集定义给定的 Action 和 Setup 上下文的期望结果。4 个测试案例(Case)如下面所示:

复制代码

setups :user_readable,:user_writablematrix:edit,:error_read,:editmatrix:view,:view,:view
ZenTest 通过 **Setup方法保存案例,matrix方法为每一个应用结果创建一个测试方法:def test_#{action}_#{setup}<br></br>    matrix_setup_configuration #{setup}.split(//) # global setup<br></br>    matrix_setup_#{action} #{setup}, #{expected} # action setup + execution<br></br>    matrix_test_#{expected}, #{setup} # expected verification<br></br>end
所以最后,Setup 配置会在一个地方被提取出来,容纳不同案例中的参数。Action 和 Assertion(断言)也被分开。Ryan Davis 给出了一个
矩阵化 ** 前后测试案例的可视化例子:

点击图片查看详细代码

测试矩阵模型是 DRY(Don’t Repeat Yourself,不重复自己)流程哲学的又一个示范。这种用法的好处是使非开发人员较容易地理解代码成为可能,而且要增加测试的话,只需要修改矩阵就可以了。

2007 年 4 月 23 日 08:17414

评论

发布
暂无评论
发现更多内容

即将步入职场,忐忑而又期待的新人菜鸟

菜农阿飞

成长 新人

周报 01|多点分享,少点创作

强劲九

学习 读书

Go语言获取程序各类资源的绝对路径的方法

良少

Python go 路径 动态 绿色

C++中glog源码剖析以及如何设计一个高效 log模块

helloworld

c++ 编程语言

如何写排版优雅简洁的文章?

池建强

写作 排版

这里有一个慢 SQL 查询等你来优化

程序猿石头

MySQL 数据库 性能优化 后端

MySQL中order by语句的实现原理以及优化手段

天堂

Java MySQL 性能优化

高仿瑞幸小程序 00 准备工作

曾伟@喵先森

小程序 微信小程序 前端 瑞幸

HashMap 的 7 种遍历方式与性能分析

Bruce Duan

Java 性能 hashmap 遍历

KubeFATE: 用云原生技术赋能联邦学习(一)

亨利笔记

人工智能 学习 FATE KUBEFATE

阿里巴巴Java开发手册泰山版解读

Bruce Duan

死磕Java并发编程(7):读写锁 ReentrantReadWriteLock 源码解析

七哥爱编程

Java并发 读写锁 ReentrantReadWriteLock

游戏夜读 | 2020周记(3.27-4.3)

game1night

Hive 中的 GroupBy, Distinct 和 Join

tkanng

sql 大数据 hadoop hive

DDD 实践手册(2. 实现分层架构)

Joshua

设计模式 领域驱动设计 DDD 系统架构 分层架构

InfoQ写作平台首秀,来个自我介绍

nuhcoad

个人感想

MySQL的死锁系列- 锁的类型以及加锁原理

程序员历小冰

MySQL

使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源

mzlogin

CDN Jekyll GitHub Pages 个人博客

韦小宝真的幸福吗 | Random Forest

张利东

Python 学习

关于5G RCS的产品猜想

机器鸟

3NF建模&维度建模

常海峰

运维常见问题及排查思路

编程随想曲

运维

为什么正在使用的Java版本跟环境变量的版本不一致

阡陌r

Java 踩坑

初步了解MyBatis

Java收录阁

mybatis

什么是 MQ ?

itfinally

系统设计 MQ

GroupBy 用法的三重境界,面试终结者

Hyun

数据库 sql 大数据 性能优化 数据分析

Windows Terminal添加右键菜单

simon

Windows Terminal 右键菜单 终端 开发者工具 命令行

每日一道python面试题 - Python的函数参数传递

志学Python

Python 爬虫 面试题 python 爬虫 python3.x

程序员陪娃漫画系列——魔方

孙苏勇

程序员 生活 程序员人生 陪伴 漫画

用行动解决情绪,情绪永远是累赘

熊斌

情绪控制 团队协作

爬虫(107)Python 3.7的超酷新功能(接近一万字,请耐心享用,而且建议收藏)

志学Python

Python 最佳实践 python 爬虫 python3.7 python升级

Study Go: From Zero to Hero

Study Go: From Zero to Hero

矩阵化你的Rails功能测试-InfoQ