因为php的语法要求不严格,字符串也可以当数组使用,这样就存在一个问题:当使用非数字作为key访问字符串中的内容时,就可能会带来一些不一致的情况,如下面的代码
$hello = "hello";
var_dump($hello['abc']);
var_dump($hello['0']);
var_dump($hello['1abc']);
var_dump($hello['12abc']);
输出的结果就不说了,简单运行一下就可以知道,我想原因是由intval这个东东引起的,时间关系,没有去确认zend的代码,不过下面代码的运行结果页说明了一些问题
var_dump(intval('abc'));
var_dump(intval('0'));
var_dump(intval('1abc'));
var_dump(intval('12abc'));
这个东东,对code review或者测试时候是一个很有杀伤力的bug,如果一个函数设计的返回值不好,有时候返回数组,有时候返回字符串,在使用之前,就一定要先判断返回结果是否为数组,否则就会在这个bug上杯具
---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2011/03/16/php-array-with-string.html
---------------------------------------------------------------
软件测试既然是软件工程中的一部分,同样也会有遇到软件开发过程中的那些问题,总结这些问题加以分析,并解决或者缓解,会使团队的效率提高不少。
1.沟通
这里所说的问题,是指测试团队qa之间的沟通。就像《人月神话》里面谈到的问题一样,测试团队中成员之间的沟通,也是要消耗时间的,有时候还会存在信息丢失。比如工作的交接,模块A以前是甲测试的,现在要交接给乙。如果甲所做的工作没有形成足够详细的文档(通常文档都不会是足够详细的,尤其是在互联网企业),那么甲乙之间必定会消耗时间在沟通上面。不过这个东东是可以通过规范化文档来缓解的:比如测试用例的描述,可以用一些规范的格式;测试脚本的部署执行,可以使用一个测试框架来解决。
2.自动化
这个应该是个永恒不变的话题了,效率永远没有最好。对于测试工程师来说,使用自动化回归测试用例,能够在很大程度上提高效率。有的时候自动化也是没有好处的,比如一个系统,半年都不升级一次,要自动化回归,反而会更加消耗时间与经历。对于经常升级改动的系统,自动化的好处就不用说了,但是自动化的测试用例也是需要维护的,不维护的用例失效后反而浪费了创建用例的时间。
3.测试部署
现代软件系统通常都是很多子模块之间相互依赖的,而经常都是升级的这个模块,还会依赖于系统中另外的很多模块,这个问题在rd开发时候,遇到的问题可能更严重,经常遇到的情况就是环境中都是坏数据,连调困难。qa遇到的问题要比rd的简单很多,毕竟提测的东西都是rd调试过的,所以集成环境的问题是一个简单的问题,只要控制环境中的版本部署以及数据修改即可。但因为很多原因(比case的前置条件,避免损坏集成环境的数据等)会导致需要把模块不放在环境中测试,提供一些自动化部署的东东也能够节省很多时间。这个在有些大公司,是直接有软件支持测试的,也可以自己开发一个测试框架来解决问题
opentest在一定程度上解决或者缓解了上面三个问题,但是与此同时,也带来了一些问题,有些case的检查点越来越多,比如核心系统的,要检查1000项数据,这样的case,很明显,对于测试工程师的工作量需求是巨大的,不过幸好case的描述是标准化的,可以借助工具生成case,进一步提高效率。
---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2010/10/22/opentest-imporve.html
---------------------------------------------------------------
在软件测试之前,要先清楚的了解被测对象才行,通常情况下,我们都是用下面这样的环节进行:
1.了解系统架构。这个应该是前提条件,一个新同学入职到项目组后,肯定是要先了解现有系统才行,不了解现有系统,很难清楚团队中的设计风格与习惯。了解了系统架构,才能知道自己要测试的模块处在什么位置,为系统提供什么样的功能,系统对它有什么要求。清楚了这些,才能知道自己要做事情的针对性。
2.明确需求。需求一般是由pm提出的,一般会组织需求评审,在评审过程中,明确pm的当前需求,对未来可能的需求进行估计。明确需求后,就能知道现有系统需要做哪些改动,对大致的工作量与项目的时间有一个估计。有时候,需要改变或者拒绝需求,比如对于一个支付系统来说,如果pm提出的需求对账户安全有影响,就应该坚持原则,对此提出质疑,要求改变需求。
3.参与系统设计流程。这个时候一般是开发(rd)同学自己先设计一套或者多套方案,随后进行设计评审。评审过程中,qa同学也是要多多参与的,在把握需求的基础上,对设计提出一些建议与意见,与此同时,对测试方面的工作量也能进一步细化。有时候,采用好的建议可以同时节省开发与测试双发的工作。在此过程中,qa同学应该自己从rd的角度思考,不要被动接受rd的设计,可以想象成,如果需求摆在自己面前,自己会怎么做,这样才能充分理解设计,为自己的测试工作打下良好的铺垫。同时多了解系统内部,也有利于自身的职业发展。
4.case设计步骤。根据rd的设计文档,设计测试用例。在这个环节中,沟通与文档是两个重要内容,遇到不清楚的细节,一定要与rd沟通,不要自己猜,否则会造成杯具。如果rd没有文档,可以自己记录个邮件,避免忘记和rd反悔的现象。
5.提测。除了上面几步确认的内容,还要再确认一下rd有没有“顺手”做了其它地方的改动。如果有的话,一定要在送测流程单里面写清楚,同时qa也要与rd沟通清楚,避免出现漏测的情况。
---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2010/09/29/software-testing-learn-about-the-measured-object.html
---------------------------------------------------------------
opentest推出后,成为了大家测试server的主要测试框架,除了百付宝的那些老的没有升级的server,几乎所有server,部分脚本都已经是通过opentest来测试了,我们的case文件打成tar.gz的压缩包,现在也有200多兆了。opentest解决了case维护,部署,人员变更等问题,但没有考虑过提高测试用例编写效率的问题。随着核心系统越来越复杂,一次命令交互即一个case需要检查的内容可能有上千项,这对于编写case的qa同学来说,逐一编写case检查点,确实已经成为了负担。
没错,自动化测试是有代价的,多数情况下也会导致首次测试时消耗的时间变长,但提高case书写的效率还是很有必要的。opentest在这件事情上面,可以分为三步走:
1.校验数据的生成。在执行case的时候,帮助qa生成需要校验的数据,这样qa同学只需要将它cp到case文件中就可以了。但这样做是有一定风险的,生成的数据是根据核心系统结果来做的,如果过于自动化,出来的数据又错误,又不注意看,就会造成漏测,所以需要在里面内置一些校验规则,对于不满足规则的数据报错,避免出现漏测的情况
2.自动机生成case。对于“创建-支付-确认”这样一个简单的例子来说,支付的前提数据条件就是创建的结果,qa同学只需要画出自动机,由工具生成case文件,将case文件放在opentest中跑一下即可达到测试目的了。而opentest的case文件因为是格式化的,天然的支持这样case生成工具的编写。
3.结合fuzz测试。fuzz测试可以是框架的进一步发展,第二步能够保证关键的正常流程是ok的,使用fuzz测试,不用qa同学思考各种测试用例的情况,直接向被测模块发送各种可能的数据情况。其实fuzz测试是一个很有效的东东,可以测试出很多非常难以发现的问题。
这三步做完后,我想opentest也可以成为一个比较完善的测试框架了,能够在很大程度上提高测试效率。
---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2010/09/06/opentest-the-road.html
---------------------------------------------------------------
记得以前面试过一个女孩,她认为软件测试就是点击网页,囧,作为一名软件测试工程师,我当时真是无地自容啊。相信很多人都把这个职业想象的非常简单,作为软件测试工程师的我,是有必要普及一下软件测试的童鞋都需要在哪些方面提高自己的。
1.分析能力。软件测试的核心其实应该就是设计测试用例了(具体啥样的用例设计,请参见《什么样的测试用例是好的》),而设计测试用例,就是依赖与分析能力了。这里我们不说那些常用的设计方法,从一个稍高的层面上来讲,可以说就是怎么将一个复杂的系统进行抽象,分析拆成几个不同的维度,结合维度可能出现的情况进行有选择的组合,以最小成本获取最大的收益。无法将一个复杂系统拆解成简单的维度,是没法做好用例设计的
2.编程语言。语言其实就像说话一样,只不过我们常说的英语日语之类是与人沟通,计算机语言就是与计算机进行沟通的。对于测试工程师来说,精通一门语言,熟悉其它几门语言是有必要的。对于不同语言编写的被测程序,是有不同特点的,如果对实现的语言不了解,无法进行白盒测试,没法看代码diff(结合代码diff做测试)来提高效率。对于特点不了解,可能也会导致自己漏掉部分内容。
3.设计能力。不要认为设计能力就是开发工程师的事情,拥有好的设计能力,就可以在设计评审的时候多提意见,促进开发工程师使用好的设计,不仅对开发有好处,对测试也是很有好处的。这样才能防患于未然,不仅自己的劳动力,也节省团队的劳动力。
4.对业务的理解。对业务的理解越充分,就越能够理解最终用户的需求,促进产品设计使用好的方式,促进产品成功。难道你想做一大堆不成功的项目么,那样是多么没有成就感的一件事啊。
5.自动化相关的考虑。随着项目越来越多,系统的测试项目也会积累的越来越多,每次有新功能了,难道要用手工来回归一下原有的case么。自动化测试是提高回归测试效率的唯一解决方案(如果你说还有解决方案就是不回归,我…),以高效率促进高质量,才是一个良性循环的发展方式啊。
嗯,以高效率促进高质量,我觉得很有很有道理。
---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2010/08/30/professional-quality-software-test-engineer.html
---------------------------------------------------------------
代码diff与测试相结合,可以对测试起到较明显的促进作用,通常都是用在模块的功能升级使用。结合代码diff做测试,好处主要有下面几点:
1.提高旧有case回归的效率。从代码diff里面,可以看到旧有功能哪些地方没有任何改动,这样就可以增加信心,节省对旧有功能回归测试的工作量。当然,如果升级导致旧有功能的前置条件产生变化,还是需要注意的
2.明确case的重点。知道变动的内容,就可以根据修改的代码设置case,有针对性的测试。
3.辅助定位发现的问题。
4.直接发现bug或者代码设计上的问题。
5.测试人员的经验积累。经常看别人的代码diff,积累经验,就能加深自己对项目的理解,判断大致什么地方容易出现问题,提高职业素养。
diff少的时候,就可以直接发现问题了,这个非常有用,可以极大的提高效率。如果对被测对象的了解比较深入,通过查看diff即可知道新功能修改的是否到位,也可看出新增加的地方是否处理很山寨,不具备通用性等。另外比如实现细节上,看看申请的内存是否会溢出等也可以在这里处理。
有的时候,代码diff很多,看diff可以只关心重点内容:
1.if语句。新增或者修改的if标志着新旧功能点所走的不同逻辑分支。通过查看修改点的判断参数来设计case覆盖不同的分支。另外也要关注是否条件出现问题,程序走到错误分支的情况。
2.新增的函数。这种情况下,新增的函数通常都是为了满足新功能增加的部分逻辑,这时就设计case重点照顾一下新增的函数。
3.循环。比如修改了循环的条件,里面增加了break等也是属于流程分支改变的情况。
结合代码diff的作用很明显,但貌似总结这个的文章也很少,而实际用到的也是比较细小,零碎的东东,在这里先暂时列出一些,开启话题,逐渐补充吧。
---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2010/08/26/combination-of-code-to-do-tests-diff.html
---------------------------------------------------------------