Selenium+PhantomJS自动化测试应用

在前文Tomcat+JSP+Oracle信息查询系统开发笔记(3)中我们已经搭建好了供使用的IP信息查询系统,在发布上线给更多人使用前,我们需要对其进行测试,以确保其稳定可靠。

在本例中,由于系统较为简单,我们仅对其进行功能测试,即像用户那样进行输入、点击操作,观察其是否返回正确的输出即可。但由于数据库为百万量级,不适合人工进行测试,宜采用自动化测试方法。

在自动化测试领域内,Selenium是一件使用广泛的工具,除了测试,爬虫也经常用到它,且其不仅限于Python语言。这里推荐虫师的《Selenium2 Python自动化测试实战》,快速掌握Python上的selenium使用方法。

由于是对基于web的查询系统进行测试,故还需要浏览器进行模拟,PhantomJS这个headless浏览器就可以在不打开浏览器界面的前提下,模拟用户的真实操作过程,方便快捷且占用内存小,在爬虫、测试等领域被广泛使用。在官网下载并解压文件夹,将PhantomJS.exe所在文件夹加入环境变量中即可使用。本来打算使用Firefox或者Chrome这样的实体浏览器以进行测试,但调用实体浏览器耗时,且在开发过程中遇上了输入表单后提交失败的bug,虽然推断出可能由于输入后界面重新刷新所致,但一直无法解决,无奈改换PhantomJS进行模拟。

整个测试使用Python2开发,脚本运行流程如下:

  1. 输入sql存储的文件夹路径,生成sql文件列表
  2. 输入序号选取sql文件,指定IP抽取数目
  3. 生成抽取出的IP列表,保存为csv文件并输出抽取过程耗时,单位为秒
  4. 读取IP列表,启动模拟浏览器,重复进行IP地址输入、提交、返回提交后的页面源码、统计页面中涉及数据库个数(最大值为5)并返回,每完成一个即输出该条IP处理完成记录
  5. 关闭模拟浏览器,将每次返回的记录输出为log日志文件
  6. 输出整个测试总耗时,单位为s

测试输入如图所示:

这里写图片描述

中间记录省略
这里写图片描述

输出文件示例:

IP地址文件:文件名为数据库+抽取时间.csv

,ip
0,1.4.72
1,1.26.147
2,1.14.83
3,1.30.68
4,1.51.98
5,1.51.154
6,1.57.182
7,1.58.110
8,1.60.15
9,1.60.57

测试日志文件:文件名为autotest+抽取时间.log

No.0 is finished, recorded in 5 database
No.1 is finished, recorded in 5 database
No.2 is finished, recorded in 5 database
No.3 is finished, recorded in 5 database
No.4 is finished, recorded in 4 database
No.5 is finished, recorded in 5 database
No.6 is finished, recorded in 5 database
No.7 is finished, recorded in 5 database
No.8 is finished, recorded in 5 database
No.9 is finished, recorded in 5 database

这也是第一个自己写的、上了一百行的程序。从昨天开始整合、调bug、加功能,弄到内牛满面。

函数块功能都很简单,很容易就能看懂,其中抽取部分可详见Python自动化脚本【2】从sql文件中随机抽取条目一文。

记录一下踩的坑以及小tips

  1. Python2的中文编码:神坑不解释,主要体现在文件夹路径读取以及统计中。最好代码存放路径,以及程序访问的文件夹路径均为全英文名。
  2. 网页访问中,注意frame以及框架的存在,否则定位时会因返回空值而报错。
  3. Python2中raw_input与input的不同,raw_input将所有字符按字符串读取,返回字符串类型,而input只接收数字,返回int或float类型。在最后整合中,由于将读取指定抽取数目的语句写为raw_input且未更改变量类型,导致抽取数目失控,极大影响了程序运行时间。
  4. PhantomJS的优化,参考了【phantomjs系列】Selenium+Phantomjs性能优化一文,将PhantomJS开关的操作放在页面读取外面,节约了时间,提高了一定性能。
  5. 更多的小坑记不清了。。。

TODO LIST

  1. 目前的IP地址为从数据库中抽取出的值,可否考虑自行生成IP地址以进行测试。
  2. 程序中严重缺乏异常处理代码(主要也因为我目前水平太渣),包括并不限于:路径不存在时进程的中止跳出,大量条目进行处理中某个条目处理出错,记录处理异常并跳过以处理下一个条目等等。
  3. 测试正常以及异常记录的可视化。

参考链接:

python2.x和python3.x中raw_input( )和input( )区别

python查找目录下指定文件

【phantomjs系列】Selenium+Phantomjs性能优化

猜你喜欢

转载自blog.csdn.net/u013023297/article/details/74458769