作者TonyQ (自立而後立人。)
看板Soft_Job
标题[闲聊] 笑谈软体测试的几个阶段(二)
时间Sat Mar 24 23:12:46 2012
前情提要,这是写给软体开发者的测试历程,
在笑谈软体测试的几个阶段(一)中我们提到测试的基本形式,
主要是以我自己进入测试的经验说明如何进入测试门槛,
以及我身为软体开发者进行软体测试时需要知道的事情跟可能的心路历程。
所有的内容都只是个人经验仅供参考,欢迎提供意见分享跟挑战。
-----------------------------------
另外这里所指的软体测试都只是主要针对者自己对软体的测试,
而与专案测试(目的为增加专案品质)的目的并不直接相关。
也就是说,这里讲的主要目的,是开发者如何可以在开发过程,
快速验证自己的修改是否有误跟常见的一些问题。
-----------------------------------
本文开始
-----------------------------------
就像先前的停车场计费程式,我们慢慢写了很多程式,
慢慢的会发现修改程式码是我们常做的,不论是修 bug 也好、做新功能也好,
我们每次修改完之後都需要进行测试程序。
-----------------------------------
假设现在我们在做一个部落格系统好了,
我今天已经写好後台可以发文,
发文时我需要提供编辑器给使用者输入,
还要让使用者可以做一些删除或修改的操作。
-----------------------------------
我们一开始开始会一直用测试的『完整环境』做测试,
(重点一)
测试程式码的运作,然後我开始发现,测试有点麻烦。
某些重复的程式片段我会发现我测试很多次,
有时是它很重要跟复杂,像发文的编辑器特别容易出问题或修改;
有时则是它很重要大家都要用,像是很多功能相依於会员登入。
这些片段改程式码特别容易测到,
就每次都在测一样的程式,感觉就很琐碎而无聊,
特别是登入,我可能根本就没有改那段code,为什麽我要测他?
-----------------------------------
然後很重要的是,我也不总记得上次的测资,应该说,我很有可能会忘记。
(重点二)
---------我的现况是这样,看起来是个困境,那我怎麽办??---------
你可能还是会期待我会说拆 method 跟 unit test ,
然後补一句视状况采用跟引入这种我自己也觉得有讲等於没讲的废话。
好像这样事情就结束了,这些话我很常说,它是政治正确的,
但问题是,听的人在这些话的讯息中收到什麽。
平常讲话是真的没办法,因为三言两句我也讲不出个屁,
要讲经验我後面有一票的前提论述要讲,
还要先看看对方用的语言我有没有经验,像讲 C++ 的测试我就囧很大。
要讲故事没个五六小时是讲不完的,不过写文章就不一样了。
我写文章很重视实战,就是因为这种东西只有实战体验过,
你才会有点体悟那些心法在干嘛。
特别是这种心法是可以各自表述。
举个例子,今天有人说『你写的 java 程式不 OOP』,
你真的能从『不 OOP』这四个字知道他想表达什麽,要怎麽修正吗?
你可能会因为这样赌气跑去读 OOP 的书,
然後试着把学到的东西用到你专案,多用了几个模式跟切分类别,
然後很开心的说我程式更 OO 了。(事实上是不是就另外一回事。)
结果你可能一辈子不会知道,
人家只是在嫌弃你写类别时没有写 Getter/Setter 。
(注:这曾经是 OOP 议题中很重要(无聊)的争论之一)
http://0rz.tw/3T9d0
拿心法等级的名词互相 PK ,
大概也是赶云端流行的一种做法,我是觉得作事不用这麽复杂啦,
有时你必须承认我们真的很难明白别人的明白。
因为他们的经验跟心法,不是你的经验,而且测试是一体成形的。(後述)
-----------------------------------
-----------------------------------
扯远了,拉回主题。
-----------------------------------
-----------------------------------
我们刚刚有个困境,那我们现在要来试着改善他了。
注:改善的过程不见得每个方法都是好的,
但我的信念是有尝试就是好事,有尝试就会有收获跟所得。
-----------------------------------
我是懒惰的人,我痛恨无聊、重复而且不必要的事情。
我宁愿花五倍的时间写个有趣的 template ,
我就是不想乖乖好好一行一行 cp 当 code gen。
我写程式的心法就是上面这句话。
(觉得这样是好是坏是个人自由啦,
有时候它真的可以省事,有时候它又会误事。XD)
-----------------------------------
首先我是想办法设计成,我自己测试时可以跳过登入页面,
我尝试设定,「测试环境」启动时在session 先塞测试帐号假装登入,
以 java 来讲就是写 filter ,
以 php 来讲就是先 include 一只php。
(从这里我们可以看出语言支持度跟特性会影响开发习惯很多。)
这样的确很有效,我瞬间省了好多测试时间,
但问题来了,如果我上线时忘记把测试程式拿掉就完蛋了。
所以我要想办法建出 debug 环境,
正式一点的会有设定档,或是利用版本控制系统设 ignore 。
不正式一点的就是放档案弄脏 workspace 自己小心不要弄错。
但是即使是最蠢的方案都可以帮我每天开发,
省下几分钟到一两小时的测试过程登入的时间。
Ok , it works.
但是这样也有别的缺点,
1.它跟真实的环境有出入
2.要是登入真的坏掉了你也不会发现
3.你要小心不要弄错环境XD
4.如果登入的程式码有变的话,你可能也要跟着修改。
-----------------------------------
测试资料的管理的部份,我会在程式码中留下测试资料的注解,
特别是 regular expression ,
没留下测资我大概过个两天大概就不知道我自己在写杀小。
还有就是善用 issue tracker 跟版本控制系统留下纪录。
所以当这些纪录薄弱时,
我们也会特别倚赖团队中资深成员进行「观落阴」,
从无边地狱中用力回想当初的测试情境。
最後真的不行就是走逆向工程,他会用到什麽,
你就想办法整他恶搞他自己想办法丢东西测。
-----------------------------------
我们第二篇的案例先讲到这,
至於那些异动频繁的程式区块,我们留到第三篇谈。
-----------------------------------
-----------------------------------
ok,
第一篇我们讲的是一个简单的范例,
第二篇我们讲的是复杂的范例,
从第二篇我们谈到的事情里面,有哪些测试的要素?
1.测资的问题
我们第一篇强调过,测资是一切的根本,
而这篇我们开始提到,测资是需要被管理的,
测资的有效/可靠程度就跟你程式的稳定程度跟开发效率成正比。
2.测试路径问题
每个测试的过程中你需要作的操作,我称之为测试路径。
测试路径决定你的测试效率。
最佳化你的测试路径是开发过程中很重要的事情。
(像是想办法把登入这个过程跳过)
这其实不只是程式码的问题,比方说你 server 启动要十分钟,
那你就应该挑一个 server 启动快一点跟方便一点的设计。
3.文章中有特别对「完整环境」这件事情下重点
在测试的范畴里面,我们把最接近使用者的环境测试,
也就是 dev server 或 dev environment ,
称之为
整合测试。 (Integration test)
这种状况下,你有可能被其他的因素干扰,
举例, db 如果挂了你登入可能就就整个没办法测试。
整合测试的重点在於他是尽量要达到测试最接近真实的情境。
当然这里我们还没有要对 unit test 跟 integration test 多着墨,
但是我想说的是,通常我们一开始进行的测试都是整合测试为主。
为什麽会这样,我们之後的章节会继续探讨。
-----------------------------------
下一篇,我们将延伸这篇的主旨,
继续探讨其他案例下,测试路径跟测资的问题。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.81.205.78
※ 编辑: TonyQ 来自: 111.81.205.78 (03/24 23:16)
※ 编辑: TonyQ 来自: 111.81.205.78 (03/24 23:16)
※ 编辑: TonyQ 来自: 111.81.205.78 (03/24 23:17)
※ 编辑: TonyQ 来自: 111.81.205.78 (03/24 23:21)
1F:推 thinkniht:我觉得软体开发是有很多方法可以使用的... 03/24 23:43
2F:→ thinkniht:但我非常不认同为了使用这些方法而使用这些方法 03/24 23:44
3F:推 codemonkey:测试的前提是测试案例与接受标准到结案仍有效力 03/24 23:53
4F:→ codemonkey:...我在说什麽啊,抱歉没想清楚就推文了 03/24 23:54
5F:→ TonyQ:没关系啊 我写文章很随性的 XD 03/25 00:14
※ 编辑: TonyQ 来自: 111.81.205.78 (03/25 01:06)
※ 编辑: TonyQ 来自: 111.81.205.78 (03/25 01:08)
6F:推 vvppqqvv:一+二都是经验的累积(起码我觉得辣.......) 03/25 01:25
7F:推 vvppqqvv:也许在软体业单纯是一种幸福 03/25 01:28
8F:推 clairehuei:看到"观落阴"三个字 狂笑不已 整个说进我心坎了 哈 03/25 21:44
9F:→ petershih67:能维护Linux GPL open source code的工程师,几乎每个 03/25 22:29
10F:→ petershih67:都有观落阴的本领。 相信我,只要用正常的语法逻辑写 03/25 22:30
11F:→ petershih67:CODE,是不太需要注解别人也可以维护的。 03/25 22:30
12F:→ petershih67:我英文很烂,你看不懂中文. 但我们却可以用程式沟通?! 03/25 22:32
13F:→ TonyQ:看什麽程式码,你有兴趣的话我丢段 regex麻烦你猜猜我想表达 03/25 22:36
14F:→ TonyQ:什麽。 03/25 22:36
15F:→ TonyQ:有测试的「测资」方便测试跟「读懂」是两回事。 03/25 22:37
16F:→ TonyQ:读懂可能很简单,但是知道哪些环境下会有问题,为什麽会有 03/25 22:37
17F:→ TonyQ:这些测资,是很重要的。 03/25 22:37
18F:→ petershih67:regex的确是需要一点说明。 03/25 22:37
19F:→ TonyQ:我自己的经验啦,有几个点需要作注解 03/25 22:40
20F:→ TonyQ:regex 是一种,再来就是 performance tunning 相关的, 03/25 22:40
21F:→ TonyQ:比方说打 cache 或者是哪边有偷吃步之类的。 03/25 22:40
22F:→ TonyQ:不过测试跟读懂程式码不见得是同样的事情就是了,之所以程式 03/25 22:41
23F:→ TonyQ:码中,其实不真的常会看到测资,很简单就是因为有更好的方式 03/25 22:41
24F:→ petershih67:还有就是系统或是某些关键的地方用了很怪的方法避开. 03/25 22:41
25F:→ TonyQ:把测资记录下来。(之後会慢慢谈到。) 03/25 22:41
26F:→ petershih67:T大很专业。不过大专案通常有专业的QA。 小专案就等 03/25 22:42
27F:→ petershih67:客户抱怨再改了。 大多CODING的很讨厌做 QC。 03/25 22:43
28F:→ andymai:所谓的观落阴其实就是思路相近或有办法融入原着的思路,如 03/25 22:43
29F:→ andymai:果没办法抓到原着思考的方向~那看起来是很浪费时间的... 03/25 22:44
30F:→ TonyQ:不,观落阴通常就是叫他想当时谁干得,想办法找源头说明... 03/25 22:48
31F:→ TonyQ:你说的那个是被我归类在逆向工程区(戏称)的.. 03/25 22:48
32F:→ andymai:@@没有svn或注解能找到源头吗?能找到源头当然是最好罗~可 03/25 22:49
33F:→ TonyQ:逆向工程十次有九次时间都是浪费掉的,如果没留注解的话, 03/25 22:49
34F:→ TonyQ:多年以後还能再来一次.. 03/25 22:49
35F:→ TonyQ:找不到源头的话就只好作逆向工程了... 03/25 22:49
36F:→ andymai:是太多时候是找不到的~尤其是写的人已离职... 03/25 22:50
37F:→ TonyQ:当然,所以现实生活是作逆向工程的多,都在浪费时间。 03/25 22:50
38F:→ TonyQ:所以才要宣导尽量保留测资,测资有时比程式还有价值。 03/25 22:50
※ 编辑: TonyQ 来自: 223.143.225.151 (03/25 22:51)
39F:→ petershih67:一般讲的逆向工程是反编译那种,T大是不是有点讲错了 03/25 22:51
40F:→ andymai:我倒是有碰过注解是错的,或写的人懂,其它人看不懂的XD 03/25 22:51
41F:→ TonyQ:@petershih67 只是戏称啦 :D 03/25 22:51
42F:→ petershih67:我以前也很爱写注解,现在都不写了,一方面是注解写 03/25 22:52
43F:→ TonyQ:@andymai 那也就没办法啦XD 03/25 22:52
44F:→ petershih67:一堆,还不如直接看CODE (难如REGEX也是看Code较快) 03/25 22:53
45F:→ TonyQ:这些事情要看开发习惯跟团队共识啦,不是所有专案都能放在 03/25 22:54
46F:→ TonyQ:同一个天平上看的。 03/25 22:54
47F:→ petershih67:二方面,坦白讲写再多後面接手的人也不见得看的懂. 03/25 22:54
48F:→ petershih67:不过,若专案经理比较严格规定这些细节,其实是好事. 03/25 22:55
49F:→ TonyQ:我只关心一件事情,这专案我一年以後再回来看,要多少时间能 03/25 22:55
50F:→ TonyQ:进入状况,如果写注解可以帮助这件事情,我就写。 03/25 22:56
51F:→ TonyQ:写注解有时候只是个 index ,方便你从片段想起全貌, 03/25 22:58
52F:→ TonyQ:但是有时我们也会下错 index,也会忘记 update index, 03/25 22:58
53F:→ TonyQ:不重要或者容易记得的东西也不需要 index 03/25 22:58
54F:→ TonyQ:所以我都是以我有多少机会记得这东西会这样设计进行注解。 03/25 22:59
55F:→ TonyQ:不过话说回来,测试跟开发的注解应该要分开说就是了... 03/25 22:59
56F:→ TonyQ:以测资的话,我还是觉得多多益善。 03/25 22:59
57F:→ petershih67:测试的领域真的很专业,可惜真的很容易被忽略。 03/25 23:03
58F:→ petershih67:我自己也完全没受过训练,还插嘴这麽多.请T大海涵啊 03/25 23:05
59F:→ TonyQ:不会啊 只是讨论 XD 03/25 23:08
60F:→ TonyQ:我也没受过训练 只是有在作 所以欢迎一起讨论罗 03/25 23:09
61F:→ petershih67:小声的说,我只概略的品管我的CODE之後,就交给测试 03/25 23:12
62F:→ petershih67:的人去测。出包再修。测试计划那种,真的是能闪就闪 03/25 23:13
63F:推 thinkniht:我想很多人对很多事情应该都是没有受过训练... 03/26 00:12
64F:→ thinkniht:靠自己摸索或看书之类的方式来学习的吧... 03/26 00:12
65F:→ thinkniht:@petershih67:我觉得你那样很正常 毕竟对PM或主管而言 03/26 00:13
66F:→ thinkniht:你的开发时间是越快越好,赶上时程进度最重要... 03/26 00:15
67F:→ thinkniht:被发现问题要修改是之後的事情 03/26 00:16
68F:→ thinkniht:我认为单元测是很重要 但是有的人会觉得只是浪费时间 03/26 00:17