再谈UI自动化测试
最近还是发现有一些文章,个人对于自动化测试报有很大的怀疑态度,本人也对相关的文章给与了驳斥。我个人和公司对自动化测试都是报有很积极的态度的。这里我想再次的写一篇文章来阐述到底UI自动化测试可以做什么,作为一个优秀的UI自动化测试工程师应该具备有什么方面的技能,以及本人对UI自动化的一些经验和体会。
首先还是要强调一点,API和command line程序都是非常适合用自动化来进行测试的。我想这个观点,即使那些反对自动化测试的人也不应该否认吧?至少我觉得他们应该有这个意识。因此,对于他们反对自动化就集中在了UI自动化方面,我这里也完全站在UI自动化测试的角度来写这篇文章,后边就不再强调了。
再次套用朋友的一句话,"自动化测试听起来很神秘,学起来很简单,用起来很麻烦"。我想有过自动化测试经验的人,可能大多都有这个体会吧?前边的过程我就不提了,以后主要探讨为什么用起来会麻烦和怎样简单化自动化测试。总而言之,想搞好自动化测试,还是需要测试人员比较高的技术水平,尤其是编程能力和解决问题,分析问题的能力。
首先,我要谈谈自动化测试工具和编程语言的关系。作为一个优秀的自动化测试人员,他的最基本的能力就是编程水平了。所谓编程就是至少要精通一门高级语言,比如Java,C#等等,脚本语言不计算在内。请记住,不是熟悉,是精通。高级编程语言给我们提供很强的能力来实现一些东西。你所精通的语言能力越强,你在自动化测试可以做的事情就越多,越好。简单来讲,论程序的能力来排序是这样的,测试工具-〉脚本语言-〉高级语言(Java,C#)-〉 C/C++-〉C++/CLI。根据这个语言能力的排序,结合你自己的语言能力,你可以想想你到底具备多少自动化测试能力。我所强调的是,如果你想优秀,你至少要精通一门高级语言,这是必不可少的。如果很多人还只是用测试工具,脚本语言工作而抱怨自动化,我要强烈的建议他们好好去学习一下编程能力先了。他们的问题在于,由于编程能力的不足,使得自动化测试的很多问题没有能力和办法去解决。再谈一下自动化测试工具,无论哪种测试工具,无论他们设计的多么强大,从编程语言来讲,他们最多能够达到脚本语言的能力。也就是说,如果你完全用测试工具来进行自动化的开发,很多问题你还是无法解决的。因此,我推荐的自动化开发方法是高级语言结合测试工具。我的自动化测试逻辑是,用测试工具只是完成UI操作,其他部分完全用高级语言来实现。我们不能否认高级语言所具有的能力,他们创造出了世界上这么多丰富多彩,这么多优秀的软件,难道开发测试程序会有问题吗?因此,我们的焦点就落在了测试工具的UI操作部分。
第二,关于测试工具。开发语言重要,选择一个合适的测试工具也同样的重要。一个灵活,强大的测试工具可以使你的自动化开发起到事半功倍的作用。结合不同的项目,不同的语言,你可能会有不同的选择。不过,这里我想解释的是,具有了高级语言的开发能力之后,我们期望测试工具来为我们做什么。我前边也说过了,我们所要求自动化测试工具所做的就是UI的操作。这里边比较重要的是三个方面,一是找到UI对象,二是操作UI对象,三是同步。如果一个工具能够让你找到所有的UI对象,并且能成功操作这些对象,就完全满足我们的自动化开发需要了。如果,工具能够提供同步的功能,就使你能够如虎添翼,不然的话要自己去实现,会麻烦不少。到了这里,你已经具有了所有UI的操作能力(测试工具提供),并且具有了高级语言的实现能力(高级语言提供),你才有了基本的能力去做一个优秀的自动化开发。没有这些能力的人,我严重怀疑能否做出好的自动化测试。
第三,怎样自动化。我的自动化的原则是,尽量少的进行UI的操作,除非是你本身要测试的UI。道理很简单,UI操作由于可能受各种问题的干扰,很容易失败。通过非UI的方法去实现是更加可靠和快速的。这也是我为什么要强调对于高级语言的精通,具有高级语言的开发能力,你就能过把大量的任务从UI操作转向了程序操作,使得你的自动化程序的可靠性大大的增强。这里还需要强调的一点能力就是系统应用的能力,比如Windows使用的能力。Windows的很多的操作是有相关的命令来实现的,不一定非得通过大家熟悉的UI。记住这个原则:除非是你要测试的UI,否则尽可能的通过高级语言来实现。我想大家对于高级语言来实现的工作应该还是有信心吧?因此,下边我要谈的内容就完全的与你要测试的界面相关了。
第四,怎样进行UI测试。首先要尽量的减少UI操作,除非是你必须要测试的操作。比如简洁快速的启动你要测试的界面,用快捷键代替鼠标操作等等。总而言之,理想状态下我们进行的每一次UI操作,都是我们需要测试的,其他操作尽量避免,不能避免用最可靠的方式去实现。那么我们现在的焦点就变成了,怎样来处理我们真正要测试的UI了。UI测试的开发基本上就三个问题:发现对象,操作对象和同步。简单解释一下同步,同步就是有一个机制告诉你何时可以执行一个 UI操作。很多人是用sleep的方式,等待一定的时间去执行下一个操作,这是我非常反对的。我的原则是,尽量少用sleep,就算要用每次最多不要超过一秒。滥用sleep会严重影响测试程序的性能(具体的UI自动化过程,大家可以参考我的其他文章)。
第五,UI测试错误/异常的解决和Debug。通过以上的解释,我们只是在自己需要测试的UI操作才进行UI操作,否则通过高级语言或者系统命令来实现。是不是我们的UI自动化就完美了呢?绝对不是,这只是一个基础,还远远没有达到完美。我们在自动化开发和应用的过程中,大部分的时间其实是花费在了异常/错误处理和Debug上面。这跟真正的程序开发非常的类似,你如果去看代码的话,大量的是在进行返回值得检验和异常的处理。如果我们的程序在运行过程中出了问题怎么办,或者如果没有出现我们期望的结果怎么办?一般来说有三种问题,第一是产品的问题,我们可以报bug了,第二是你测试程序的bug,你需要fix。第三是其他的问题,比如测试工具,甚至高级语言本身的问题,你需要workaround。总而言之,优秀的测试程序最终的目的是,一旦程序的运行发现了问题,就是产品的问题,就是可以报bug的。能够达到这种境界才能算自动化测试的完美,才能算是一个真正优秀的测试人员。(当然了,正如软件产品不可能没有bug,你的测试程序也不可能完全没有bug。但是,由于软件产品是有大量的用户来使用,而你的测试程序只是很小范围内来使用,使得你消除影响测试过程的bug成为完全可能)
综上所述,一个优秀的自动化测试工程师必须要具备高级语言的开发能力,自动化工具的灵活应用能力,系统命令和使用的熟练能力等这些基本功,还更要具备优秀的Debug,Fixbug的能力,和保持程序稳定性能力。换句话讲,一个优秀的自动化测试工程师必定也是一个优秀的软件开发工程师。
最后谈一下我为什么要转向C++/CLI?从上边的排序大家可以看到,C++/CLI是目前Windows平台最强大的编程语言。在我的自动化开发的过程中,我需要高级语言和系统命令都不能完成的功能。如果没有C++/CLI我就必须要通过UI来实现,从而降低我程序的可靠性。而有了C++/CLI的功能,我就可以绕过UI操作了。
总之,能绕过UI操作的能力也体现出一个自动化测试人员的能力。从这个角度讲,测试人员有很多东西要学的。最后说一下,我自动化工作的要求是100%可靠,我还不能完全满足,因为使用我程序的人是那些手工测试的人,他们的使用环境的变化有可能引起一些问题的产生,基本还不是我程序的问题,而是测试工具,或者其他模块的问题,需要想办法workaround。
不过,随着一定时间问题的积累和解决,如果环境不变,应该可以达到100%可靠。(可是环境的变化是不会停止的,因此实际上很难达到永久的可靠,不过一段时间的可靠还是应该可以达到的,或者说我们的测试开发必须有这样一个目标,就如同软件开发的目标一样)