软件测试中的一个智能的 Web 界面测试系统
Web2.0 是相对Web1.0 的新的一类互联网应用的统称。2001年秋天互联网公司(dot-com)泡沫的破灭标志着互联网的一个转折点。许多人断定互联网被过分炒作,事实上网络泡沫和相继而来的股市大衰退看起来像是所有技术革命的共同特征。股市大衰退通常标志着蒸蒸日上的技术已经开始占领中央舞台。假冒者被驱逐,而真正成功的故事展示了它们的力量,同时人们开始理解了是什么将一个故事同另外一个区分开来。 在那个会议之后的一年半的时间里,“Web 2.0”一词已经深入人心,从Google上可以搜索到4.7亿 web2.0
以上的链接。但是,至今关于Web 2.0的含义仍存在极大的分歧,一些人将Web 2.0贬低为毫无疑义的一个行销炒作口号,而其他一些人则将之理解为一种新的传统理念。 在我们当初的头脑风暴中,我们已经用一些例子,公式化地表达了我们对Web 2.0的理解:
Web 1.0 Web 2.0
1 DoubleClick Google AdSense
2 Ofoto Flickr
3 Akamai BitTorrent
4 mp3.com Napster
5 大英百科全书在线(Britannica Online) 维基百科全书(Wikipedia)
6 个人网站 博客(blogging)
7 evite upcoming.org和EVDB
8 域名投机 搜索引擎优化[1][2]
9 屏幕抓取(screen scraping) 网络服务(web services)
10 发布 参与
11 内容管理系统 维基
12 目录(分类) 标签(“分众分类”,folksonomy)
13 粘性 聚合
这个列表还会不断继续下去。但是到底是什么,使得我们认定一个应用程序或一种方式为作为所谓“Web 1.0”,而把另外一个叫做“Web 2.0”呢?(这个问题尤为紧迫,因为Web 2.0的观念 web2.0
已经传播的如此广泛,以至于很多公司正在将这个词加到他们的行销炒作中,但却没有真正理解其含义。同时这个问题也尤为困难,因为许多嗜好口号的创业公司显然不是Web 2.0,而一些我们认为是Web 2.0的应用程序,例如Napster和BitTorrent,甚至不是真正适当的网络程序!) 然而,抛开纷繁芜杂的Web 2.0现象,进而将其放到科技发展与社会变革的大视野下来看,Web 2.0可以说是信息技术发展引发网络革命所带来的面向未来、以人为本的创新2.0模式在互联网领域的典型体现,是由专业人员织网到所有用户参与织网的创新民主化进程的生动注释。Web2.0 是一个体现当代 WWW 技术发展趋势的流行概念。它极力促进创造性、信息交互性以及用户间协作性的 Web 设计思想的推广。这些想法带来了各种丰富多彩的基于 Web 的互动和资讯服务的开发和演变。例如,社交网站,WIKI 以及博客。
Web2.0 最突出的特色就是丰富的客户端技术。主要有三大类:
Ajax(Asynchronous JavaScript + XML)是 Web2.0 的主要技术。网页浏览不再是单击一下,然后等待整个页面重新装载,而是可以用鼠标顺畅地滚动地图,等待局部数据的自动刷新。典型的事例应用是 Google Map。
JSON(JavaScript Object Notation)是 Ajax 的衍生技术之一。Web 数据通常通过 XML 传输。而 JSON 对象是一系列以逗号分隔的 name:value 对,与 XML 相比更加的简洁,传输效率高,适合大规模数据传输。典型的应用事例是 Live Search Box。
REST(Representational State Transfer)是一种轻量级的面向数据库的 Web 服务架构。REST 架构遵循 CRUD 原则,对于资源只需要四种行为:Create(创建)、Read(读取)、Update(更新)和 Delete(删除)就可以完成对其操作和处理。典型的应用事例包括 Facebook 和 Flickr。
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 管理站点将列出当前所以测试案例。用户可以自由地挑选下次测试需要的用例。当用户选择保存后,这些测试脚本就会在下次系统自动部署时候被运行。如果用户选择运行,那么系统可以马上在当前已部署的产品环境上运行测试脚本。
发布自动测试报告