《神奈川冲浪里》,葛饰北斋,1830年。
它是世界上最知名的艺术品之一,它有着知名的符号和emoji表情:🌊。
神奈川冲浪里是一副日本木刻版画。不同于油画和素描,而是一副版画。在日语中,这种艺术手法被称为浮世绘,被称为“画板上的世界”。浮世绘第一次出现在1660年左右,当时并没有引起广泛关注,直到两个世纪之后的明治维新。当大多数艺术家关注点在人民的时候,有一部分专家(例如葛饰北斋)将注意力放在海洋与自然上。比如,在《神奈川冲浪里》中,我们看到巨浪,带着巨大的能量,冲向三只前来海边捕鱼去市集上卖鱼的小船。它席卷着充满活力的蓝色海水和白色浪花对抗着黄灰色的天空。在遥远处是富士山,日本最高的山脉,在海浪的对比下相形见绌。事实上,浪花中的水已经盖过了富士山的雪,如果你不走近看,你可能会把富士山错看成另一个渺小的浪花。
《巨浪》绝对令人惊叹,它可以说是葛饰北斋最好的作品。它的颜色和线条体现出了大胆,浪花的爪子被赋予了生命力,在渔船中的人们表现着顺从和恐惧。浪花中的水雾彰显着细腻和对细节的关注。就个人而言,我喜欢像这样的浮世绘,我独自周游世界去欣赏它们。它们的质量、创造性、以及它们展示出的工艺激励着我尽可能把高品质融入到工作中。
作为软件质量专业人员,有一些事情是我们可以像诸如葛饰北斋这类的浮世绘大师学习的。软件测试是一项艺术,也是一项工程。我们可以在这些艺术家身上获得线索,并学习我们在工作上如何提供自己的质量。在这篇文章中,我将分享从葛饰北斋的《巨浪》中学习到的8条软件测试建议来建议我们自己的“巨浪”,让我们开始吧!
第一条理念:专注行为
尽管我们目前重视有着较高成就的日本木工作品画,在几个世纪前的日本,它们依旧被认为是随处可见现象。对于当时的年轻人来说,葛饰北斋是一种“低级”艺术,在丝绸上绘画的才被认为是高级艺术。
人们可以花费略高于一碗面条的钱在当地商人手中购买一副这样的印刷品,价钱大概是现在的5-10美元。他们会用这些画作去装饰他们的房子。相比之下,《巨浪》的一副版画在2020年11月拍卖出了一百一十一万美元的高价。
这些印刷品并不是非常大,相反,《巨浪》仅仅只有10英寸高,15英寸宽,大多数的印刷品也是类似的尺寸。这使得他们在市场中非常容易被买下,运回家中并挂在墙上,为了理解日本人民在现在是如何对待这些印刷品,就像你在Home Goods和Target这些商店中购买装饰品一样。你家墙上也会有一些丝织装饰品或者海报。
考虑到大多数浮世绘的购买者是工薪阶层的普通劳动人民,他们需要价格实惠的,流行的并且易识别的版画。就像葛饰北斋并没有单独绘制《巨浪》,它并不是一副单独的作品,它是《富岳三十六景》中的第一幅画作,和其他三幅画作并为第一系列。这些画作的中心都是富士山,这让每一个日本人民都可以直观的认出来,这些不同的景色之间也存在着联系。
《凯风快晴》,用了强烈的色彩对比展示着山上温暖的天气。
《山下白雨》用相同的角度描绘了富士山,但是在雷击之下,整个山坡阴暗的一面。
《甲州三岛》以富士山作为背景,描绘了两个渔夫。
这些画作的共同特征使得它们价值不菲,每个人都能在这36副画中找到1-2个自己最喜欢的作品。它们让艺术变得可以触手可及,它们变得价格低廉,但又让人印象深刻。它们有着艺术气息,但又平易近人。像葛饰北斋这样的艺术家知道人们想要什么,他们给出了答案。
这和软件开发没什么不同,特征增加了用户的附加价值。举个例子,如果你正在开发一款银行的app,用户们更想安全登录并展示他们最近的交易。如果这些特征残破不堪或者反常规使用,用户们大概会使用他们其他的银行账户。我们作为开发者和测试者,就好像创作浮世绘的艺术家一样:我们需要知道我们的顾客们想要什么,我们不仅需要生产出他们想要,更要生产出他们享受的。
特征增加价值。然而,我可能会使用一个更好的词语描述产品的这项特质:行为,行为是一个人的动作或者行动方式。在软件中,我们根据输入和响应来定义行为。例如,登录是一种行为:你输入有效的凭证,并希望获得访问权限。你完成了输入,程序做了一些事情,然后你获得了结果。
我在软件测试和开发中的信念是:如果你专注良好的行为,那么其他的一切都会顺势成功。在规划开发工作时,你优先处理最重要的行为。当你进行测试时,你覆盖了最重要的行为。当用户拿到你的新产品时,他们会从产品中获得价值,并且希望你赚大钱,就像葛饰北斋那样。
这就是我为什么在行为-驱动开发中有着强烈的信念,我把这个模式简称为BDD,就像一次实用的尝试一样,BDD帮助你以及你的团队将注意力集中在一件事情上。BDD涉及的活动就像是三个朋友的合作,实例的映射以及设计Gherkin(英国的“小黄瓜”摩天大楼)。当你专注于行为而不是一些华丽的新技术,或者故事,或者一些其他的娱乐时,你会获得成功。
第二条理念:优先考虑风险
浮世绘艺术作品不仅仅描绘了富士山。事实上,风景画只是在版画印刷的后期(1830年-1860年)才开始流行。在此之前,艺术家主要把关注点放在人身上:艺妓、风俗女、相扑手、歌舞伎演员以及传奇人物。这些来自“漂浮世界”的人物,描述了一个封建日本沉闷的日常生活中不同的快乐和享乐的世界。
这是一副 Sharaku 在1794年绘制的一个歌舞伎演员。
《三代目大谷鬼次郎之奴江户兵卫》,
sharaku仅仅活跃了一年,但他创作了一些浮世绘巅峰时期最具表现力的肖像。江户兵卫是武士的心腹,在这幅画中,我们看到了鬼次郎正打算做肮脏的行为,脸上挂着鲜明的鬼脸,双手因愤怒而抖动。
为什么像sharaku这样的艺术家会像这样印刷面孔,因为他们懂得销售。请记住,浮世绘不是一门高级艺术,它是一门生意。艺术家们可能会制作一系列作品并且在京都的街上贩卖。他们需要画人们想买的画。如果他们选择了无聊或者令人讨厌的元素,这些画就无法销售。他们就会无法果腹。所以我们可以看到他们选择了哪些呢,名人、演员、美女。以及一些对工作不安全的因素。
艺术家们优先处理工作中商业上的风险,他们选择元素使得作品易于销售,他们追求价值。作为测试人员,我们也应该优先处理测试范围内的风险用例。
我知道现在有一句流行语“测试一切!”,但这是不可能的,这就好像说“打印所有图画!”现在的app过于复杂,无法尝试任何方式进行完整100%的覆盖。相反,我们应该将测试工作集中在最重要的行为上,这些报错会导致最多问题的行为上。测试的本质时一项降低风险的活动。我们进行测试是为了降低开发过程中出现问题的风险。
那么,基于风险概念的测试工作应该是什么样子?从覆盖最有价值的行为开始。你可以称之为MVBs。这些表现是app中最重要的部分,如果他们报错,一切直接崩溃。你又无法果腹了!举个例子,如果你无法登录,你就完了。MVBs应该在每次发布之前测试。他们是不可协商的测试范围,如果你的团队没有足够的资源来支持这些测试工作,你应该去申请更多的资源。
除了MVBs之外,你应该测试上一版本中修改的内容。举个例子,如果你的银行软件增加了移动支付功能,那么你就应该测试移动支付功能。开发修改的内容会造成事件的中断。除此之外,测试人员应该关注产品的不同层次和结构。并不是每一个测试都是WEB UI测试,我们应该在代码中增加更多单元测试的错误日志,在应用层增加api测试去发现问题。同时考虑安全请求,访问申请和视觉效果。
当我们进行测试计划的时候,尝试做得又快又细,覆盖单个行为而不是冗长的流程。压缩测试时间,扩大覆盖流程,提升测试质量。如果你有可以做更多覆盖MVBs的资源时,可以利用这些资源扩大测试范围。继续为下一个最有价值行为添加覆盖范围,直到时间用完或者下一个覆盖范围不值得花时间。
总的来说,在权衡风险的时候问一下自己:如果这个特定行为失败,你会有多痛苦?这会摧毁用户的体验,还是他们压根不会注意到。
第三条理念:自动化
本文顶部《巨浪》的复制品在纽约市大都会艺术博物馆中展示,然而,这不是唯一的版本。当浮世绘艺术家在创造他们的画作时,他们就开始创作复制品直到木板破裂!记住,这些不是富人们的珍贵画作,而是平民的海报。一套木版画可以为大众打印数千个流行设计的模板。据估计,《巨浪》有五千到八千个原始副本,但没有人知道确切的数量。直到今天,只有几百人幸存下来。令我感到沮丧的是,拥有复制品的博物馆并不会将他们公开展示,因为它们太脆弱了。
以下是来自不同博物馆的副本:
印刷品生产必须高效且流畅,记住,这是一门生意。印刷工人如果能从同一个木板中印刷出更多的副本,他们就能赚到更多的钱。他们如果在一块木板的生命周期内保持高质量的印刷,他们就会得到更高的名望。他们越快将印刷品推向市场,他们就能越早获得全部的报酬。
我们能从中学到什么呢?自动化!这是我们第三个建议。
我们能从中学到什么呢,自动化!自动化是近代才出现的工艺,如果葛饰北斋用他所有时间只制作了一份《巨浪》的副本,也许我们在今天不会讨论这件事情。但是由于木板印刷时一个完整的过程,他制作了上千个副本供每一个人欣赏,我不会把木板印刷过程称为完全“自动化”,因为它有几个手工过程需要工人完成,但是在那个年代的日本京都,这已经可以被称之为你能接触到的自动化。
相比较于测试工作,如果我们要手工执行用例, 我们需要覆盖一次目标行为,这就意味着我们在同一时间里面消耗大多数人力。但是如果我们采用自动化测试,我们可以在同一时间执行上千个用例,这可以不断创造价值。这就是绘画和版画的区别。
那么,我们应该如何进行测试自动化呢,首先你应该定义好你的目标,你希望通过自动化实现什么目标:是想加快测试周期呢,还是希望扩大测试范围,或者你想通过持续测试来增强持续交付的能力?从一开始就仔细定义目标将有助于在自动化测试策略中做出正确的决策。
当开始自动化测试时,请将它看作完整的软件开发,你不只是在写一堆脚本,你是在开发一个软件系统。遵循建议,使用设计模式,进行代码审查,快速修复错误。无论你使用的时编码工具还是无代码工具,这些原则都适用。
另一个需要避免的是延迟测试自动化。很多时候,我听说团队很难实现测试自动化,因为他们将自动化工作的优先级安排在最低。他们希望可以开发自动化工作,但是他们从来没有时间。相反的,他们为了完成任务而手动去测试MVBs,我的建议是把这种态度推翻。自动化应该放在首位而不是末位。如果有时间,与其计划一些测试去做自动化,不如把自动化放在第一位,并且覆盖一些无法通过手工完成的场景。
此外,尽快将自动化测试集成到团队的持续集成系统中。没有运行的自动化对我而言是死物一团,让它们在系统中自动运行,以便让他们产生价值。每晚甚至每周运行它们是一个好的开始,只要它们保持节奏运行。
最后,学习优秀的做法。测试自动化技术在不断发展,新的工具和框架不断在市场上出现,如果你不熟悉自动化,或者想赶上最新趋势,请花时间学习。我可以推荐最好的资源之一是测试自动化大学,TAU包含了大约70门你能想象到的课程,由世界上最优秀的讲师进行指导,并且完全免费。
现在,你可能会想,“andy,别说了,你知道不是所有事情都可以自动化的。”你说的没错,但这正是人类展示自己增值价值的机会,我们可以同样可以从浮世绘中看到。这是一副葛饰北斋的竞争对手歌川广重的画作《龟户梅屋铺》,我们可以看到画中背景从红色渐变到绿色的过程。
印刷上使用一种波卡西(bokashi)的方式来添加这种渐变,在这种技术中,他们手工将墨水层涂在木板上,有时他们甚至会直接在印刷品上涂图层。在这些情况中,印刷过程的“自动化”是不够的,需要进行人工干预。
让人们使用软件总是好的,自动化非常适合做功能验证,但是无法反馈用户体验。探索测试是对自动化测试的绝佳补充,因为它可以降低不同的风险。
然而,自动化能够做以前做不到的事情。正如我之前提到,我在 Applitools 工作,我们专注于自动化视觉测试。看看这两幅来自松本奉时的青蛙图,能注意到这两幅画有不一致的地方吗?
如果我们用AI来比较这两幅画作,它可以立即找到不同点
签名块位于不同的位置!小的差异(比如像素的偏移)将被忽略,而主要差异将被突出显示。如果你把这种视觉测试方法应用于你的网站或者移动app上,你会用户使用前发现大量的视觉偏差。现代的自动化测试可以做一些非常酷的事情。
第四条理念:测试的左移和右移
Mokuhanga,或者木板印刷,是一种包含多元化步骤的巨大工程。诸如葛饰北斋和歌川广重这样的艺术家并没有印刷自己的作品。事实上,印刷需要多种角色才能成功:出版商、艺术家、雕刻师和印刷商。
- 出版商在实质上运行了该过程,他们委托、资助并分发印刷品。他们甚至和艺术家在绘画设计上进行沟通来保证能跟上时尚潮流。
- 艺术家设计画作的图案。他们会在草稿纸上勾勒出图案,并向雕刻师和印刷商提供如何正确制作版画的步骤。
- 雕刻师会将艺术家的图案凿刻成一套木制印刷块。每一层墨水都有单独的木块。雕刻师通常使用光滑、坚硬的木块,比如说樱桃木。
- 印刷商使用艺术家的图案和雕刻师的木版来制作版画。他们会在木块上涂上正确颜色的水性油墨,然后将纸压在木块上。
质量必须在流程的每一个步骤中得到保证,而不仅仅是在最后。如果艺术家不清楚颜色,印刷商可能会犯错误。如果雕刻师把凹槽切的太深,墨水可能无法按照预期低落在纸上。如果印刷商在印刷过程中没有对齐版面,他们得把木板扔掉——浪费了时间、原料、木板寿命——否则有可能因为印刷错误玷污每个人的声誉。葛饰北斋就因为对雕刻师和印刷商的严格质量标准而闻名。
W·爱德华兹·德明的话听起来很正确:
校验不能提高质量,也不能保证质量。检查为时已晚。质量无论好坏已经体现在产品中了。如同海伦德 F·道济所说,“你无法检查产品的质量。”
这就像软件开发一样,我们可以用德明引用的话中“检查”一词代替“测试”,测试人员并不完全“拥有”质量。每个角色:商务、开发、测试都有责任完成高质量的工作,如果产品负责人没有理解客户所需,或者开发人员忽略了代码审查,或者测试人员忽略了一个重要的功能,产品质量都会大打折扣。
我们该如何提高整个团队的工作质量呢,左移或者右移。
大部分测试人员应该都非常熟悉测试左移。这意味着:测试工作比开发工作要先开始。不要等到开发人员完成开发后才把代码放在环境中进行测试。在开发过程中持续运行测试,在临近交付时使用自动化执行测试,采用测试驱动和行为驱动的实践方式,需要把单元测试添加到开发完成的定义中。
但是测试右移呢,这是一个全新的阶段,但不一定是全新的方式。右移意味着在发布期间和发布后继续监控软件质量。在应用使用中进行观察,监视应用是否存在错误、故障和性能问题。采用金丝雀部署的方式来观察系统对更新的响应。执行混沌测试,了解环境中断机制。用A/B测试方式,对用户投放不同的UI样式,从而找出最有效的UI。并把所学到的所有内容反馈到开发中,就像左移一样。
著名的DevOps循环中展示了左移和右移其实都是流程的一部分,如果你从交叉路径的中间开始,你可以看到直向左侧的箭头,用于反馈、规划和构建。然后他们通过持续集成、部署、监控和运营向右推进。我们可以采取我们之前所说的所有质量措施。因为我们在流程中不断地循环。当我们设置计划时,我们应该通过良好的设计模式和现场反馈来建立质量把控。当我们设计开发时,我们应该测试和开发并行。在我们部署时,自动化安全检查应该给出正确和错误的信息。在持续集成中,我们也持续观察,学习并且进步。