自动化测试是现代软件开发的必备环节和基本要求。本文通过手工测试和自动化测试的比较,介绍了自动化测试的基本概念和优点。
一、现在的手工测试方式
我们一般采用的的测试方式,是一种手工的方式。当你写完了一些代码,完成了一个功能,会把程序运行起来,看看程序运行的结果是否和需求一致。如果不一致,则检查代码,找出问题,进行修改。如果一致,则测试通过,功能开发完毕。这是我们常规的测试方式。
这个过程可以用下图表示。
二、手工测试的问题
如果你的程序很小、运行很快,或者代码逻辑不复杂,涉及的业务场景不多,这种手工测试的方式问题不大。但对于大型的、企业级的系统开发,或者需求变更频繁、影响面大,这种手工测试就会有很多的问题。比如以下这些:
测试非常耗时。对于大型企业级应用系统,通过启动应用、手工测试的方式,是非常耗时的。一般多场景的测试,时间以小时甚至天计。程序员的精力也将大量消耗在测试过程中,难以顾及代码优化。
在多场景下,手工测试很难覆盖全部场景。采用手工的方式录入数据、执行流程,创造各种业务测试场景,在场景很多的情况下,很容易遗漏。
对于深层的业务逻辑,手工测试很难触及。例如需要对贷款的审批规则进行测试,手工的方式需要从创建客户、开立账户,一直到申请放款,经过多个步骤才能触发底层贷款审批规则,测试效率很低。
修改了代码逻辑,对系统其他功能的影响很难覆盖测试。由于手工测试的代价高、效率低,因此一般仅测试此次修改涉及的功能,很难对系统其他功能开展全面的回归测试,这是很多新功能上线后出现问题的原因。
重复的手工测试造成大量浪费。手工测试,一般分为单元测试、第三方系统测试和业务验收测试,由开发人员、测试人员和业务人员在不同的阶段执行。虽然阶段不同,但测试案例往往会有很多的重复。当需求不大的时候这种影响不大,但如果在大型的项目建设中,这种重复会造成大量的人力、时间上的浪费。
三、自动化测试是什么样
采用自动化测试能够较好的解决上面的问题。
一个最简单的自动化测试的例子是这样的。
例如我们编写了一个Hello somebody的小程序,这个程序可以对somebody加上Hello祝福语。程序很简单。
public class HelloWorld {
static String sayHello(String words){
return "Hello " + words + " !";
}
public static void main(String[] args){
System.out.println(sayHello("bird"));
System.out.println(sayHello("sky"));
System.out.println(sayHello("every day"));
}
}
在main函数里,调用了sayHello方法,设置了几个参数,运行程序来查看程序运行的是否正确。
这是典型的手工测试方法。
而通过自动化测试就不用这么麻烦,甚至不用启动主程序。
使用Spock测试框架编写的测试脚本如下
class SayHelloSpec extends Specification{
def "对给定的名称返回问候语Hello"(){
given:"一个问候语功能"
HelloWorld helloWorld = new HelloWorld()
expect:"对给出的名称,增加问候语Hello"
helloWorld.sayHello(name) == helloName
where:"给出名称的场景有这些"
name || helloName
'bird' || 'Hello bird !'
'sky' || 'Hello sky !'
'every day' || 'Hello every day !'
}
}
运行结果如下图。
可见,当自动测试时,只要给出输入和输出,则案例自动执行,不用人工判断结果是否正确。
我们修改一个结果,在“Hello bird”中增加一个“1”,改成“Hello bird1”,主动造成测试失败,看看测试框架会如何反应。
测试框架会首先报告测试失败,然后指出应该的结果是什么,错误的点在什么地方,非常直观。
四、自动化测试的优势
上面我们对自动化测试有了个大概的了解,并且看到了自动化测试框架的使用,下面介绍下自动化测试的优点。
-
执行速度快。自动化测试的案例执行,一般都比较快,一个案例耗时在毫秒级。与人工方式的测试时间单位在小时和天级相比,优势很大。下图是刚才自动化测试的用时,时间为742ms。
覆盖面广。自动化测试案例,一般能够覆盖95%以上的代码功能,而且能够重复使用,使得回归测试变的非常容易。开发新功能,对老功能的影响,通过自动化的回归测试,能够马上检测得知。
能够不启动应用,直接测试代码逻辑。自动化测试设定输入输出,直接对具体方法进行测试,不依赖于应用启动,不依赖于操作流程,能够深入底层逻辑开展测试,极大提高测试效率。
测试层次清晰,不同测试各司其职,全面掌控代码质量。自动化测试是一个完备的金字塔结构层次,每个层次测试有不同的测试范围,避免了手工测试的案例重复问题。测试金字塔如图所示。
每个测试层次的功能和占比不同,共同保证了代码的开发质量和用户体验。
- 同步生成最新的功能文档,测试即文档。测试案例由业务语言描述,很好的解释了系统设计的最底层设计细节,它们清晰准确、格式规范、可以运行,并且能够随着需求变化不断自动更新,是一种有生命力的文档。
五、总结
自动化测试是现代企业级软件开发的必然要求,是敏捷开发、微服务架构管理、代码重构等工作的底层支撑,没有自动化测试,以上工作的效果将大打折扣,甚至无从谈起。
自动化测试能够极大的提高软件开发效率,保证开发质量,使得软件系统能够快速响应业务需求变化,满足市场变化,从而提高企业竞争力。
但天下没有免费的午餐。自动化测试对技术、管理各个方面提出了极高的要求,同时反过来将促进人员能力的迅速提高。