本文讲的是[译] 单元测试,精益创业,以及两者之间的关系,
  • 原文地址: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,整个系统都要重新来进行一遍测试。
他们的问题在于系统的两个方面:

  1. 税务机制是相当稳定的:税率每年只变一次。
    这就需要他们对核心的税务计算部分进行稳定性或者单元测试。
    正确性可以通过代码审查和税务会计来反馈。
  2. 基于 web 的用户界面
    UI 一直在变,说明不需要稳定性测试。
    正确性测试可以通过人工测试来解决(比如说写代码的开发者)。

讨论测试的根据

最后,这个模型提供了一个公有的术语,来讨论的测试的意义及其不同的目标。

  • 对于人工测试还是单元测试的优异性选择,你可以从一个很清楚地表明它们之间的差异的模型开始。
  • 你也可以从一个完全不同的角度对公司的其他方面(比如市场)来讨论测试。

总结

  • 无论是选择人还是自动化测试来保持持续性,都是有意义的,自动化测试提供准确性,人手工测试提供意义性。
  • 即需要通过实验,也需要对比规范来进行测试。
  • 每个组合提供了不同的测试形式:用户行为、软件行为、正确性、稳定性。
  • 确保根据你的目标和情况来选择合适的测试方式。





原文发布时间为:2017年3月27日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。

[译] 单元测试,精益创业,以及两者之间的关系相关推荐

  1. 一本好书-《精益创业》

    http://www.cnblogs.com/sennly/p/4140023.html <道德经>和<精益创业>的暗合可以显示古今中外的人类智慧多么相通.不过,与老子惜字如金 ...

  2. 《精益创业》- 天下大事必作于细,天下难事必作于易

    <道德经>和<精益创业>的暗合可以显示古今中外的人类智慧多么相通.不过,与老子惜字如金的风格不同,Eric Ries从实际操作的角度写出了一本300页厚的书,对如何" ...

  3. MVP的精益创业模式

    一.前言 1.传统创业模式-局限性 1.1火箭发射式的创业模式 例子:诺基亚 没有以客户与需求为中心,以用户为导向,也没有注重与用户所互动得到反馈.没有顺应时代发展的需求,没有占据智能手机市场. 创业 ...

  4. 精益创业实战 - 第14章 评估产品和市场的匹配程度

    要评估产品和市场的匹配程度,必须首先定义一个指标.有了指标就相当于设定了目标,这样你就可以按照这个目标来系统地改进产品了. 14.1 什么是产品和市场匹配 14.2 肖恩测试 14.3 只关注&quo ...

  5. 《反精益创业》第二章

    反精益创业第二章:理论基础与创业前准备(1) "你的格局一旦被放大之后,再也回不到你原来的大小" -- 催眠大师马修.史维 一.反精益创业的概念 如第一章所述,精益创业核心理念是& ...

  6. 《精益创业UX篇——高效用户体验设计》一第1章 早期验证

    本节书摘来自异步社区<精益创业UX篇--高效用户体验设计>一书中的第1章,第1.1节,作者[美]Laura Klein,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  7. 精益创业的理论和案例分析

    精益创业的理论和案例分析 --使用物理学分析管理学,让管理学从艺术变为科学 内容提要:精益创业是将精益理论应用于创业领域.精益创业有两大支柱,分别是快速迭代和最小化可用产品(MVP),其基础为持续试错 ...

  8. 精益创业——精益理论的阐述与案例【经典】【转】

    from:http://kenny7.com/2012/12/lean-startup-note.html 创业是在极端不确定情况下开发新产品或者新服务.在创业早期,谁是客户,客户认为什么东西有价值都 ...

  9. 第26件事 精益创业的3个访谈

    上次培训创建了一个画布案例,此次还是使用相同的画布,实施3个访谈,分别是痛点访谈.解决方案访谈和MVP(Minimum Viable Product,最简可用产品)访谈.之后会根据相应的访谈结果更新和 ...

最新文章

  1. DOM manipulation
  2. 全凭“脚感”,这个不看路的机器人就能稳稳爬楼梯,一脚踩空也不怕 | RSS 2021...
  3. RunLoop的学习
  4. Qt中为自己的程序建立一个消息循环
  5. nmon在linux系统中的应用
  6. 时分多路复用(Time Division Multiplexing,TDM)
  7. java unicode编码转换中文_Java实现 中文转换成Unicode编码 和 Unicode编码转换成中文...
  8. 无线传感器网络(一)基于无锚节点的WSN系统设计
  9. Android拨打电话权限总结
  10. 【转】统一μITRON,日本成立开放源码ITRON团体
  11. R语言——read.table;read.csv(读取外部数据)
  12. form-generator扩展原生表格,element-table,子表单等组件
  13. ASP对接国际验证码接口DEMO示例
  14. 合理利用计算机虚拟内存,合理设置虚拟内存,目前8G内存足够日常使用
  15. linux系统盘的概念,了解linux系统硬盘分区概念-SELinux入门-linux网卡配置及参数学习_169IT.COM...
  16. 毕设论文写作技巧 2021-10-9
  17. H3C交换机做网关,Tracert第一跳超时的解决办法
  18. 2015年系统架构师软考案例分析考点
  19. 长沙含浦大道与云栖_集团动态
  20. Lego-LOAM雅可比矩阵的推导

热门文章

  1. Stack Overflow通过关注性能,实现单块应用架构的扩展能力
  2. 重载session存储方式–session_set_save_handler()
  3. 基于UDP协议的套接字+socketserver模块
  4. R语言学习(10)获取数据
  5. Java 读取指定目录下的文件名和目录名
  6. 机器学习中的相似性度量 (转)
  7. 【effective c++读书笔记】【第8章】定制new和delete(2)
  8. less css用法思维导图
  9. 庐山真面-Oxite的HelloWorld
  10. python如何计算字符宽度_Python中计算字符宽度