zoukankan      html  css  js  c++  java
  • 关于自动化测试的理解

    之前的一篇 测试感想 里面提到以后会另文专门谈谈自动化测试,恰好最近看到园里一位朋友一个系列的 文章 ,可以看出作者对测试有着相当深的理解,文中的许多观点与我也不谋而合,所以今天也想谈谈自己的看法。这篇文章先谈一下看法和理论,暂时不提具体的工具和实操。

    首先我将测试分为两种,一种是验证正确(即程序做了正确的事),一种是寻找错误(即程序没有做错误的事)。其中验证正确比较简单,只需要将实际结果和预期结果做比较,一般只有一件正确的事会发生就只需要验证这件事发生了即可。例如用户登入后加积分,只需要检查用户登入后,是否增加了相应的积分。而寻找错误就比较困难了,因为有太多不可预知的错误可能会发生,例如修改了个人资料也加了分,登出也加了分等等。

    如果想用自动化测试去发现错误,首先就必须由人去相处可能出现错误的各种情况,然后用自动化去检查。这样其实就不是用自动化去发现错误了,而是由人去寻找错误(或者错误的可能性),然后用自动化去验证。偏偏试图通过自动化去发现错误是很多人开展自动化的最初目的,于是就导致了自动化的高代价,投入了人工(预测错误,设计用例,编写脚本),但自动化的成果只能局限在人工能够预测到的范围之内。所以我们可以看到很多案例,在使用了自动化测试之后,用手工测试依然可以发现大量的bug。所以,能否发现bug,最核心的东西是用例,而不是工具或方法,只有用例能够发现bug,工具只是实现的手段而已。因此,想要测试得更好,应该加强的是设计用例的能力。

    说了这么多,好像把自动化测试讲得没什么作用,其实并不是,只要用来做其擅长的事情,自动化就会很有作用。自动化做为测试的一种手段,优点在于可以大量、重复地执行,如果用来做回归测试(即用来验证程序做了正确的事)的话,就可以派上大用场。例如在版本迭代后,检查没有改动过的部分是否正确;服务器配置改变而程序没有变,检查程序是否可以继续正常运作。可以想象一下以下情况

    • 服务器打了补丁重启一下,各种服务都需要重新启动
    • 手机操作系统升级了
    • 软件功能没有变化,但程序员做了大规模重构

    这些情况下,为了检查我们的程序是否能够继续正常使用,我们就需要把所有/或者最重要的流程跑一遍,如果要负责测试的软件所用的平台经常升级,又或者一个平台升级需要测试大量的软件, 这是非常耗费时间和人力的一项工作,最严重的情况是需要安排一个专人一年到晚不停地就是为了测试这些。这时,自动化测试就可以大显身手了,因为我们不会期望在这种情况下,自动化测试能够找出新bug,而只需要它告诉我们,哪些以前能正常运作的部分现在出错了。

    接下来就要谈谈如何实现自动化测试了,我先将程序分为两种,一种是与机器做交互的,一种是与人做交互的。然后再将与人做交互的程序分为非图形界面和图形界面两种,其中非图形界面其实也可以看做是人用机器的角度去做交互。自动化测试使用程序去测试程序,机器之间的交互或者非图形界面的人机交互比较容易做自动化,而图形界面的人机交互则相对比较难。所以很多人推荐接口测试是比较适合做自动化的,比如说你的服务器升级了,或者你的数据库版本升级了,你需要检查一下你的手机app是否还能正常获取后台数据,这时你就可以用自动化去测试你的数据接口了。

    无论是手工测试还是自动化测试,都是比较实际结果和预期结果是否相符。

    • 实际结果:就是我们通过操作获取的实际执行结果,通常所讲的自动化测试的难度,大部分指就是指通过自动化获取实际结果的难度。
    • 预期结果:是我们在需求上人为定义的,很多测试员在测试时遇到需求不明确,没有标准,其实就是不知道预期结果是什么。将预期结果转化为机器可识别的数据也是一个难点。
    • 结果比较:验证测试结果是正确还是错误,良好的自动化测试除了需要自动化的执行,还需要包括自动化的验证,有时候自动化的验证比自动化操作更困难。

    要实现自动化测试,就要将这三样东西通过程序来实现,并且高效地结合起来。何谓高效地结合起来?就是预期结果和实际结果可以大量快速获取进行比较,并且尽量少地出现人为干涉。比如我们控制一个程序能够读取到全部预期结果,并且执行操作获取全部实际结果,然后可以自动比较两者生成报告,这样就比我们人手控制一个程序单个多次地读取预期结果,再人手控制另一个程序单个多次地获取实际结果,再人手控制第三个程序去单个多次地比较前两者的结果要高效。当然,如果这些程序是统一控制,相互自动触发的话,那效果也等同于一个程序,在实际中这种情况是很常见的。

    如果是非图形界面交互的话,我们比较容易就能够讲这三者结合起来,以接口测试为例:

    1.批量的发送请求并获取返回值,这个用程序可以容易实现,也可以用一些负载生成的工具去实现。

    2.批量得到预期结果并转为机器可识别的数据,这个可以用xml或者excel一类的文档来准备数据,使用工具的话可以将多个case保存为一个集合。

    3.批量比较返回值和预期结果数据,将前两步的数据都获取到之后再用字符或者正则表达式来比较两者,用工具的话需要选择那些可以断言返回值的。

    4.将比较结果生成测试报告。

    如果是图形界面的话,就比较麻烦一点了,以现在比较流行的web为例:

    1.需要实现web操作,无论你是自己写程序实现,还是用现有的工具,都是将动作、对象、数值组织起来完成一个web操作。比如登入网站,分3个步骤,(1)输入用户名,动作是输入,对象是用户名输入框,数值是你的用户名。(2)输入密码,动作是输入,对象是密码输入框,数值是你的密码。(3)点击登入按钮,动作是点击,对象是登入按钮,没有数值。完成了web操作之后,我们就可以获取到相关的实际结果,例如登入成功的提示,或者登入後的网页内容,我们就需要通过程序去获取回来,准备之后的比较。

    第2-4步跟非图形界面基本一样。

  • 相关阅读:
    Java MD5机密算法的使用
    JavaWeb学习总结-12 JSTL标签语言
    HTML5学习总结-09 拖放和手机触屏事件
    HTML5学习总结-08 应用缓存(Application Cache)
    HTML5学习总结-08 WebSocket 服务器推送
    软件架构阅读笔记06
    软件架构阅读笔记05
    软件架构阅读笔记04
    软件架构阅读笔记03
    软件架构阅读笔记02
  • 原文地址:https://www.cnblogs.com/pasco/p/4110190.html
Copyright © 2011-2022 走看看