软件测试中一个智能的 Web 界面测试系统
Web2.0 技术使 Web 界面更加丰富多彩,使信息交流更加灵活,同时也使得相关的 Web 技术测试需求越来越多。那么,如何提高 Web 界面的测试效率,保证新技术得到高质量应用?是否可以让测试人员脱离枯燥地点击鼠标,让机器自动地根据脚本运行?随着项目需求的变化,能否有一个比较快速地配置管理测试任务的方法?所有这些都可以通过一个智能的 Web 界面测试系统来实现。这个系统结合 TestNG, Ant, Selenium 还有 Flex 技术,实现方式简单、运行高效灵活,对单元测试,功能测试和集成测试都有益,能够提高团队的工作效率。
介绍 Web2.0 相关技术
Web2.0 是一个体现当代 WWW 技术发展趋势的流行概念。它极力促进创造性、信息交互性以及用户间协作性的 Web 设计思想的推广。这些想法带来了各种丰富多彩的基于 Web 的互动和资讯服务的开发和演变。例如,社交网站,WIKI 以及博客。
Web2.0 最突出的特色就是丰富的客户端技术。主要有三大类:
- Ajax 和 JSON
Ajax(Asynchronous JavaScript + XML)是 Web2.0 的主要技术。网页浏览不再是单击一下,然后等待整个页面重新装载,而是可以用鼠标顺畅地滚动地图,等待局部数据的自动刷新。典型的事例应用是 Google Map。
JSON(JavaScript Object Notation)是 Ajax 的衍生技术之一。Web 数据通常通过 XML 传输。而 JSON 对象是一系列以逗号分隔的 name:value 对,与 XML 相比更加的简洁,传输效率高,适合大规模数据传输。典型的应用事例是 Live Search Box。
- Restful
REST(Representational State Transfer)是一种轻量级的面向数据库的 Web 服务架构。REST 架构遵循 CRUD 原则,对于资源只需要四种行为:Create(创建)、Read(读取)、Update(更新)和 Delete(删除)就可以完成对其操作和处理。典型的应用事例包括 Facebook 和 Flickr。
- RIA
RIA(Rich Internet Application)是如今非常流行的 Web 技术。它的界面类似于一般的桌面程序,比一般的 Web 程序更加丰富并且互动。目前比较流行的技术有三项:Abobe Flex, 微软的 Silverlight 和 Sun 推广的 JavaFX。三种技术都有自己的 SDK 和开发工具。
介绍测试系统流程
以上我们简要介绍了 Web2.0 的概念和相关客户端技术。为确保客户端产品的质量,我们需要使用与此相应的 Web 测试工具,从而方便地融合于产品测试中。此外,为适应 Web 开发的灵活性,我们同时需要一个能够快速配置、部署、运行和汇报结果的测试系统,从而实现智能高效的测试流程,降低软件研发的成本。
基于以上论述,下面将介绍一个智能的 Web 界面测试系统。该系统有四大模块组成,主体主要由 Python 语言实现,结合几种开发工具和技术,包括 Ant、Selenium、TestNG、XML 和 Flex。系统有两个控制方式:时间和 Web 管理站点。时间逻辑在 Python 脚本中实现,当时间到来时系统会按顺序下载源代码、部署应用程序、运行自动测试、发布报告;而 Web 管理站点通过 Flex 和 JAVA 技术来实现,用户可以按需在线配置某些模块,并要求立即执行自动测试。
下面将详细介绍每个模块的具体工作内容。测试流程参见图 1。
图 1. 测试系统概述在软件开发过程中,每天都会因新的功能而更改源代码。此外,很多项目需要国际团队合作,这些情况下代码的更新频率更加高。本土和国外团队经常需要共享源代码,而源代码可能被存放在固定的站点上面。当源代码文件量大而站点距离遥远的时候,下载代码的任务就比较耗时。为了节省这方面的时间,提高团队整体的工作效率,有必要让这部分工作自动化起来。所以,系统首先实现了一个结合 Python 和 XML 的下载控制模块。它的逻辑比较简单(参见图 2)。Python 程序定时读取配置文件,判断该任务当前是否可以运行。如果此刻时间和配置的时间一致,就访问站点,下载代码包。否则,放入等待队列,获取下一个任务。在等待队列里面的任务会在一定时间后重新启动。
图 2. 下载流程下载配置文件的内容参见以下代码:
清单 1.下载配置文件的代码<?xml version="1.0" encoding="utf-8"?> <items> <item name="download source files" type="source" weekday="-1" time="7:-1" source="https://sample.sourcecode.com" target="C:\sourcetar\"/> </items> |
读取下载配置文件的代码如下:
清单 2.读取下载配置文件的代码from xml.dom.minidom import parse, parseString from MyDownloadTask import MyDownloadTask def readFromProperty(xmlfile): tasklist = [] dom = parse(xmlfile) for node in dom.getElementsByTagName('item'): name = node.getAttribute('name') weekday = node.getAttribute('weekday') time = node.getAttribute('time') source = node.getAttribute('source') target = node.getAttribute('target') type = node.getAttribute('type') // 定义一个下载任务 task = MyDownloadTask() task.create(name, weekday, time, source, target, type) // 加入下载任务列表 tasklist.append(task) return tasklist |
实现具体的下载逻辑如下:
清单 3.实现下载的代码class MyDownloadTask(object): …… // 定义一些变量 def create(self, name, weekday, time, source, target, type): self.name = name self.weekday = int(weekday) self.source = source self.target = target index = time.find(":") self.hour = int(time[0:index]) self.minute = int(time[index+1:]) self.type = type def run() // 使用用户名和密码通过防火墙 password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None, self.source, username, password) handler = urllib.request.HTTPBasicAuthHandler(password_mgr) opener = urllib.request.build_opener(handler) urllib.request.install_opener (opener) // 从站点下载文件 content = urllib.request.urlopen(self. source).read() f=open(self.target + self.buildno,"wb") f.write(content) f.close() |
此例指出目前有一项下载任务,下载类型是源代码,链接为 https://sample.sourcecode.com, 将其保持到 C 盘 sourcetar 文件夹下,时间为每天早上 7 点钟。(-1 代表任意时间)。项目组可以根据需要增加下载项。比如,我们项目组由于资源文件经常要修改,所以需要每天上午和下午都要检测是否有新的代码包,所以配置了两个下载任务。上午的时间一般都在 7 点,这样可以在每位同事上班打开电脑的那个时刻就获得大洋彼岸美国项目组下班时候的最新进展。
正如前文所述,该测试系统中我们提供一个 Web 管理站点,用户可以根据项目的需要配置下载任务,不必麻烦系统管理员来修改下载配置文件。该模块使用 Flex 和 Java 技术实现(参见图 3)。用户可以通过它了解当前系统已有的下载任务。此外,用户也可以通过管理站点创建,修改和删除下载任务。这些更改最终都会被保存到 XML 配置文件中。
图 3. 下载管理界面对 Web 应用程序而言,测试的第一步是部署。有了源代码后,测试系统使用 Ant 编写的脚本编译源代码,停止当前已有的 Web 服务器,部署产品代码,然后重新启动 Web 服务器。在这段时间中,产品的测试环境可能暂时无法访问(参见以下代码)。
清单 4.代码部署def deploybuild(self): … // 清理文件夹,将源代码解压到 d 盘 buildtar 目录 try: tar = tarfile.open(self.target + myHtml.srcbuild, "r:gz") for tarinfo in tar: print(tarinfo.name, "is", tarinfo.size, "bytes in size") tar.extractall("d:/buildtar") tar.close() except : … // 编译源代码 os.chdir("d:/buildtar") os.system("Ant all") // 关闭 web 服务 os.system("net stop \”servicename\""); … // 部署系统 // 开启 web 服务 os.system("net start \"servicename\"") |
当新版本的 Web 应用程序部署完后,测试系统就开始进入自动测试。本系统使用 SVN 对测试脚本进行版本控制。所以有必要在一开始通过 SVN 更新最近的测试脚本。这里使用 Ant 来调用 SVN 的命令行工具,参见下图。
使用如下 Python 脚本调用相应的 Ant 任务:
清单 5.Python 脚本def runseleniumtestcase(self): // 下载测试脚本 os.chdir("d:/") os.system("Ant download-testcase -buildfile=task.xml") // 运行测试脚本 os.chdir("d:/v510") os.system("Ant start-selenium -buildfile=build.xml") <target name="download-testcase"> <delete dir ="v100"/> <property environment="env"/> <exec executable="cmd"> <env key="PATH" path="${env.PATH}:C:/Program Files/CollabNet Subversion Client"/> <arg value="/c"/> <arg value="svn"/> <arg value="checkout"/> <arg value="svn://9.19.199.9/web/v100"/> </exec> </target> |
事例中的任务 download-testcase 用来从站点 9.19.199.9 的 web/v100 目录下载最新版本的测试脚本。start-selenium 任务将启动 selenium 的 proxy server,然后按照 TestNG 配置的顺序运行测试脚本。
测试系统的脚本应用 Selenium 和 TestNG 的测试工具,实现对各类型 Web 界面的测试需求。在第三节中将详细介绍 Selenium 工具在本系统的应用,并在第四章中介绍 TestNG 工具在配置 Selenium 测试脚本中的作用。
为适应项目开发周期不同阶段的测试需求,Web 管理站点将列出当前所以测试案例。用户可以自由地挑选下次测试需要的用例。当用户选择保存后,这些测试脚本就会在下次系统自动部署时候被运行。如果用户选择运行,那么系统可以马上在当前已部署的产品环境上运行测试脚本。
运行完自动测试用例后,测试结果自动生成于测试工具目录下面。这样会覆盖原先的文件,不利于项目的跟踪和信息的交流。所以,我们的测试系统会将测试报告发布到 Web 管理站点。用户只需按照上面的时间点击链接,就可以看到每次测试的运行结果(参见图 4)。
图 4. 测试报告界面