第一章 软件自动化测试的基础知识

时间:2022-05-29 18:01:54

 

       测试工具以及测试方法并不能代表自动化测试,大多数人提到自动化测试,都会说会使用什么工具或者什么技术,这完全是错误的,和我在刚接触的时候一样,以为掌握了Selenium/QTP就以为自己是一名自动化测试工程师了,现在想想几年前的自己,还会笑笑。在开始学习测试工具之前,必须先了解一下自动化测试相关的基础知识,对自动化测试有个一个正确的认识。

 

1.1   什么是自动化测试?

 

    首先理清自动化测试的概念,广义上来讲,自动化包括一切通过工具(程序)的方式来代替或辅助手工测试的行为都可以看做自动化,包括性能测试工具(loadrunner、jmeter)或自己所写的程序代码,用于生成多个测试数据。狭义上来讲,就是通过工具记录或编写脚本的方式模拟手工测试的过程,通过回放或运行脚本来执行测试用例,从而代替人工对系统的功能进行验证。

     总结一下自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。

  当然,我们更普遍的认识把“自动化测试”看做“ 基于产品或项目UI层的自动化测试”。这种观念是错误的,因为现在国内的自动化测试大多数停留在UI层,所以造成我们的认知误区,我在华为项目时接触自动化时的前半年,很多“前辈”把我也带进了误区,其实我本身也那时在工作时丢失了大学时的学习方式,导致很长一段时间停留在这个误区,把自己的眼光放在一个小圈子里,所以我希望后面学习的人不要进入这个误区,其实自动化测试在国外很早就提出了分层的概念。

 

1.2 测试金字塔

         传统的自动化测试更关注产品UI 层的自动化测试,而分层的自动化测试倡导产品开发的不同阶段(层次)都需要自动化测试。

 第一章 软件自动化测试的基础知识

         相信很多测试同学对上面的测试金字塔并不陌生,这个不仅对应产品开发各个同阶段所对应的测试!而且经常被各种测试书中或者测试培训中提到,但实际生产中,大多公司与开发团队其实是忽略了单元测试与集成测试阶段的自动化测试工作,并且投入的比重以及自动化实现与其完全不相符,当然这也与每个公司文化并且人员能力有关,所以,在分层的自动化测试中,我们只需要对这些定义重新理解和定义。

 

单元测试:

 

         单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

         通常单元测试由开发人员编写,测试人员很少参与进去,归根结底是因为测试人员编码能力不足。

集成、接口、API测试

 

         接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等

 

例子1:例如,我定义一个add()函数用于计算两个参数的结果并返回,那么我需要调用add()并传参,并比较返回值是否两个参数相加。

 

例子2: 接口测试也可以是url 的形式进行传递。例如,我们通过get 方式向服务器发送请求,那么我们发送的内容做为URL 的一部分传递到服务器端。但比如Web service 技术对外提供的一个公共接口,可以通过postman/soapUI 等工具对其进行测试。

UI 层的自动化测试:

 

         大部分测试现在的大部分工作都是对UI层的功能进行测试。例如,我们不断重复的对一个表单提交,结果查询等功能进行测试,我们可以通过相应的自动化测试工具来模拟这些操作,从而解放重复的劳动。UI 层的自动化测试工具非常多,比较主流的是QTP,Robot Framework、watir、Selenium 等。

 

1.3 为什么要自动化测试?

         了解自动化基本概念后,那么要思考的是什么原因让一家公司或者一个团队决定要在公司推行自动化测试?并且要采用什么自动化方法?

          说到这里,我想说很多小团队在决定引入自动化测试都是很茫然的,如朋友a说领导让做他就试试,朋友b说不知道看别人他们也试试,朋友c说可以提高年终绩效。。等等

          其实这个问题真的很重要,因为最起码我可以知道我到底需要什么解决什么问题以及什么样目标对自动化来说是合理和最好的。有时,因为测试人力不足却大量需要回归测试保证产品质量,我们需要引入自动化来进行会测试,有时因为需要对一些测试数据进行定期维护,我们需要引入自动化测试,在你想做自动化测试之前,最好想想引入自动化能帮你解决目前需要解决的问题吗?由于这个问题具有发散性,所以为了找出最佳的答案,我们可以通过下面的问题思考:

  1. 什么能够进行自动化测试?
  2. 什么应该进行自动化测试?
  3. 什么必须进行自动化测试?
  4. 什么无需进行自动化测试?
  5. 自动化测试能帮助解决这个问题吗?

 

1.3 什么样的项目适合自动化测试

         当决定引入自动化测试时,我们需要知道引入自动化测试的时机和项目的可测试性,以下是很多项目以及测试前辈总结的实践经验以及我的一些修改,因为不是什么所有项目的都适合实施自动化测试,并且能够取得成功,往往,浪费了大量的人力和时间而没有得到应有的收益。所以在你要对一个项目/或者需求实施自动化前,请认真思考下面的总结:

1、任务测试明确,不会频繁变动,

2、是否需要每日构建后的测试验证

3、是否存在比较频繁的回归测试

4、软件系统界面稳定变动少,是否有重构的计划

5、需不需要在多平台上运行的相同测试案例、组合遍历型的测试、大量的重复任务

6、软件维护周期

7、项目进度压力不太大

8、被测软件系统开发比较规范,能够保证系统的可测试性

9、对于UI项目需要进行demo评估产品的可测试性(大量的第三的插件或者难维护的UI元素)

10、对于API项目了解APi是否独立,是否太过于依赖数据等等、

 

1.4 技术提升(自动化测试方向)

 

认为比较好技术岗的学习步骤如下(当然你也可以选择偏测试顾问岗位,可能需要大量的项目经验,并且多实践/总结/产出落地,我个人比较喜欢,只是一直没机会):

à做好手工测试(了解各种测试的知识/不同测试产品的测试方法,提高测试分析能力)

à学习编程语言(了解一门主流的编程语言,并且能够在后面的工作中不断深入学习)

à学习Web基础(了解HTML,HTTP,CSS,DOM,Javascript,UI层自动化必须掌握的)

à学习自动化测试工具 (熟练掌握Selenium/Appnium/Httpclient)

à学习自动化测试框架 (熟练掌握testng/junit)

à实现自动化测试用例 (最好能够接触不同的项目,不断总结用例转换的经验以及难点分析,这将成为你设计测试框架的最用力的需求)

à开发自动化测试工具(能够根据需求编写的符合项目需求的工具)

à开发自动化测试框架(能够独立完成框架实现)

自动化测试技术方向的最高境界是:  开发测试工具,设计自动化测试框架, 让别人用(但是需要真正了解测试的需求)

 

 

         通过上面简单的学习初步对自动化测试有一定了解,你可以尝试用正确的方式把自动化引入到项目,并且树立自己学习的目标顺序。后面内容再提到自动化测试就是指分层模型的UI层自动化测试,并且测试方法针对的是Web  B/S类型的产品。