在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

单元测试 VS 异步代码随机测试的随想

  • 2014-08-26
  • 本文字数:907 字

    阅读完需:约 3 分钟

众多“任务 + 异步 / 等待”模式有意思的特性之一是用户能够比较容易地对任何操作的结果进行装饰。微软的 Lucian Wischik 展示了如何采用这种特性的优势,以使得您的端到端测试结果更加健壮。

使用 Mr.Flakey 就跟在 Windows 8 或者 Windows Phone 8 应用的每一个 await 语句后面加上“.Flakey()”一样简单。

复制代码
Dim r = Await
http.GetStringAsync(uri).Flakey()

启用之后,每个异步调用都将会触发一个对话框,用户可以选择点击“ok”按钮, 这样会像正常一样返回结果,或者点击“fail”按钮来模拟一个网络或者服务器异常。

为什么使用这种随机测试而不编写一套全面的单元测试用例呢?Lucian 解释如下:

单元测试:以我个人的经验,单元测试在测试分布式算法中并不是非常有效。测试的时候需要花费相当多的努力建立环境(比如,模拟网络环境),而且这种测试方法注定不够全面,并且以我个人经验来看,单元测试实在是不太适合于发现分布式环境下的缺陷。我怀疑这是因为程序员的大脑经常会沿着他们算法中“正确”的路径进行思考,而不太擅长面对其他各种错误路径。

(想一想:当你查看并发程序代码的时候,你是不是一个仅仅通过查看代码就能够发现竞争条件的人?你团队中有人能够做到这个吗?你曾经写过一个发现竞争条件的单元测试用例吗?至少我还没有过)

随机测试: 发现缺陷的一个非常棒的方式是交互式的随机测试。如果通过用户界面就能非常容易地模拟错误,你就几乎可以将自己的脑袋设置成自动导航模式,随机地点击界面上的各个位置,很快就能发现应用程序运行行为不正确的地方。

我被 Leslie Lampor 在 1990 年研究的“时态逻辑检查器”迷住了 -- 这是一种自动探索巨大指数空间可能性的方法(类似于我们在分布式算法中所面对的问题)。他所发现的在可能性空间“自动随机遍历”最后在实践中证明确实能够发现所有的缺陷,并且远远比对每一个可能性进行详尽测试更加有效。

查看英文原文 Thoughts on Unit Testing vs Ad-hoc Testing with Asynchronous Code


感谢赵震一对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-08-26 17:172125

评论

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

架构师训练营 1 期 - 第六周 - 技术选型2

三板斧

极客大学架构师训练营

移动端堆栈关键行定位的新思路

移动研发平台EMAS

移动应用 应用崩溃 崩溃分析

LeetCode题解:90. 子集 II,迭代,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

零基础IM开发入门(四):什么是IM系统的消息时序一致性?

JackJiang

JVM垃圾回收与一次线上内存泄露问题分析和解决过程

AI乔治

Java 编程 架构 JVM 内存泄漏

让你怀疑人生的重载和重写的区别

艾小仙

Java 编程语言

SpringBoot- 技术专题 -Websocket+Nginx出现404问题

码界西柚

震惊!线上四台机器同一时间全部 OOM,到底发生了什么?

AI乔治

Java 架构

SpringBoot-技术专题-Websocket消息推送和广播消息推送

码界西柚

JUC之 FutureTask 源码与工作原理分析

AI乔治

Java 编程 架构 jdk 线程

全国区块链信息服务备案超千个

CECBC

区块链 金融

低代码开发平台的敏捷之力

雯雯写代码

敏捷开发 低代码 信息化

高频面试题:秒杀场景设计

艾小仙

Java 面试 高并发 秒杀

腾讯安全披露多个0day漏洞,Linux系统或陷入“被控”危机

微信小程序接口测试时appid为空如何解决

测试人生路

微信小程序 接口测试

阿里五位大佬总结的操作系统+程序员必知硬核知识大全离线版pdf火了,在Github上获赞89.3K+,现已开源!

996小迁

架构 面试 操作系统 计算机

中国程序员超5000万?一线城市IT岗位已开始饱和过剩?

Java架构师迁哥

登陆!Let's Start Coding

蚂蚁集团移动开发平台 mPaaS

移动开发 mPaaS

React Ref 如何使用(译)

西贝

Java 翻译 React Hooks Ref

LeetCode题解:90. 子集 II,迭代+位运算,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

JUC 之ThreadPoolExecutor实现原理分析

AI乔治

Java 架构 jdk 线程

AI 科学家带你快速 Get 人工智能最热技术

京东科技开发者

人工智能

Java先驱者发布最新Java全栈面试“秘籍”,助力你吃透Java新特性!

Java架构追梦

Java 学习 编程 架构 面试

第七周课后总结

饭桶

Appium常用操作之「微信滑屏、触屏操作」

清菡软件测试

谈谈项目中主动full gc的一些问题

AI乔治

Java 编程 架构 JVM GC

跟Kafka学技术系列之时间轮

AI乔治

Java 编程 架构

鬼知道我经历了什么!全靠这份999页Java面试宝典,我刚拿到美团offer!

Java架构追梦

Java 程序员 架构 面试 美团

第七周课后练习

饭桶

《Among Us》火爆全球,实时语音助力派对游戏开启第二春

ZEGO即构

语音 游戏 RTC

云原生时代下数据库管理工具的变革

BinTools图尔兹

数据库 sql 云原生 数据治理 工具软件

单元测试VS异步代码随机测试的随想_软件工程_Jonathan Allen_InfoQ精选文章