什么是自动化测试?
(广义)一切能代替或辅助手工测试的行为,包括性能测试工具(jmeter,ab);
(狭义)通过
工具或编写脚本的方式模拟手工测试的过程,通过回放或运行脚本来自动执行测试用例,从而代替人工对系统的功能进行测试。
金字塔式的自动化
《google 测试之道》一书,google产品 = 70%的投入为单元测试 + 20%为集成、接口测试 + 10% 为UI层的自动化测试。
单元测试:
几乎所有的主流语言,都会有其对应的单元测试框架,如java的Junit、testNG,C#的NUnit ,python 的unittest、pytest 等。
关注代码的实现逻辑,例如一个if 分支或一个for循环的实现。
接口测试:
关注的是函数、类(方法)所提供的接口是否可靠;
接口测试主要是指基于http,https,rpc协议的web接口
注:框架支持单一接口,多接口组合测试
UI测试:
大部分测试人员进行的功能测试。
UI层的自动化测试工具非常多,比较主流的是QTP,Robot Framework、watir、selenium 等
自动化测试难点
自动化测试中最怕的是变化,因为变化的直接结果就是导致测试用例的运行失败,那么就需要对自动化脚本进行维护;如何控制失败,降低维护成本对自化的成败至关重要。
另外, 项目周期应该可以支持来做自动化测试;
最后,自动化测试应该是可复用的。
自动化测试工具
step1: 确认你的产品桌面程序(C/S)还是web应用(B/S)
step2: 如果是C/S,使用QTP(首选资料丰富)、 AutoRunner
如果是B/S,使用QTP、AutoRunner、Robot Framework、watir、selenium(首选,开源,支持多语言的开发;脚本语言首选ruby ,python ,java)
selenium
selenium 也不是简单一个工具,而是由几个工具组成,每个工具都有其特点和应用场景。
selenium IDE
selenium IDE 是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。那么什么情况下用到它呢?
快速的创建bug重现脚本,在测试人员的测试过程中,发现了bug之后可以通过IDE将重现的步骤录制下来,以帮助开发人员更容易的重现bug。
IDE录制的脚本可以可以转换成多种语言,从而帮助我们快速的开发脚本。
selenium Grid
Selenium Grid是一种自动化的测试辅助工具,Grid通过利用现有的计算机基础设施,能加快Web-app的功能测试。利用Grid,可以很方便地同时在多台机器上和异构环境中并行运行多个测试事例。其特点为:
· 并行执行
· 通过一个主机统一控制用例在不同环境、不同浏览器下运行。
selenium RC
selenium RC 是selenium 家族的核心工具,selenium RC 支持多种不同的语言编写自动化测试脚本,通过selenium RC 的服务器作为代理服务器去访问应用从而达到测试的目的。
selenium RC 使用分Client Libraries和selenium Server,Client Libraries库主要主要用于编写测试脚本,用来控制selenium Server的库。
Selenium Server负责控制浏览器行为,总的来说,Selenium Server主要包括3个部分:Launcher、Http Proxy、Core。其中Selenium Core是被Selenium Server嵌入到浏览器页面中的。其实Selenium Core就是一堆JS函数的集合,就是通过这些JS函数,我们才可以实现用程序对浏览器进行操作。Launcher用于启动浏览器,把selnium Core加载到浏览器页面当中,并把浏览器的代理设置为Selenium Server 的Http Proxy。
selenium 2.0
搞清了selenium 1.0 的家族关系,selenium 2.0 是把WebDriver 加入到了这个家族中;简单用公式表示为:
selenium 2.0 = selenium 1.0 + WebDriver
需要强调的是,在selenium 2.0 中主推的是WebDriver ,WebDriver 是selenium RC 的替代品,因为 selenium 为了向下兼容性,所以selenium RC 并没有彻底抛弃,那么selenium RC 与webdriver 主要有什么区别呢?
selenium RC 在浏览器中运行JavaScript应用,使用浏览器内置的JavaScript 翻译器来翻译和执行selenese命令(selenese 是selenium命令集合)。
WebDriver通过原生浏览器支持或者浏览器扩展直接控制浏览器。WebDriver针对各个浏览器而开发,取代了嵌入到被测Web应用中的JavaScript。与浏览器的紧密集成支持创建更高级的测试,避免了JavaScript安全模型导致的限制。除了来自浏览器厂商的支持,WebDriver还利用操作系统级的调用模拟用户输入。
应用:
如果是新项目直接学习webdriver 就OK了,RC是过时技术。
selenium 如何学习
1. 配置测试环境
2. 熟悉webdriver API ,API就是selenium 所定义一方法,用于定位,操作页面上的各种元素。
selenium 提供了id、name、class name、 tag name、link text、partial link text、 xpath、css、等定位方法。
3. 各种元素有操作,输入框,下拉框,按钮点击,文件上传、下载,分页,对话框,警告框
4. 学习并使用单元测试框架,来把用例组织起来,统一运行
5. 跑了一段时间的测试用例后,会发现以下问题:
用例中有大量重复的操作;
每个用例中都有一些数据,这些数据也是一样的,但如果变化了修改起来非常麻烦
解决:
重复的写到一个单独的文件中,需要的时候调用这些操作;
数据写到一个单独的文件中进行读取
6. 验证用例运行失败还是成功,办法:在脚本中加一些验证与断言
7. 单元测试框架的log太简陋,办法:美化日志
8.想定时来自动跑脚本,办法:定时任务
文献参考:
http://www.cnblogs.com/fnng/p/3653793.html
自动化测试框架的设计原则
要选择什么样的开发语言?
常见的自动化框架开发语言有: C,C++,Java, TCL, Perl,
Ruby
, Python。
使用C或者C++,执行效率高,字符串的处理能力,C或者C++ 在这些方面的支持并不完备。会导致整个开发流程的延长,更重要的是,使用C或者C++,不能够实现跨平台。如果自动化框架只是在公司内部使用,不是商用产品的话,不建议使用。
Java的自动化测试框架主要还是面向对使用Java开发的产品的测试,并且主要使用在单元测试阶段
TCL是老牌的自动化测试语言。对于基于命令行来远程控制的设备如路由器,交换机等的自动化测试领域应用非常成熟。美中不足的是:TCL在设计之初是不支持面向对象的设计方法的。
Perl语言在设计之初也不支持面向对象,在网络管理员的圈子里应用的很广,被称作是the duct tape of the Internet。在自动化测试领域应用的范围不是很广泛。有一些IT厂家由于历史的原因在使用Perl进行自动化测试,但是也在慢慢向其他脚本开发语言转型。
Python作为一个脚本开发语言。它的支持库的代码水平也比较高。对于软件开发的各个方面的第三方库(如图像处理,网络通信,Web技术等)都有非常好的支持。Python本质上就是面向对象的脚本语言。
Ruby是日本人发明的完全面向对象的脚本语言。Ruby语言也受到了大型IT公司的测试团队的关注。在自动化测试领域得到了越来越广泛的应用。有一些大型公司正在由其他的脚本语言向Ruby转换。
作为一个自动化测试框架,一个设计原则就是快速成形,快速推广,增量开发。框架的基本功能要马上可用,并能迅速找到使用者。
在这个要求上,对编程语言的选择有如下两点:
1、Fast Prototype (马上就可以用)
2、可扩展
第一点,对于解释执行的脚本语言来说,是非常适合的,解释执行的脚本语言可以再有限的代码量内开发出尽可能丰富的功能,而不用担心内存分配与释放等其他编译执行语言需要考虑的问题。而面向对象有可以满足第二点的要求。所以,如果选择自动化框架的脚本语言,推荐Python和Ruby。
文献参考:
http://www.51testing.com/html/04/n-222104.html
注意的几点
1. 不要闭门造车
在设计框架的时候应该尽可能的沿用自动化测试工具已提供的功能。比如,一个基于selenium的框架,selenium本身就已经提供了打开浏览器和网页,点击按钮等功能,就不必花时间再去开发这样一些关键字,以减少开发成本。
2. 可重用性
一个好的框架必须具有高度的可重用性。我们可以把一些单独的操作组合成一些最常用的测试流程,比如,把“输入用户名”、“输入密码”、“点击登录”三个操作组合成一个关键字“登录”。
3. 版本控制
使用git,svn等来控制脚本的提交、修改
4. 以下几种用例执行需求
1. 执行一个单独的用例
2. 执行一个测试用例集
3. 重新执行失败的用例
4. 根据其他的用例或用例集的运行结果执行相应的用例或用例集
除了这些以外可能还有其他的方法,主要是根据项目的需求来的,所以只需要满足特定的项目测试需求就可以了,不必全部都实现。
5. 状态监控
在脚本执行的时候,框架应当能够实时监控脚本的运行情况,如果碰到运行故障的时候应当能进行基本的容错恢复处理,这样的话不至于使脚本处在一个被block的状态,从而浪费大量时间。
6. 测试日志
一个好的框架应当能在测试执行过程中生产足够详细的日志信息(文字、截图等),这对于调试的帮助很大,同时也能我们快速定位到问题所在,节省时间。
7. 灵活性
灵活性是指框架应当能保证在目前的基础上做二次开发的能力,这个其实跟软件开发的标准是一样的,预留足够的可扩展性以便未来的版本升级。
8. 性能
框架设计不宜过于复杂,太复杂的框架会增加脚本的加载、运行时间,从而导致运行脚本的效率低下。所以在设计框架的时候,也要考虑到性能这一因素。
9. 规范
好的编码规范能使脚本易读、易维护、易管理。下面列出了一些点:
1. 变量、常量、函数、文件、脚本的命名规范
2. 函数、函数库的注释规范
3. 对象命名规范
文献参考:
http://blog.csdn.net/snakeshiy/article/details/8565178