[译] 单元测试,精益创业,以及两者之间的关系
- 原文地址:Unit testing, Lean Startup, and everything in-between
- 原文作者:Itamar Turner-Trauring
- 译文出自:掘金翻译计划
- 译者:gy134340
- 校对者:zhaochuanxing,yifili09
为什么软件需要测试?
我曾经以为是为了产出高质量的代码:你总是需要测试因为你总是需要写出高质量的代码。
但是这个观点有几点问题。
有时候质量不是主要问题。
在“精益创业” 这本书中,作者 Rric Ries 说过有时候发布一个软件最终发现没人真的想用它。
这也是他创作的动机之一: 为创业初期建立一套更好的方法论,在真正投入时间去构建一个高质量的产品时,就能够发现这款产品是否能够成功的方法论。
如果没人用你的软件的话那么确保高质量纯属浪费时间。
即使高质量很有必要,但高质量与测试之间的关系却很模糊的。
一个 QA 的团队跟自动化的单元测试又什么不同?
他们的确不一样,但他们又分别给出什么样的质量?
什么时候需要特别的测试?
另外,测试是有成本的:你怎样辨别成本的花费是否超出回报?
比如说,有一家做税务申报软件的公司(我稍微改了一下细节)。
他们使用 Selenium 来对他们网站的 UI 来测试... 但是他们的应用依然很烂,而且每次改变 UI 测试都会崩溃。
这个测试并没有改变产品的质量,相反浪费了程序员的时间来维护测试。
他们做错了什么?
说我们都需要写出高质量的软件并不能帮助解决这些问题。
那我们回头来更加深入的讨论一下。
测试的意义是什么?
康熙字典 :) )里告诉我们测试是为了 “举证,通过一定原则或标准或实验来,证明真理,真实性。“
软件质量就在那里,是的,但事实却又不仅如此。
准确的说,这只是英语定义,可以肯定,有很多不说英语的开发者。
我不想被字典来束缚我们的行为。
人类语言是数世纪以来对世界的观察和理解,也是我们可以拿来借鉴的宝库。
那我们来以这个为出发点来看看能学到点什么。
测试的第一个方面
下面这个是测试吧?
def test_add():assert add(2, 2) == 5
没错,他还真是,没毛病。
看函数名,一点都没错。
测试说明 add()
做了他该做的:将两个数相加得到结果。
你注意到这个测试是错的。
幸运的是我们的开发流程进入到了另一步:代码审查。
亲爱的读者们,代码审查告诉我我的代码是错的,2 + 2 = 4,不是 5。
代码审查是不是测试的一种?
根据字典定义来说是的:代码审查就是根据标准来验证代码的 “正确,真实性和质量”,这个从小我们就知道。
那我们假设代码审查跟单元测试一样都是测试的一种。
他们都是测试,却又相当不同。
那主要的区别在哪里?
一种是自动化的,一种是人来做的。
自动化测试具有一致性和可重复性。
你可以这样写:
def test_add_twice():for i in range(10000000):assert add(i, i) == 2 * i
电脑每次都跑一遍一摸一样的代码。
代码可以保证根据输入每次调用add()
返回他们的结果。
人在手动验证一千万种不同的计算时会遇到一些困难,比如无聊、分心、失误、缓慢啦等等。
另一方面,任何人都可以很快的告诉你下面的代码是错的:
def add(a, b):return a + b + 1
计算机只按照指令执行操作,孰对孰错,人类能赋予它意义。
只有人才知道软件是为何而生。
现在我们知道每种测试的不同,以及如何组织它:人类来发现意义,自动化测试确保一致性。
测试的第二个方面
我们来看一下测试的另一个方面。
“A/B 测试”是一种尝试不同分类来看哪种结果更好的测试。
比如你为了测试网站新的设计:给 90% 的访问者原有的设计,同时给 10% 的访问者新的设计,看看哪种注册人数多一点。
这是测试吗?
这就叫 “A/B 测试”,跟它的名字一样。
我们来重新看一下字典定义:“举证,通过一定原则或标准或实验,来证明真理,真实性。”
字典上说这也是测试,因为通过实验。
我们通过实验来看看哪个版本更受欢迎。
单于测试和代码审查,对比来说,就是通过一定原则或标准来测试。
我们对软件有一些特定规格,一些我们希望软件的行为,同时我们确保它符合规格。
现在我们有了第二种理解与组织测试的方法:通过实验测试 vs 针对规格测试
测试的象限图
将它们放在一起我们得到下面这张关于测试的图表:
用户行为
- 有人买你的产品吗?
- 设计的改变会影响注册人数吗?
- 用户知道软件是如何工作的吗?
这些都是无法通过软件是否符合规格来回答。
相反需要你的经验知识:你需要观察人对软件的真实反映。
软件表现
- 你的软件在负载下表现如何?
- 你的产品抛出异常吗?
这些问题不能通过对比规范来解答,
你需要把软件跑起来看看到底会发生什么。
功能正确性
- 你的软件符合规范吗?
- 它做了它该做的吗?
很容易说自动化的测试可以证明这一点,但有没有想过单元测试在检查 2 + 2 = 5。
在基本的层面上,软件可以在技术上符合规范却完全无法达成规范的初衷。
但只有人明白规范的含义,和辨别是否匹配这个规范。
功能的稳定性
- 你的公有 API 对于相同输入返回相同的值吗?
- 你的代码是否提供了它该提供的?
人不是测试这个问题的好办法。
所有人都会忽略小问题:如果一个按钮从 “Send Now” 变成 “Send now”,很多人都不会注意到。
对比来说,如果你的 API 从 sendNow()
变成 send_now()
,或者返回一个不同类型的值,你的软件就会崩溃。
这就是说公有的 API,或者其他软件依赖的 API,需要稳定性来确保正确性。
为私有的接口写自动化测试,或者对于迭代较快的代码,更新测试将导致极高的维护成本。
应用上述模型
如何应用模型?
选择如何测试
首先,模型可以帮助你根据你的目标选择合适的测试。
如果一家初创公司做一个没人用的软件。
写自动化测试纯属浪费时间,因为他连用户想要什么都不知道就开始专心实施了。
这里需要用精益创业的方法论,一个专注于用实验找到什么产品将满足客户的需求的方法来解决。
这意味着专注于用户行为象限。
只有证明他值得花费时间来进行下去,才值得对这个产品来做一些为了功能性和稳定性的测试。
了解你是否选择了错误的测试类型
第二,这个模型可以帮助你改变错误的行进路线。
比如说那家初创的税务公司,如果他们对于 UI 进行自动化测试但是并没有发现问题,然后每改变一次 UI,整个系统都要重新来进行一遍测试。
他们的问题在于系统的两个方面:
- 税务机制是相当稳定的:税率每年只变一次。
这就需要他们对核心的税务计算部分进行稳定性或者单元测试。
正确性可以通过代码审查和税务会计来反馈。 - 基于 web 的用户界面
UI 一直在变,说明不需要稳定性测试。
正确性测试可以通过人工测试来解决(比如说写代码的开发者)。
讨论测试的根据
最后,这个模型提供了一个公有的术语,来讨论的测试的意义及其不同的目标。
- 对于人工测试还是单元测试的优异性选择,你可以从一个很清楚地表明它们之间的差异的模型开始。
- 你也可以从一个完全不同的角度对公司的其他方面(比如市场)来讨论测试。
总结
- 无论是选择人还是自动化测试来保持持续性,都是有意义的,自动化测试提供准确性,人手工测试提供意义性。
- 即需要通过实验,也需要对比规范来进行测试。
- 每个组合提供了不同的测试形式:用户行为、软件行为、正确性、稳定性。
- 确保根据你的目标和情况来选择合适的测试方式。
[译] 单元测试,精益创业,以及两者之间的关系相关推荐
- 一本好书-《精益创业》
http://www.cnblogs.com/sennly/p/4140023.html <道德经>和<精益创业>的暗合可以显示古今中外的人类智慧多么相通.不过,与老子惜字如金 ...
- 《精益创业》- 天下大事必作于细,天下难事必作于易
<道德经>和<精益创业>的暗合可以显示古今中外的人类智慧多么相通.不过,与老子惜字如金的风格不同,Eric Ries从实际操作的角度写出了一本300页厚的书,对如何" ...
- MVP的精益创业模式
一.前言 1.传统创业模式-局限性 1.1火箭发射式的创业模式 例子:诺基亚 没有以客户与需求为中心,以用户为导向,也没有注重与用户所互动得到反馈.没有顺应时代发展的需求,没有占据智能手机市场. 创业 ...
- 精益创业实战 - 第14章 评估产品和市场的匹配程度
要评估产品和市场的匹配程度,必须首先定义一个指标.有了指标就相当于设定了目标,这样你就可以按照这个目标来系统地改进产品了. 14.1 什么是产品和市场匹配 14.2 肖恩测试 14.3 只关注&quo ...
- 《反精益创业》第二章
反精益创业第二章:理论基础与创业前准备(1) "你的格局一旦被放大之后,再也回不到你原来的大小" -- 催眠大师马修.史维 一.反精益创业的概念 如第一章所述,精益创业核心理念是& ...
- 《精益创业UX篇——高效用户体验设计》一第1章 早期验证
本节书摘来自异步社区<精益创业UX篇--高效用户体验设计>一书中的第1章,第1.1节,作者[美]Laura Klein,更多章节内容可以访问云栖社区"异步社区"公众号查 ...
- 精益创业的理论和案例分析
精益创业的理论和案例分析 --使用物理学分析管理学,让管理学从艺术变为科学 内容提要:精益创业是将精益理论应用于创业领域.精益创业有两大支柱,分别是快速迭代和最小化可用产品(MVP),其基础为持续试错 ...
- 精益创业——精益理论的阐述与案例【经典】【转】
from:http://kenny7.com/2012/12/lean-startup-note.html 创业是在极端不确定情况下开发新产品或者新服务.在创业早期,谁是客户,客户认为什么东西有价值都 ...
- 第26件事 精益创业的3个访谈
上次培训创建了一个画布案例,此次还是使用相同的画布,实施3个访谈,分别是痛点访谈.解决方案访谈和MVP(Minimum Viable Product,最简可用产品)访谈.之后会根据相应的访谈结果更新和 ...
最新文章
- DOM manipulation
- 全凭“脚感”,这个不看路的机器人就能稳稳爬楼梯,一脚踩空也不怕 | RSS 2021...
- RunLoop的学习
- Qt中为自己的程序建立一个消息循环
- nmon在linux系统中的应用
- 时分多路复用(Time Division Multiplexing,TDM)
- java unicode编码转换中文_Java实现 中文转换成Unicode编码 和 Unicode编码转换成中文...
- 无线传感器网络(一)基于无锚节点的WSN系统设计
- Android拨打电话权限总结
- 【转】统一μITRON,日本成立开放源码ITRON团体
- R语言——read.table;read.csv(读取外部数据)
- form-generator扩展原生表格,element-table,子表单等组件
- ASP对接国际验证码接口DEMO示例
- 合理利用计算机虚拟内存,合理设置虚拟内存,目前8G内存足够日常使用
- linux系统盘的概念,了解linux系统硬盘分区概念-SELinux入门-linux网卡配置及参数学习_169IT.COM...
- 毕设论文写作技巧 2021-10-9
- H3C交换机做网关,Tracert第一跳超时的解决办法
- 2015年系统架构师软考案例分析考点
- 长沙含浦大道与云栖_集团动态
- Lego-LOAM雅可比矩阵的推导
热门文章
- Stack Overflow通过关注性能,实现单块应用架构的扩展能力
- 重载session存储方式–session_set_save_handler()
- 基于UDP协议的套接字+socketserver模块
- R语言学习(10)获取数据
- Java 读取指定目录下的文件名和目录名
- 机器学习中的相似性度量 (转)
- 【effective c++读书笔记】【第8章】定制new和delete(2)
- less css用法思维导图
- 庐山真面-Oxite的HelloWorld
- python如何计算字符宽度_Python中计算字符宽度