为者长成 行者长至

发布新日志

  • Bugzilla操作说明

    2008-03-24 11:23:05

    1、 用户登录及设置

    1.1用户登录

      1. 用户输入服务器地址http://192.168.4.79/bugzilla/

          (本公司服务器地址为http://192.168.4.79:9090/

      2. 进入主页面后,点击【Forget the currently stored login】,再点击【login in】进入。

      3. 进入注册页面,输入用户名和密码即可登录。用户名为Email 地址,初始密码为用户名缩写。

      4. 如忘记密码,输入用户名,点击【submit request】,根据收到的邮件进行重新设置。

    1.2、修改密码及设置

      1.Login登录后,【Edit prefs】->【accout settings】 进行密码修改。

      2.【Edit prefs】->【email settings】 进行邮件设置。

      3.【Edit prefs】-> 【permissions】 进行权限查询

    2、Bug的处理过程

    2.1、报告Bug

    2.1.1测试人员报告Bug

      1. 请先进行查询,确认要提交的bug报告不会在原有纪录中存在,若已经存在,不要提交,若有什么建议,可在原有纪录中增加注释,告知其属主,让bug的属主看到这个而自己去修改。

      2. 若Bug不存在,创建一份有效的bug报告后进行提交。

      3. 操作:点击New,选择产品后,填写下表。

      4. 填表注意:Assigned to: 为空则默认为设定的 owner, 也可手工制定。CC: 可为多人,需用","隔开。Desription中要详细说明下列情况:

      1) 发现问题的步骤

      2) 执行上述步骤后出现的情况。

      3) 期望应出现的正确结果。

      选择group设置限定此bug对组的权限,若为空,则为公开。

      5. 操作结果:Bug状态(status)可以选择Initial state 为New或Unconfirmed.

      系统将自动通过Email通知项目组长或直接通知开发者。

      6.帮助: Bug writing guidelines

    2.1.2 开发人员报告Bug.

      1. 具体方法同测试人员报告。

      2. 区别: Bug初始状态将自动设为Unconfirmed,待测试人员确定后变为“New".

    2.2、Bug的不同处理情况

    2.2.1 Bug的属主 (owner) 处理问题后,提出解决意见及方法。

      1 . 给出解决方法并填写Additional Comments,还可创建附件(如:更改提交单)

      2.具体操作(填表项如下)

      3 . 填表注意:

      FIXED 描述的问题已经修改

      INVALID 描述的问题不是一个bug (输入错误后,通过此项来取消)

      WONTFIX 描述的问题将永远不会被修复。

      LATER 描述的问题将不会在产品的这个版本中解决.

      DUPLICATE 描述的问题是一个存在的bug的复件。

      WORKSFORME 所有要重新产生这个bug的企图是无效的。如果有更多的信息出现,请重新分配这个bug,而现在只把它归档。

    2.2.2 项目组长或开发者重新指定Bug的属主。(owner)

      1. 为此bug不属于自己的范围,可置为 Assigned,等待测试人员重新指定。

      2. 为此bug不属于自己的范围,但知道谁应该负责,直接输入被指定人的Email, 进行Ressigned。

      3. 操作:(可选项如下)

      * Accept bug (change status to ASSIGNED)

      * Reassign bug to

      * Reassign bug to owner and QA contact of selected component

      4. 操作结果:此时bug状态又变为New,此bug的owner变为被指定的人。

    2.2.3测试人员验证已修改的 Bug.

      1. 测试人员查询开发者已修改的bug,即Status为"Resolved",Resolution为"Fixed".进行重新测试。(可创建test case附件)

      2. 经验证无误后,修改Resolution为VERIFIED。待整个产品发布后,修改为CLOSED。

      若还有问题,REOPENED,状态重新变为“New",并发邮件通知。

      3. 具体操作(可选择项)

       1. Leave as RESOLVED FIXED

       2. Reopen bug

       3. Mark bug as VERIFIED

       4. Mark bug as CLOSED

    2.2.4 Bug报告者(reporter)或其他有权限的用户修改及补充Bug

      1. 可以修改Bug的各项内容。

      2. 可以增加建立附件,增加了相关性, 并加一些评论来解释你正在做些什么和你为什么做。

      3. 操作结果:每当一些人修改了bug报告或加了一个评论,他们将会被加到CC列表中,bug报告中的改变会显在要发给属主、写报告者和CC列表中的人的电子邮件中。

    2.2.5测试人员确认开发人员报告的Bug是否存在.

      1. 查询状态为“Unconfirmed"的Bug,

      2. 测试人员对开发人员提交的Bug进行确认,确认Bug存在。

      3. 具体操作:选中“Confirm bug(change status to New)"后,进行commit.

      4. 操作结果:状态变为“New".

    2.3、查询Bug

      1.直接输入Bug Id,点击find 查询。可以查看Bug的活动纪录。

      2.点击Query,输入条件进行查询。

      3.查询Bug活动的历史

      4.产生报表。

      5.帮助:点击Clue.

    3、关于权限的说明

      1. 组内成员对bug具有查询的权利,但不能进行修改。

      2. Bug的owner 和 reporter 具有修改的权利。

      3. 具有特殊权限的用户具有修改的权利。

    4、 BUG处理流程

      1. 测试人员或开发人员发现bug后,判断属于哪个模块的问题,填写bug报告后,通过Email通知项目组长或直接通知开发者。

      2. 项目组长根据具体情况,重新reassigned分配给bug所属的开发者。

      3. 开发者收到Email信息后,判断是否为自己的修改范围.

      1) 若不是,重新reassigned分配给项目组长或应该分配的开发者。

      2) 若是,进行处理,resolved并给出解决方法。(可创建补丁附件及补充说明)

      4. 测试人员查询开发者已修改的bug,进行重新测试。(可创建test case附件)

      1) 经验证无误后,修改状态为VERIFIED。待整个产品发布后,修改为CLOSED。

      2) 还有问题,REOPENED,状态重新变为“New",并发邮件通知。

      5. 如果这个BUG一周内一直没被处理过。Bugzilla就会一直用email骚扰它的属主,直到采取行动。

    5、一个Bug的生存周期



    Bugzilla管理员操作指南

    1、主要工作内容:


    1. 1产品(Product)、版本号(versions)和模块(Components)的定义,同时指定模块相应的开发者(owner)和测试人员(QA Contact)。

    1.2小组的定义和划分

    1.3测试中Bug严重程度、优先级的定义

    1. 4增加用户,并分别设定全部用户的分组、权限。

    1. 5主要参数(parameters)的设置

      1) urlbase: 输入bugzilla 工具所在的服务器IP地址。

      2) usebuggroupsentry: 设为ON,可以分组。

      3) whinedays:Bug在whinedays设定的期限内若未被处理,将自动重发mail,默认为7天。

      4) defaultpriority:设定默认的优先级

      5) commentonresolve:设为ON,系统将强制要求开发者处理完Bug 后,必须填写修改的内容。

    2、基本操作:

    2.1创建默认的管理员用户。

      运行checksetup.pl。若不小心删除管理员,重新运行checksetup.pl.

    2.2 管理用户

    2.1 增加新用户

      点击页面右下角【users】,submit后,出现【Add new user】页面。输入相应输入即可。Login name: 一般为邮件地址,可以设为其他标识。

    2.2 禁止一个用户

      填写Disabled text 输入框即可。

    2.3 修改用户

      可以修改用户注册名、密码。

      设置权限

      QA的权限一般设为: Canconfirm, editbugs

      Developer的权限设为: none

      分组控制:group

    3、管理group

    3.1.增加group

      edit groupàadd groups (New User Regexp可不填/active 选择则可选)->add

    3.2修改group ,submit 即可。

      4、管理Product 和 component

      a)增加Product

      b) Component 对应一个owner(进行fixed),QA Contact(确保已fixed)

      c) Component Number of Unconfirmed =10000,此产品将选择bug的初始状态(Unconfirmed,New)
  • Bugzilla 介绍

    2008-03-24 11:18:48

    什么是Bugzilla

    Bugzilla是一个错误跟踪系统,用于对软件产品程序开发过程的错误跟踪。它的强大功能表现在以下几个方面:

    1.         强大的检索功能

    2.         用户可配置的通过Email公布Bug变更

    3.         历史变更记录

    4.         通过跟踪和描述处理Bug

    5.         附件管理

    6.         完备的产品分类方案和细致的安全策略

    7.         安全的审核机制

    8.         强大的后端数据库支持

    9.         WebXmlEmail和控制界面

    10.     友好的网络用户界面

    11.     丰富多样的配置设定

    12.     版本间向下兼容

    为什么使用Bugzilla

    Bugzilla是一个拥有强大功能的错误跟踪系统。它可以使我们更好的在软件开发过程中跟踪软件错误的处理过程,为开发和测试工具以及产品质量的度量提供数据支持,从而有效的保证软件产品的质量。

     

    Bugzilla使用指南

    新建一个Bugzilla账号

    1.       点击“Open a new Bugzilla account”链接,输入你的Email地址(如:XXX@office)然后点击“Create Account”。

    2.       稍候,你会收到一封邮件。邮件中包含你的登录账号(与你的Email相同)和口令,这个口令时Bugzilla系统随机生成的,你可以根据你的需要进行变更。

    3.         在页面的黄色页角中点击“Log In”链接,而后输入你的账号和口令。最后点击“Login

    产品和结构(Product and Component)

    Bug记录按产品分类,每种产品按功能拆分成几类。以Bugzilla产品为例,它由以下几部分构成:

    l          Administration

    l          Bugzilla-General

    l          Creating/Changing Bug

    l          Documentation

    l          Email

    l          Installation

    l          Query/Buglist

    l          Reporting/Charting

    l          User Accounts

    l          Changing Passwords

    l          User Interface

    Bug报告状态分类和Bug处理意见(Status and Resolution):

    1.       Bug报告状态分类(Status)

    l          待确认的(Unconfirmed)

    l          新提交的(New)

    l          已分配的(Assigned)

    l          问题未解决的(Reopened)

    l          待返测的(Resolved)

    l          待归档的(Verified)

    l          已归档的(Closed)

    2.       Bug处理意见(Resolution)

    l          已修改的(Fixed)

    l          不是问题(Nvalid)

    l          无法修改(Wontfix)

    l          以后版本解决(Later)

    l          保留(Remind)

    l          重复(Duplicate)

    l          无法重现(Worksforme)

    指定处理人(Assigned To)

    l          可以指定一个处理人

    l          如不指定处理人,则系统指定管理员为默认处理人

    超链接(URL)

    l          输入超链接地址,引导处理人找到与报告相关联的信息

    概述(Summary)

    l          概述部分“Summary”的描述,应保证处理人在阅读时能够清楚提交者在进行什么操作的时候发现了什么问题。

    l          如果是通用组件部分的测试,则必须将这一通用组件对应的功能名称写入概述中,以便今后查询。

    硬件平台和操作系统(Platform and OS)

    l          测试应用的硬件平台(Platform),通常选择“PC”

    l          测试应用的操作系统平台(OS)

    版本(Version)

    l          产生Bug的软件版本

    Bug报告优先级(Priority)

    l          分五个等级即P1-P5,P1的优先级别最高之后逐级递减

    Bug状态(Severity)

    l          Blocker,阻碍开发和/或测试工作

    l          Critical,死机,丢失数据,内存溢出

    l          Major,较大的功能缺陷

    l          Normal,普通的功能缺陷

    l          Minor,较轻的功能缺陷

    l          Trivial,产品外观上的问题或一些不影响使用的小毛病,如菜单或对话框中的文字拼写或字体问题等等

    l          Enhancement,建议或意见

    报告人(Reporter)

    l          Bug报告提交者的账号

    邮件抄送列表(CC List)

    l          Bug报告抄送对象,该项可以不填

    l          如需要抄送多人,可将邮件地址用“,”分隔

    从属关系(Bug “ID” depends on,Bug “ID” blocks)

    l          Bug “ID” depends on”如果该Bug必须在其他Bug修改以后才能够修改,则在此项目后填写那个Bug的编号

    l          Bug “ID” blocks”如果该Bug的存在影响了其他Bug的修改,则在此项目后填写被影响的Bug编号

    附加描述(Additional Comments)

    l          Bug跟踪过程中测试与开发人员通过这里进行沟通

    l          开发人员可以在这里填写处理意见和处理记录

    l          测试人员可以在这里填写返测意见和对在返测过程中发现的新问题进行描述

    Bug查找

    l          可以通过页脚中的“Query”链接进入查找界面

    l          根据查找的需要在界面中选择对象或输入关键字

    l          查找功能能够进行字符或字串的匹配查找

    l          查找功能具有布尔逻辑检索功能

    l          你可以通过在查找页面中选择“Remember this as my default query”将当前检索页面中设定的项目保存。以后可以从页脚中的My bugs中直接调用这个项目进行检索

    l          你还可以通过在“Remember this query, and name it:”后面输入字符,将你当前检索页面中设定的项目保存命名,同时选中“and put it in my page footer”。则以后这个被命名的检索将出现在页脚中。(有关如何在页脚中设定显示的项目请参见1.5.3)

    Bug列表

    l          如果你运行了Bug检索功能,系统会根据你的需要列出相关的项目

    l          你可以通过列表页脚附近的“Change Columns”设定在列表中显示的Bug记录中的字段名称

    l          如果你拥有必要的权限,你还可以通过“Change several bugs”修改列表中罗列出的Bug的记录。例如:修改Bug的所有者

    l          通过“Send mail to bug owners”你可以给列表中罗列的Bug记录的所有者发信

    l          如果你对查找的结果不满意,希望重新调整检索设定。你可以通过“Edit this query”实现

    l          通常情况下,检索结果中只显示最基本的信息。你可以通过“Long Format”显示更详细的内容

    用户属性设置(Edit prefs)

    1           账号设置(Account Settings)

    l          在这里你可以改变你账号的基本信息,如口令,Email地址,真实姓名

    l          为了安全起见,在此页进行任何更改之前你都必须输入你当前的口令

    l          当你变更了你的Email地址,系统会给你的新老Email地址分别发一封确认邮件,你必须到邮件中指定的地址对你的更改进行确认

    2           Email设置(Email Settings)

    l          你可以在此通过选择告诉系统,你希望在什么条件下收到和你相关的邮件

    3           页脚(Page Footer)

    l          设定“Preset Queries”是否在页脚中显示

    4           用户权限(Permissions)

             你可以在此查看自己账号现在的权限

  • 安装mantis

    2008-03-17 11:18:27

    1. 简介
    mantis(
    螳螂)是一个基于php/MySQL/web的缺陷跟踪系统,最新版本是1.1.1
    要了解更多信息请到http://www.mantisbt.org/
    2.
    下载
    mantis1.1.1   http://www.mantisbt.org/download.php
    mysql5.0.2       http://dev.mysql.com/downloads/mysql/5.0.html
    PHP5.0.3     http://www.php.net/downloads.php
    apache2.0.52   http://httpd.apache.org/download.cgi

    3. 安装步骤
       1
    )安装刚才下载的软件

       下面假设各软件的安装目录为

       c:\mantis-0.19.2

       c:\mysql-5.0.2

       c:\php-5.0.3

       c:\apache-2.0.52 
      
    我习惯下载zip版的程序,直接解压到一个目录就可以了。

       没有的话,只好下载windows_installer版本:)。


       a.
    安装apache2.0.52
      
    我下载的是http://apache.freelamp.com/httpd/binaries/win32/apache_2.0.52-win32-x86-no_ssl.msi
      
    运行安装程序,安装时选择安装给当前用户,采用8080端口,不要安装成服务,对我来说没必要。安装后同样可以再安装成service  
      
    详细请参考:
       apahce
    windows下的安装指南 http://httpd.apache.org/docs-2.0/platform/windows.html
      
    运行c:\apache-2.0.52\bin\apache.exe,在IE地址栏输入http://localhost:8080/,可以看到安装成功。如果前面是安装成80端口的服务,则输入http://localhost/
       b.
    其它的软件直接解压到自己想要的目录。当然如果你下载的是installer也是一样的,直接运行安装程序,无非是安装
      
    后多了几个启动的快捷菜单外加一些默认设置罢了。
       2
    )为apache配置php
      
    打开c:\apache-2.0.52 \conf\httpd.conf文件,添加如下内容到文件尾
      #PHP 5
      LoadFile "c:/php-5.0.3/php5ts.dll"
      LoadModule php5_module "c:/php-5.0.3/php5apache2.dll"
      AddType application/x-httpd-php .php
     
    PHP.ini path
      PHPIniDir "c:/php-5.0.3"
       3
    php配置
      
    c:\php-5.0.3下的php.ini-dist复制一份,并改名为php.ini
      
    查找include_path,改为include_path=".;c:\php-5.0.3\pear"
      
    查找extension_dir,改为extension_dir="c:\php-5.0.3\ext"
      
    查找php_mysql.dll,将这一行前面的“;”号去掉
      
    保存文件
       4
    )为apache安装mantis系统
      
    打开c:\apache-2.0.52 \conf\httpd.conf文件,添加如下内容到文件尾
       Alias /mantis "c:/mantis-0.19.2/"
       <Directory "c:/mantis-0.19.2/">
        Options Indexes
        AllowOverride None
        Order allow,deny
        Allow from all
      </Directory>

      查找DirectoryIndex,添加index.php到后面。像这样DirectoryIndex index.html index.html.var index.php
       5)
    创建数据库

       运行c:\mysql-5.0.2\bin\mysqld-nt,启动数据库
       mysql -uroot -p
       create database bugtracker;
       use bugtracker;
       source c:\mantis-0.19.2\sql\db_generate.sql;

      当然你也可以用其它GUI工具创建数据库。
       6)mantis
    配置
      
    c:\mantis-0.19.2下的config_inc.php.sample复制一份,并改名为config_inc.php

      如果你改了root的密码,打开这个文件,设置$g_db_password='yourpassword'
       7)windows
    环境
      
    c:\php-5.0.3添加到path
       8)
    启动bug tracking system
      
    首先启动apachemysql,
      
    在址栏输入http://localhost:8080/mantis/index.php或者http://localhost/mantis/index.php
      
    应该可以看到初始页面了。用amdinistrator/root登录,mantis 开始为你工作。
       9)
    邮件服务器配置
      
    c:\php-5.0.3\php.ini文件中查找smtp,localhost改为你的发件服务器,SMTP = smtp.163.com

       php.ini文件中查找sendmail_from,将前面的分号去掉,并在后面填上邮件地址
      
    c:\mantis-0.19.2\config_inc.php文件中添加
       $g_smtp_host='smtp.163.com';
       $g_smtp_username='yourusername';
       $g_smtp_password='yourpassword';

       $g_phpMailer_method =2;

     

       查找$g_return_path_email,将后面的邮件地址改为有效的地址,这一点非常重要,不然将无法正常发送激活注册的邮件.

       config_inc.php其它邮件地址最好也改为有效的地址.

       $g_smtp_username,$g_smtp_password在服务器需要验证时用,不需验证时不用加,或设为
       $g_smtp_username=''
       $g_smtp_password=''
      
    现在你可以注册新用户,并使用发送邮件功能了。  
    4.
    后记
     
    昨天想装一个bug tracking system,上网转了一下,最后选定了mantis,理由只有一个:感觉这是一个功能能满足我的需要,更重要的是我能掌控的系统,以前除了在mysql create过一个db外,没有用过上面的任何一种软件。安装这个东西完全是为了我自己用,我是一个很懒的人,觉得把一些问题记在txt里会有一些麻 烦,其他人如果愿意用,我当然不反对:)。

      从下载安装到写完这个所谓的指南,用了几乎一天,有一些小问题浪费了很多时间,网上的一些安装手册,并没有想象的好用,

      按照我这个指南,一个小时应该可以搞定。

     

    集成apache+php+mysql+...的安装工具,http://www.apachefriends.org/en/xampp.html用它来安装very easy,即使你什么都不懂,也只要几分钟。
    下载windows下的安装包,setup,找到apache\conf\httpd.conf,在文件最后添加
    Alias /mantis "c:/mantis-0.19.2/"
       <Directory "c:/mantis-0.19.2/">
        Options Indexes
     AllowOverride None
     Order allow,deny
     Allow from all
      </Directory>
    启动apachemysql就行了。发邮件的功能设置见上面的3.9)

    唯一不好的是,他安装了一整套软件,如果你的机器上已经安装了mysql等,就会浪费一些硬盘空间。

     

    续:今天试了一下,发现发邮件的功能不能用,昨天试的时候说发送成功实际上并没有。上面的文档邮件服务器配置 部分已经经过修改,可以收到注册激活邮件了。调试的时假注意把垃圾瑞星监视等关掉,打开以后php可能不会返回合适的出错提示,浪费大量时间。
  • Windows下开源BUG跟踪系统mantis安装指南

    2008-03-17 10:38:34

     mantis(螳螂)是一个基于php/MySQL/web的缺陷跟踪系统,最新版本是1.1.1。
    http://www.mantisbt.org/download.php

     


    安装步骤
    1.集成apache+php+mysql+...的安装工具,http://www.apachefriends.org/en/xampp.html用它来安装
    目前版本为1.6.1

    2.下载ZIP包解压,然后修改apache\conf\httpd.conf,在文件最后添加
    Alias /mantis "d:/mantis/"
       <Directory "d:/mantis/">
        Options Indexes
    DirectoryIndex index.php
     AllowOverride None
     Order allow,deny
     Allow from all
      </Directory>

    3.找到该文件内PORT字样,把80端口改为8080端口


    4.在XAMPP目录内启动xampp_start.exe

    5.打开http://localhost:8080/,进入了XAMPP的欢迎页面,选择右上角语言的中文,选择左边状态,可以察看启动了什么服务。

    6.http://172.18.33.137:8080/mantis/admin/install.php
    安装MANTIS,新版本的MANTIS直接由这个界面安装MYSQL的库文件


    7.http://172.18.33.137:8080/mantis/
    登陆,试用administrator,默认密码root

    8.配置中文界面
    修改mantis目录下的config_inc.php文件,修改$g_default_language='chinese_simplified'

  • Windows+Apache环境下安装Mantis 0.19

    2008-03-17 10:06:49

    大家都知道,Mantis是一个轻量级的缺陷跟踪系统。作为一个免费的开源软件,我想这是很多小的团队首选的对象。在这里我为什么要介绍 Mantis,而不去介绍Bugzilla呢?第一、Mantis相对Bugzilla有更好的操作界面。第二、安装和使用都相对简单一点。

      而对于一般的项目, Mantis作缺陷跟踪,已经绰绰有余。好了,言归正传,下面就把我在Windows下安装Mantis 0.19的一些心得,拿出来和大家分享。

      1.安装前的准备

      从http://www.mysql.com/downloads/index.html下载mysql,我使用的是mysql 4.0.2。

      从http://www.php.net/downloads.php下载PHP for Windows,我使用的是最新的PHP 5,在下载PHP的同时,还要下载相应版本的zip package,也在这个网站上。

      从http://www.mantisbt.org/download.php下载Mantis,我使用的是0.19版本(目前是最新的)。

      从http://phpmailer.sourceforge.net下载phpmailer,我使用的是phpmailer 1.72,phpmailer是支持邮件发送的模块,支持SMTP、SENDMAIL等方式。

      从网上下载Apache,我使用的是Apache 2.0.5,基于IIS的安装方法,网上已经有一篇很全面的文章。

      2.安装步骤

      工具已经准备完毕,下面就开始进入主题吧!:)

      a)Mantis解压

      将下载的Mantis压缩包,解压到c:\mantis。

      b)Mysql的安装

      Mysql安装比较简单,按照默认方式安装就行了。安装完毕后要进行建Mantis库的操作。假设安装到c:\mysql目录。

      点开始->运行->输入CMD按回车,进入DOS命令提示行模式。

      CD c:\mysql\bin

      c:\mysql\bin>mysqld     //启动mysql的服务进程

      再开一个DOS提示行窗口,转到c:\mantis\sql目录

      CD c:\mantis\sql

      c:\mantis\sql>c:\mysql\bin\mysql -uroot //连接到mysql数据库

      mysql>UPDATE user SET password=PASSWORD('') WHERE user='root';

      mysql>FLUSH PRIVILEGES;

      上面的操作是修改root用户的密码,''是你设置的密码。

      mysql>create database mantis;     //创建Mantis库

      mysql>connect mantis;        //连接到Mantis库

      mysql>source db_generate.sql;  //Mantis初始化建表

      上面是建立Mantis数据库,建立Mantis运行时所需要的表。

      mysql>GRANT SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, CREATE, DROP, REFERENCES, LOCK TABLES, CREATE TEMPORARY TABLES ON mantis.* TO mantis@localhost IDENTIFIED BY '';

      mysql>FLUSH PRIVILEGES;

      上面是建立mantis用户,为mantis用户的密码。

      mysql>exit;   //退出

      c)PHP5和Apache的安装

      PHP5和Apache的安装,可以参考http://blog.csdn.net/thb28/archive/2004/07/29/55620.aspx,在这里我就不再重复描述了。

      d)修改Mantis和Apache的配置文件(这部分转载并进行部分修改)

      Mantis的设置是这样保存的:在config_defaults_inc.php中保存这Mantis的默认设置,用户自己的设置信息保存在 config_inc.php中,如果某个选项在config_inc.php中有设置,则系统使用config_inc.php中的设置,否则使用 config_defaults_inc.php的系统默认设置;config_inc.php.sample则是Mantis给出的一个用户设置文件例子。

      所以我们需要修改config_inc.php文件中的设置,设置很简单,各个参数的意义可以参见 config_defaults_inc.php,这里对每个参数都有详细的解释,虽然是E文,不过应该都能看懂;Sample中给出的一些设置是一定需要修改的,比如MySQL数据库的连接参数,管理员的邮箱的;其他的要根据你的实际情况进行修改。

      下面是我的一些自定义参数。

      修改以下几行为

      $g_db_username = "mantis";

      $g_db_password = "你在建立用户时指定的密码";

      $g_database_name = "mantis";

      增加以下几行

      $g_path = "http://www.yourdomain.com/mantis/";

      $g_icon_path = $g_path."images/";

      $g_absolute_path = "/解压缩的目录/mantis/";  #我在这里设置值为"/c:/mantis/";

      $g_use_iis = OFF; # 不使用IIS

      $g_show_version = OFF; # 不在页面下部显示 Mantis的版本号

      $g_default_language    ='chinese_simplified';# 默认语言为简体中文

      $g_show_project_menu_bar = ON;# 显示项目选择栏

      $g_show_queries_count   = OFF; # 在页脚不显示执行的查询次数

      $g_default_new_account_access_level = DEVELOPER; # 默认用户级别

      $g_use_jpgraph = ON; # 使用图形报表

      $g_window_title = 'Mantis Bug 跟踪管理系统'; # 浏览器标题

      $g_page_title = 'Mantis Bug 跟踪管理系统'; # 页面标题栏

      $g_enable_email_notification = ON; # 开通邮件通知

      $g_smtp_host = 'smtp.mail.net'; # SMTP 服务器

      $g_smtp_username = 'mailuser'; # 邮箱登录用户名

      $g_smtp_password = 'mailpwd'; # 邮箱登录密码

      $g_use_phpMailer = ON; # 使用 PHPMailer 发送邮件

      $g_phpMailer_path = 'C:/PHP/includes/PHPMailer/'; # PHPMailer 的存放路径

      $g_phpMailer_method = 2;             #PHPMailer以SMTP方式发送Email,设置成1将以sendmail方式发送

      $g_file_upload_ftp_server = 'ftp.yourftp.com'; # 上传文件 FTP

      $g_file_upload_ftp_user = 'ftpuser'; # FTP 登录用户名

      $g_file_upload_ftp_pass = 'ftppwd'; # FTP 登录密码

      $g_short_date_format = 'Y-m-d'; # 短日期格式,Y 大写表示 4 位年

      $g_normal_date_format ='Y-m-d H:i'; # 普通日期格式

      $g_complete_date_format ='Y-m-d H:i:s'; # 完整日期格式

      修改Apache的配置文件,Apache的配置文件位于Apache安装目录的conf目录中,文件名为httpd.conf。

      增加以下几行(供参考):

      Alias /mantis/ "/解压缩目录/mantis/"   #我的设置是Alias /mantis/ "/c:/mantis/"

      Options Indexes MultiViews Includes FollowSymLinks +ExecCGI

      AllowOverride None

      Order allow,deny

      Allow from all

      e)重新启动Apache服务

      重新启动Apache服务后,不出意外的话,访问http://localhost/mantis/将出现Mantis的登录页面。

      f)安装phpmailer

      我在网上看到一些文章,通过修改Mantis的配置文件指向phpmailer(config_inc.php),但是我在安装过程中修改了$ g_phpMailer_method也不能正常发送邮件,我的处理方法是直接覆盖Mantis目录下的phpmail目录(将下载的phpmailer 覆盖上去)。Mantis自带的phpmailer在发送邮件的时候有点问题,对一些SMTP服务器支持不是很好,所以要下载新版的phpmailer。如果想在WINDOWS下通过SENDMAIL进行发送,可以到http: //www.glob.com.au/sendmail/sendmail.zip下载Delphi开发的sendmail,还有原码。

      3.结束语

      安装Mantis过程并不难,主要是邮件发送的调试比较头痛。好了,Mantis的安装到此结束。最后提供一个bugzilla安装过程的一个链接http://glob.com.au/bugzilla/。

  • Selenium Reference

    2007-12-17 10:42:19

    一、  Commands (命令)

    • Action
      对当前状态进行操作
      失败时,停止测试
    • Assertion
      校验是否有产生正确的值
    • Element Locators
      指定HTML中的某元素
    • Patterns
      用于模式匹配

    1. Element Locators (元素定位器)

    • id=id
      id locator 指定HTML中的唯一id的元素 
    •  name=name
      name locator指定 HTML中相同name的元素中的第一个元素
    •  identifier=id
      identifier locator 首先查找HTML是否存在该id的元素, 若不存在,查找第一个该name的元素 
    • dom=javascrīptExpression
      dom locator用Javascrīpt表达式来定位HTML中的元素,注意必须要以"document"开头
      例如:
      dom=document.forms['myForm'].myDropdown
      dom=document.images[56]
    •  xpath=xpathExpression
      xpath locator用 XPath 表达式来定位HTML中的元素,必须注意要以"//"开头
      例如:
      xpath=//img[@alt='The image alt text']
      xpath=//table[@id='table1']//tr[4]/td[2]
    •  link=textPattern
      link locator 用link来选择HTML中的连接或锚元素
      例如:
      link=The link text
    • 在没有locator前序的情况下 Without a locator prefix, Selenium uses:
      如果以"document."开头,则默认是使用 dom locator,如果是以"//"开头,则默认使用xpath locator,其余情况均认作identifier locator

    2. String Matching Patterns (字符串匹配模式)

    • glob:patthern
      glob模式,用通配符"*"代表任意长度字符,"?"代表一个字符
    • regexp:regexp
      正则表达式模式,用Javascrīpt正则表达式的形式匹配字符串
    • exact:string
      精确匹配模式,精确匹配整个字符串,不能用通配符
    • 在没有指定字符串匹配前序的时候,selenium 默认使用golb 匹配模式

    3. Select Option Specifiers (Select选项指定器)

    • label=labelPattern
      通过匹配选项中的文本指定选项
      例如:label=regexp:^[Oo]ther
    • value=valuePattern
      通过匹配选项中的值指定选项
      例如:value=other
    • id=id
      通过匹配选项的id指定选项
      例如: id=option1
    • index=index
      通过匹配选项的序号指定选项,序号从0开始
      例如:index=2
    • 在没有选项选择前序的情况下,默认是匹配选项的文本

    二、 Actions
    描述了用户所会作出的操作。
    Action 有两种形式: action和actionAndWait, action会立即执行,而actionAndWait会假设需要较长时间才能得到该action的相响,而作出等待,open则是会自动处理等待时间。

    • click
      click(elementLocator)
      - 点击连接,按钮,复选和单选框
      - 如果点击后需要等待响应,则用"clickAndWait"
      - 如果是需要经过Javascrīpt的alert或confirm对话框后才能继续操作,则需要调用verify或assert来告诉Selenium你期望对对话框进行什么操作。
      click aCheckbox  
      clickAndWait submitButton  
      clickAndWait anyLink  
    • open
      open(url)
      - 在浏览器中打开URL,可以接受相对和绝对路径两种形式
      - 注意:该URL必须在与浏览器相同的安全限定范围之内
      open /mypage  
      open http://localhost/  
    • type
       type(inputLocator, value)
      - 模拟人手的输入过程,往指定的input中输入值
      - 也适合给复选和单选框赋值
      - 在这个例子中,则只是给钩选了的复选框赋值,注意,而不是改写其文本
      type nameField John Smith
      typeAndWait textBoxThatSubmitsOnChange newValue
    • select
      select(dropDownLocator, optionSpecifier)
      - 根据optionSpecifier选项选择器来选择一个下拉菜单选项
      - 如果有多于一个选择器的时候,如在用通配符模式,如"f*b*",或者超过一个选项有相同的文本或值,则会选择第一个匹配到的值
      select  dropDown Australian Dollars
      select  dropDown index=0
      selectAndWait currencySelector value=AUD
      selectAndWait currencySelector label=Auslian D*rs
    •  goBack,close
      goBack()
      模拟点击浏览器的后退按钮
      close()
      模拟点击浏览器关闭按钮
    • selectWindow
      select(windowId)
      - 选择一个弹出窗口
      - 当选中那个窗口的时候,所有的命令将会转移到那窗口中执行
      selectWindow myPopupWindow  
      selectWindow null  
    • pause
      pause(millisenconds)
      - 根据指定时间暂停Selenium脚本执行
      - 常用在调试脚本或等待服务器段响应时
      pause 5000  
      pause 2000  
    • fireEvent
       fireEvent(elementLocatore,evenName)
      模拟页面元素事件被激活的处理动作
      fireEvent textField focus
      fireEvent dropDown blur
    • waitForCondition
      waitForCondition(JavascrīptSnippet,time)
      - 在限定时间内,等待一段Javascrīpt代码返回true值,超时则停止等待
      waitForCondition var value=selenium.getText("foo"); value.match(/bar/); 3000
    • waitForValue
      waitForValue(inputLocator, value)
      - 等待某input(如hidden input)被赋予某值,
      - 会轮流检测该值,所以要注意如果该值长时间一直不赋予该input该值的话,可能会导致阻塞
      waitForValue finishIndication isfinished
           
    • store,stroreValue
      store(valueToStore, variablename)
      保存一个值到变量里。
      该值可以由自其他变量组合而成或通过Javascrīpt表达式赋值给变量
      store Mr John Smith fullname
      store $.{title} $.{firstname} $.{suname} fullname
      store javascrīpt.{Math.round(Math.PI*100)/100} PI
      storeValue inputLocator variableName

      把指定的input中的值保存到变量中

      storeValue userName userID
      type userName $.{userID}
    • storeText, storeAttribute
      storeText(elementLocator, variablename)
      把指定元素的文本值赋予给变量
      storeText currentDate expectedStartDate
      verifyValue startDate $.{expectedStartDate}

      storeAttribute(.{}elementLocator@attributeName,variableName.{)
      把指定元素的属性的值赋予给变量

      storeAttribute input1@class  classOfInput1
      verifyAttribute input2@class $.{classOfInput1}
    • chooseCancel.., answer..
      chooseCancelOnNextConfirmation()
      - 当下次Javascrīpt弹出confirm对话框的时候,让selenium选择Cancel
      - 如果没有该命令时,遇到confirm对话框Selenium默认返回true,如手动选择OK按钮一样
      chooseCancelOnNextConfirmation     

      - 如果已经运行过该命令,当下一次又有confirm对话框出现时,也会同样地再次选择Cancel
      answerOnNextPrompt(answerString)
      - 在下次Javascrīpt弹出prompt提示框时,赋予其anweerString的值,并选择确定

      answerOnNextPrompt Kangaroo  

    三、 Assertions
    允许用户去检查当前状态。两种模式: Assert 和 Verify, 当Assert失败,则退出测试;当Verify失败,测试会继续运行。

    • assertLocation, assertTitle
      assertLocation(relativeLocation)
      判断当前是在正确的页面
      verifyLocation /mypage  
      assertLocation /mypage  
    • assertTitle(titlePattern)
      检查当前页面的title是否正确
      verifyTitle My Page  
      assertTitle My Page  
    • assertValue
      assertValue(inputLocator, valuePattern)
      - 检查input的值
      - 对于 checkbox或radio,如果已选择,则值为"on",反之为"off"
      verifyValue nameField John Smith
      assertValue document.forms[2].nameField John Smith
    • assertSelected, assertSelectedOptions
      assertSelected(selectLocator, optionSpecifier)
      检查select的下拉菜单中选中的选型是否和optionSpecifer(Select选择选项器)的选项相同
      verifySelected dropdown2 John Smith
      verifySelected dorpdown2 value=js*123
      assertSelected document.forms[2].dropDown label=J*Smith
      assertSelected document.forms[2].dropDown index=0
    • assertSelectOptions(selectLocator, optionLabelList)
      - 检查下拉菜单中的选项的文本是否和optionLabelList相同
      - optionLabelList是以逗号分割的一个字符串
      verifySelectOptions dropdown2 John Smith,Dave Bird
      assertSelectOptions document.forms[2].dropdown Smith,J,Bird,D
    • assertText
      assertText(elementLocator,textPattern)
      - 检查指定元素的文本
      - 只对有包含文本的元素生效
      - 对于Mozilla类型的浏览器,用textContent取元素的文本,对于IE类型的浏览器,用innerText取元素文本
      verifyText statusMessage Successful
      assertText //div[@id='foo']//h1 Successful
    • assertTextPresent, assertAttribute
      assertTextPresent(text)
      检查在当前给用户显示的页面上是否有出现指定的文本
      verifyTextPresent You are now logged in  
      assertTextPresent You are now logged in  
    • assertAttribute(.{}elementLocator@attributeName.{, ValuePattern)
      检查当前指定元素的属性的值
      verifyAttribute txt1@class bigAndBlod
      assertAttribute document.images[0]@alt alt-text
      verifyAttribute //img[@id='foo']/alt alt-text
    • assertTextPresent, etc.
      assertTextPresent(text)
      assertTextNotPresent(text)
      assertElementPresent(elementLocator)
       verifyElementPresent   submitButton   
       assertElementPresent   //img[@alt='foo']    assertElementNotPresent(elementLocator)
    • assertTable
      assertTable(cellAddress, valuePattern)
      - 检查table里的某个cell中的值
      - cellAddress的语法是tableName.row.column, 注意行列序号都是从0开始
      verifyTable myTable.1.6 Submitted
      assertTable results0.2 13
    • assertVisible, nonVisible
      assertVisible(elementLocator)
      - 检查指定的元素是否可视的
      - 隐藏一个元素可以用设置css的'visibility'属性为'hidden',也可以设置'display'属性为'none'
      verfyVisible postcode  
      assertVisible postcode  
    • assertNotVisible(elementLocator)
       verfyNotVisible   postcode   
       assertNotVisible   postcode   
    • Editable, non-editable
      assertEditable(inputLocator)
      检查指定的input是否可以编辑
      verifyEditable shape  
      assertEditable colour  
    • assertNotEditable(inputLocator)
      检查指定的input是否不可以编辑
    • assertAlert
      assertAlert(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的alert对话框
      - alert产生的顺序必须与检查的顺序一致
      - 检查alert时会产生与手动点击'OK'按钮一样的效果。如果一个alert产生了,而你却没有去检查它,selenium会在下个action中报错。
      - 注意:Selenium 不支持 Javascrīpt 在onload()事件时 调用alert();在这种情况下,Selenium需要你自己手动来点击OK.
    • assertConfirmation
      assertConfirmation(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的confirmation对话框和alert情况一样,confirmation对话框也必须在它们产生的时候进行检查
      - 默认情况下,Selenium会让confirm() 返回true, 相当于手动点击Ok按钮的效果。你能够通过chooseCancelOnNextConfirmation命令让confirm()返回false.同样地,如果一个cofirmation对话框出现了,但你却没有检查的话,Selenium将会在下个action中报错
      - 注意:在Selenium的环境下,confirmation对话框框将不会再出现弹出显式对话框
      - 注意:Selenium不支持在onload()事件时调用confirmation对话框,在这种情况下,会出现显示confirmatioin对话框,并需要你自己手动点击。
    •  assertPrompt
      assertPrompt(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的Prompt对话框
      - 你检查的prompt的顺序Prompt对话框产生的顺序必须相同
      - 必须在verifyPrompt之前调用answerOnNextPrompt命令
      - 如果prompt对话框出现了但你却没有检查,则Selenium会在下个action中报错
      answerOnNextPrompt Joe  
      click id=delegate  
      verifyPrompt Delegate to who?  

    四、 Parameters and Variables
    参数和变量的声明范围由简单的赋值到Javascrīpt表达式赋值。
    Store,storeValue 和storeText 为下次访问保存值。
    在Selenium内部是用一个叫storeVars的map来保存变量名。

    • Variable Substitution 变量替换
      提供了一个简单的方法去访问变量,语法 $.{xxx}
      store Mr title
      storeValue nameField surname
      store $.{title} $.{suname} fullname
      type textElement Full name is: $.{fullname}
    •  Javascrīpt Evaluation Javascrīpt赋值
      你能用Javascrīpt来构建任何你所需要的值。
      这个参数是以javascrīpt开头,语法是 javascrīpt.{'with a trailing'}。
      可以通过Javascrīpt表达式给某元素赋值。
      store javascrīpt.{'merchant'+(new Date()).getTime()} merchantId
      type textElement javascrīpt.{storedVars['merchantId'].toUpperCase()}
    • Generating Unique values 产生唯一值.  
      问题:你需要唯一的用户名
      解决办法: 基于时间来产生用户名,如'fred'+(new Date().getTime())
  • Selenium Ajax

    2007-12-17 10:38:27

    翻译:SpringSide团队   转载请注明出处。

    匆匆一瞥 Selenium
        在典型的在线商店中,需要用户输入或选择众多步骤后才可以完成整个购物流程。作为web应用的开发者,你如何保证你程序的质量和正确性呢?如果能有办法测试你功能的正确性,那问题就迎刃而解了,但如何做到呢?
        Selenium 是一个由ThoughtWorks做的专门为web应用所做的非常有效的功能测试工具。Selenium 的 tests 直接在浏览器里跑,就像用户真的在操作一样。Selenium 可运行 Windows, Linux, 和 Macintosh 的各种浏览器, 如 Internet Explorer, Mozilla 和 Firefox。
        看看Selenium 的  online demo 。点击右上角的"All"按钮来启动运行test cases, 如无意其外,你将看到所有都是绿行。注意action的绿色是会比assertions浅的,这是因为他们测试的所有东西都只是verify或assert 命令。如果有一个assertion 失败了,则那行命令会变为红色,并且Selenium 会停止运行。如果verify 命令失败了,那行命令也会变为红色,但是不会让测试停下来。

        在 Selenium 中的Test suites 和 cases 实际上是由 HTML 写成的, 它们只是很简单的 HTML <table>s。 test suite 中没行都只是关联了一个test case, 例如:
    <tr><td><a href="MyTest.html" >MyTest</a></td></tr>
        test-case实际上是由 "Selenese" 写成的 HTML 文档,里面包有一个table,3个列,所有的命令最多只有两个参数,所以足够位置摆放。一个典型的test case像这样:

        当你开始运行测试 (例如 按 "All"按钮), Selenium 的 TestRunner 会自动解释 HTML 格式的 test-case, 并运行你的web应用,并在页面下方的框架中显示运行的情形。
    Selenium 允许你通过在浏览器里模拟用户的行为来进行测试。这当然不代表它可以代替unit-testing,只是我们通常会用它来进行web应用的功能测试。它也可以被加入持续继承测试(continuous-integration)中,作为常规的自动回归测试(regression testing)。如果想更深入了解Selenium, 请参看在线文档 "Selenium: Usage".

    开始测试 Ajax
        在你的web应用功能是用Javascrīpt实现时,Selenium 就显得极为有用了。
    Ajax, 是Asynchronous Javascrīpt and XML 的简称,是web应用中的一种web 交互技术。它可以实现在页面不需要刷新的情况下,在后台与服务器交互少量数据,并即时改变页面内容。这意味着网页看起来更实时,更有动态和更实用。

    Ajax 中指示正在"读取数据"的标签

        刚才那句话是对Ajax的技术定义,对于我们大多数人来说,Ajax意味着页面向GMail 或 Flickr 那样。当你点一个连接时,它不会产生页面刷新,而是页面会和服务器交互后返回来再更改一部分页面。在点击连接和看到结果之间延迟的这段时间,让测试看起来那么的棘手。
    让我们来假设我们的页面包含了一个text field 和一个 button。text field 的初始值是oldValue。 如果你点击button, Ajax就会启动,并把text field的值改为 "newValue", 而没有刷新任何页面。那我们怎么去测试它呢? 你会很自然的去打开页面, 点击button, 然后检查text field。但是你在Selenium中的这个test case失败了!

        测试失败的原因也许并不明显。这个意外的发生是因为Ajax的异步性,它并不会马上从服务器上得到结果。所以当你按下button时,Selenium 就开始马上检查是否有改变值。Selenium 并不知道需要去等待结果。那我们如何去让这个测试在Ajax下生效呢?
        我们如何去让Selenium 等待返回的结果呢? 有些人认为解决这个问题的办法是用 clickAndWait 命令来代替 click 命令;但是在使用以 "AndWait" 为后序的命令时,Selenium 会等待页面刷新。但是明显的,页面不会刷新,这样就使得Selenium 永远在等待了。明显这个方法行不通。
    另外一个方法是在 click assertValue 之间加入暂停时间。让它暂停5秒,让服务器有足够的时间返回相应。这种方法在大多数时候是可行的,但是如果服务器相应时间大于5秒,如网速很慢,测试机重启等的时候,就会失败了。你或许会加大等待时间来保证更正确,但是这样明显会使得你的测试越来越慢。所以明显的这个办法并没有按需而慢下拉,所以这也不是最佳的解决办法。
        幸运的是,Selenium 现在已经提供了这种我们非常需要的技术支持。当field 的值在单前页面改变时,你能用 waitForValue 命令去让 Selenium 等待到这个期望值出现为止。
        所以为了让刚才的失败的测试通过,你需要把它其中的assertValue 命令改变如下:

        当执行这个命令的时候, Selenium 会暂停执行当前的test case 和等待所期待的值。当新的值 "newValue" 出现在 text field 时, 测试再次开始。但你需要注意的是,如果你写错期望值了, 那 Selenium 将会等待这个值30分钟。
        就如你想到的那样,Selenium 已经提供了很多测试Ajax 效果的命令。例如,如果你想等待某些文本会在页面上出现,那你可用waitForText 命令;如果你想检查当前页面的Title是否有改变,则用waitForTitle;  如果你想检查某个 HTML 元素是否有在页面中被移除,应用 waitForElementNotPresent 命令。 实际上,对于每个Selenium Accessor, 都会有相应的 waitForXxxxwaitForNotXxxx 命令。当你用 verifyXxxx or assertXxxx 去检查某些东西时,总可以有 waitForXxxx 去测试异步效果。
    如果预先确定了 waitForXxxxwaitForNotXxxx 命令但又达不到预期,那会怎样呢? 对于这种情况,我们有waitForCondition 命令去指定一个Javascrīpt 的真假表达式(Boolean expression), 然 Selenium 去等待表达式的值为true为止。waitForCondition 命令的格式是

    waitForCondition scrīpt timeout (in ms)

    这样在测试复杂的 Ajax 效果时就更为便捷了。

        实际上如果你深入研究 Selenium 的 source code 的话, 你会发现所有前序为 waitForXxxxwaitForNotXxxx 的命令都是继承了waitForCondition 的。 Grig Gheorghiu 写了一篇关于这方面的blog: Ajax testing with Selenium using waitForCondition. 当他写这篇文章时,waitForCondition 仅仅是用户自己扩展Selenium, 现在已经成为Selenium 核心代码的一部分了。

    总结
        在这篇简短的文章中, 我们介绍了Selenium,一个web应用测试工具。同样地,我们也讨论了如何去用waitForXxxx 命令来测试 Ajax 应用,也演示了如何用 Selenium 去测试一些Ajax 异步效果。
        如果你想知道更多有关于 waitForXxxx 命令, Selenium 的开发者提供了一些简单的测试例子 演示了如何测试 Ajax, 如编辑替换,自动填充和拖拉效果等。这些例子是基于scrīpt.aculo.us, 来做的, 它是大家都非常熟悉的 Ajax library- prototype.js的子项目。

    (自 http://www.infoq.com/articles/testing-ajax-selenium , cac译。注:之前也翻译了一篇很详细的 Selenium文档, 见Selenium中文手册: http://wiki.springside.org.cn/display/springside/SeleniumReference )

  • Selenium Ajax

    2007-12-17 10:30:21

    翻译:SpringSide团队   转载请注明出处。

    匆匆一瞥 Selenium
        在典型的在线商店中,需要用户输入或选择众多步骤后才可以完成整个购物流程。作为web应用的开发者,你如何保证你程序的质量和正确性呢?如果能有办法测试你功能的正确性,那问题就迎刃而解了,但如何做到呢?
        Selenium 是一个由ThoughtWorks做的专门为web应用所做的非常有效的功能测试工具。Selenium 的 tests 直接在浏览器里跑,就像用户真的在操作一样。Selenium 可运行 Windows, Linux, 和 Macintosh 的各种浏览器, 如 Internet Explorer, Mozilla 和 Firefox。
        看看Selenium 的  online demo 。点击右上角的"All"按钮来启动运行test cases, 如无意其外,你将看到所有都是绿行。注意action的绿色是会比assertions浅的,这是因为他们测试的所有东西都只是verify或assert 命令。如果有一个assertion 失败了,则那行命令会变为红色,并且Selenium 会停止运行。如果verify 命令失败了,那行命令也会变为红色,但是不会让测试停下来。

        在 Selenium 中的Test suites 和 cases 实际上是由 HTML 写成的, 它们只是很简单的 HTML <table>s。 test suite 中没行都只是关联了一个test case, 例如:
    <tr><td><a href="MyTest.html" >MyTest</a></td></tr>
        test-case实际上是由 "Selenese" 写成的 HTML 文档,里面包有一个table,3个列,所有的命令最多只有两个参数,所以足够位置摆放。一个典型的test case像这样:

        当你开始运行测试 (例如 按 "All"按钮), Selenium 的 TestRunner 会自动解释 HTML 格式的 test-case, 并运行你的web应用,并在页面下方的框架中显示运行的情形。
    Selenium 允许你通过在浏览器里模拟用户的行为来进行测试。这当然不代表它可以代替unit-testing,只是我们通常会用它来进行web应用的功能测试。它也可以被加入持续继承测试(continuous-integration)中,作为常规的自动回归测试(regression testing)。如果想更深入了解Selenium, 请参看在线文档 "Selenium: Usage".

    开始测试 Ajax
        在你的web应用功能是用Javascrīpt实现时,Selenium 就显得极为有用了。
    Ajax, 是Asynchronous Javascrīpt and XML 的简称,是web应用中的一种web 交互技术。它可以实现在页面不需要刷新的情况下,在后台与服务器交互少量数据,并即时改变页面内容。这意味着网页看起来更实时,更有动态和更实用。

    Ajax 中指示正在"读取数据"的标签

        刚才那句话是对Ajax的技术定义,对于我们大多数人来说,Ajax意味着页面向GMail 或 Flickr 那样。当你点一个连接时,它不会产生页面刷新,而是页面会和服务器交互后返回来再更改一部分页面。在点击连接和看到结果之间延迟的这段时间,让测试看起来那么的棘手。
    让我们来假设我们的页面包含了一个text field 和一个 button。text field 的初始值是oldValue。 如果你点击button, Ajax就会启动,并把text field的值改为 "newValue", 而没有刷新任何页面。那我们怎么去测试它呢? 你会很自然的去打开页面, 点击button, 然后检查text field。但是你在Selenium中的这个test case失败了!

        测试失败的原因也许并不明显。这个意外的发生是因为Ajax的异步性,它并不会马上从服务器上得到结果。所以当你按下button时,Selenium 就开始马上检查是否有改变值。Selenium 并不知道需要去等待结果。那我们如何去让这个测试在Ajax下生效呢?
        我们如何去让Selenium 等待返回的结果呢? 有些人认为解决这个问题的办法是用 clickAndWait 命令来代替 click 命令;但是在使用以 "AndWait" 为后序的命令时,Selenium 会等待页面刷新。但是明显的,页面不会刷新,这样就使得Selenium 永远在等待了。明显这个方法行不通。
    另外一个方法是在 click assertValue 之间加入暂停时间。让它暂停5秒,让服务器有足够的时间返回相应。这种方法在大多数时候是可行的,但是如果服务器相应时间大于5秒,如网速很慢,测试机重启等的时候,就会失败了。你或许会加大等待时间来保证更正确,但是这样明显会使得你的测试越来越慢。所以明显的这个办法并没有按需而慢下拉,所以这也不是最佳的解决办法。
        幸运的是,Selenium 现在已经提供了这种我们非常需要的技术支持。当field 的值在单前页面改变时,你能用 waitForValue 命令去让 Selenium 等待到这个期望值出现为止。
        所以为了让刚才的失败的测试通过,你需要把它其中的assertValue 命令改变如下:

        当执行这个命令的时候, Selenium 会暂停执行当前的test case 和等待所期待的值。当新的值 "newValue" 出现在 text field 时, 测试再次开始。但你需要注意的是,如果你写错期望值了, 那 Selenium 将会等待这个值30分钟。
        就如你想到的那样,Selenium 已经提供了很多测试Ajax 效果的命令。例如,如果你想等待某些文本会在页面上出现,那你可用waitForText 命令;如果你想检查当前页面的Title是否有改变,则用waitForTitle;  如果你想检查某个 HTML 元素是否有在页面中被移除,应用 waitForElementNotPresent 命令。 实际上,对于每个Selenium Accessor, 都会有相应的 waitForXxxxwaitForNotXxxx 命令。当你用 verifyXxxx or assertXxxx 去检查某些东西时,总可以有 waitForXxxx 去测试异步效果。
    如果预先确定了 waitForXxxxwaitForNotXxxx 命令但又达不到预期,那会怎样呢? 对于这种情况,我们有waitForCondition 命令去指定一个Javascrīpt 的真假表达式(Boolean expression), 然 Selenium 去等待表达式的值为true为止。waitForCondition 命令的格式是

    waitForCondition scrīpt timeout (in ms)

    这样在测试复杂的 Ajax 效果时就更为便捷了。

        实际上如果你深入研究 Selenium 的 source code 的话, 你会发现所有前序为 waitForXxxxwaitForNotXxxx 的命令都是继承了waitForCondition 的。 Grig Gheorghiu 写了一篇关于这方面的blog: Ajax testing with Selenium using waitForCondition. 当他写这篇文章时,waitForCondition 仅仅是用户自己扩展Selenium, 现在已经成为Selenium 核心代码的一部分了。

    总结
        在这篇简短的文章中, 我们介绍了Selenium,一个web应用测试工具。同样地,我们也讨论了如何去用waitForXxxx 命令来测试 Ajax 应用,也演示了如何用 Selenium 去测试一些Ajax 异步效果。
        如果你想知道更多有关于 waitForXxxx 命令, Selenium 的开发者提供了一些简单的测试例子 演示了如何测试 Ajax, 如编辑替换,自动填充和拖拉效果等。这些例子是基于scrīpt.aculo.us, 来做的, 它是大家都非常熟悉的 Ajax library- prototype.js的子项目。

    (自 http://www.infoq.com/articles/testing-ajax-selenium , cac译。注:之前也翻译了一篇很详细的 Selenium文档, 见Selenium中文手册: http://wiki.springside.org.cn/display/springside/SeleniumReference )

  • 如何使用Firefox浏览器插件Selenium IDE

    2007-12-17 09:19:09

     (一)系统环境:

    1. Windows XP 或者 Windows 2000 或者 *nix
    2. 浏览器 Firefox 1.5.0.1
    3. 下载我们的本讲座软件selenium_simple.zip,这是可选的。
    4. Ruby 语言1.8.2版本
    5. Rails 框架1.0.0版本
    6. SQLite 数据库3.3.3版本
    7. 下载 sqlite-3_3_3.zip sqlitedll-3_3_3.zip
      解压它们,得到文件sqlite3.exe和sqlite3.dll;
      复制它们到目录[RUBY_HOME]/bin下面;
    8. SQLite-Ruby 数据库接口1.1.0版本
      如下命令安装该模块是针对SQLite 3.x版本:
      gem install sqlite3-ruby -r
    9. Notepad2 开发编辑工具

     (二)前提条件:

    1. 需要安装Firefox浏览器插件Selenium IDE 0.7.2

     (三)目的:

    1. 利用Firefox浏览器插件Selenium IDE 0.7.2,自动生成一系列软件的测试文件,以便我们在Rails框架下的应用软件或者其它软件使用。

     (四)解决方案:

    1. 如果您下载了我们上面的软件,那么您解压该软件,进入含有文件README的目录,接着执行如下命令:
      ruby scrīpt\server

    2. 输入一个网站的地址,例如:
      http://127.0.0.1:3000/admin

    3. 打开Firefox浏览器插件Selenium IDE,如下图所示:
    4. 此时,看到了一个测试文件的记录器:

    5. 我们点击浏览器上的链接或者输入内容,该记录器自动记录了我们一切活动内容:
    6. 如果我们的记录过程结束,那么点击记录器右上角的圆点,让它停止记录:
    7. 打开菜单,看到该记录器存在两种记录方法,我们此次使用HTML,如何使用Ruby记录以后用实例再说。
    8. 打开菜单,存储我们在浏览器的活动记录:
    9. 在存储前,给定文件名称:
    10. 使用任何文字编辑器,打开该文件:

     (四)参考资料:

    1. 首页selenium
      http://www.openqa.org/selenium/
    2. 安装Firefox插件: Selenium IDE 0.7.2
      https://addons.mozilla.org/extensions/moreinfo.php?id=2079&application=firefox
  • 初涉Selenium-使用指南

    2007-12-17 09:00:28

    功能测试,也叫测试,是测试粒度比大的一种测试方法。主要用于QA等人员进目功能的最后收用。
    目前市面上功能最的要Mercury Quanlity Center,最不爽的就是人家是收的,用正版的吧,太,搞个破解版的吧,内心又不安,嘿嘿。有没有既Free又好用的测试工具呢,可以肯定的,没有。为开目中的Tools都是重于某一方面,而不像商业软件那全面,但是,我往往需要的功能也就是某一方面,正中下怀经过寻找、比。最终发现Selenium算是一个非常不测试工具。发现国内在方面的文章不多,特写出一篇。

    Selenium共有三个东东组成,分Selenium IDESelenium CoreSelenium remote controlSelenium  RC),以及专门用于Rails Selenium on Rails。下面分之:

    Selenium IDE

    Selenium IDE
    是用于FireFox的一个插件,目前的最新版本0.8.6。最重要的一点就是使用东东可以生成一些脚本代这样就不用手工写了,直接出即可。
    地址http://www.openqa.org/selenium-ide
    之后是一个selenium-ide-0.8.6.xpi的文件,然后,打FireFox,将此文件直接拖入FireFox即可自安装,安装成功后,你会看到如下所示。




    ,打Selenium IED插件,置好Base URL,然后使如下所示的点是按下状就可以制了。



    在你随便点了几个接之后,就可以看到下Command象里就多出了很多代些就是才我们录制的西,此,你可以点如下绿图标,就可以回放我们刚才的操作了。Enjoy It



    Selenium Core

    Selenium Core
    是一个模的可以直接在浏览器中运行的东东,只要他命令,他就可以像真人一样进行操作,由于其全部采用Javascrīpt实现,因此可以在 Windows, Linux,  Macintosh平台的IEMozillaFireFox浏览器中运行。这样,不可以用于功能测试顺带还测试了各平台的兼容性。而由于JS受同址安全策略的限制,其只能对单测试,不能接到其他网站,也不能httpshttp的切。而由于其命令简单,不需要太多的经验,极其适合黑盒测试
    地址http://www.openqa.org/selenium-core/

    之后,你可以放在自己开发器下面(不是必,只是了方便才这样做),然后打子如下



    边单击GO就可以打你的测试套件,右有四个按,分是全部行,中,停,单步。下行了Test Mouse Events测试用例。



    Selenium  RC


    最后我一下Selenium remote controlSelenium RC提供一个Selenim Server,其实这就是一个用于欺JS的代理服器,搭建好服器之后,我就可以使用成模式来运行Selenium Core了,我想就是我程序的最了,可以用于业务,非常适合白盒测试。支持的言有 查看(1351) 评论(1) 收藏 分享 管理

  • Selenium使用介绍

    2007-12-14 17:14:32

    Selenium 是 thoughtworks公司的一个集成测试的强大工具。最近参与了一个系统移植的项目,正好用到这个工具,

    把一些使用心得分享给大家,希望大家能多多使用这样的强大的,免费的工具,来保证我们的质量。

    Selenium 的文档现存的不少,不过都太简单了。使用Selenium的时候,我更多的是直接去看API文档,好在API不错,

    一个一个看,就能找到所需要的 :-)   官方网站:http://www.openqa.org/selenium/

    好,下面进入正题!

    一、Selenium 的版本

    Selenium 现在存在2个版本,一个叫 selenium-core, 一个叫selenium-rc 。

    selenium-core 是使用HTML的方式来编写测试脚本,你也可以使用 Selenium-IDE来录制脚本,但是目前Selenium-IDE
    只有 FireFox 版本。

    Selenium-RC 是 selenium-remote control 缩写,是使用具体的语言来编写测试类。

    selenium-rc 支持的语言非常多,这里我们着重关注java的方式。这里讲的也主要是 selenium-rc,因为个人还是喜欢这种
    方式 :-)

     二、一些准备工作

    1、当然是下载 selenium 了,到 http://www.openqa.org/selenium/ 下载就可以了,记得选择selenium-rc 的版本。

    2、学习一下 xpath 的知识。有个教程:http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html
         一定要学习这个,不然你根本看不懂下面的内容!

    3、安装 jdk1.5

     三、selenium-rc 一些使用方法

    selenium-remote-control-0.9.0\server 目录里,我们运行 java -jar selenium-server.jar
    之后你就会看到一些启动信息。要使用 selenium-rc ,启动这个server 是必须的。

    当然,启动的时候有许多参数,这些用法可以在网站里看看教程,不过不加参数也已经足够了。

    selenium server 启动完毕了,那么我们就可以开始编写测试类了!

    我们先有个概念,selenium 是模仿浏览器的行为的,当你运行测试类的时候,你就会发现selenium 会打开一个

    浏览器,然后浏览器执行你的操作。

     好吧,首先生成我们的测试类:

    java 代码
    1. public class TestPage2 extends TestCase {   
    2.   private Selenium selenium;   
    3.   
    4.   protected void setUp() throws Exception {   
    5.      String url = “http://xxx.xxx.xxx.xxx/yyy”;   
    6.      selenium = new DefaultSelenium("localhost", SeleniumServer.getDefaultPort   
    7.                                 (), "*iexplore", url);   
    8.      selenium.start();   
    9.                
    10.      super.setUp();                        
    11.            
    12.   }   
    13.   
    14.   protected void tearDown() throws Exception {   
    15.            
    16.       selenium.stop();   
    17.       super.tearDown();   
    18.                
    19.   
    20.   }   
    21.   
    22. }  

    代码十分简单,作用就是初始化一个 Selenium 对象。其中:
    url : 就是你要测试的网站
    localhost:  可以不是localhost,但是必须是 selenium server 启动的地址
    *iexplore :  可以是其它浏览器类型,可以在网站上看都支持哪些。

    下面我就要讲讲怎么使用selenium 这个对象来进行测试。

    1、测试文本输入框

    假设页面上有一个文本输入框,我们要测试的内容是 在其中输入一些内容,然后点击一个按钮,看看页面的是否跳转
    到需要的页面。

    1. public void test1() {   
    2.            
    3.     selenium.open("http://xxx.xxx.xxx/yyy");   
    4.            
    5.     selenium.type("xpath=//input[@name='userID']""test-user");   
    6.     selenium.click("xpath=//input[@type='button']");   
    7.     selenium.waitForPageToLoad("2000");   
    8.     assertEquals(selenium.getTitle(), "Welcome");   
    9. }  

    上面的代码是这个意思:
    1、调用 selenium.open 方法,浏览器会打开相应的页面
    2、使用 type 方法来给输入框输入文字
    3、等待页面载入
    4、看看新的页面标题是不是我们想要的。

    2、测试下拉框

    java 代码
    1. public void test1() {       
    2.                
    3.     selenium.open("http://xxx.xxx.xxx/yyy");       
    4.                
    5.     selenium.select("xpath=//SELECT[@name='SBBUSYO']""index=1");   
    6.     selenium.click("xpath=//input[@type='button']");       
    7.     selenium.waitForPageToLoad("2000");       
    8.     assertEquals(selenium.getTitle(), "Welcome");       
    9. }     

    可以看到,我们可以使用 select 方法来确定选择下拉框中的哪个选项。
    select 方法还有很多用法,具体去看看文档吧。

    3、测试check box

    java 代码

    1. public void test1() {           
    2.                    
    3.     selenium.open("http://xxx.xxx.xxx/yyy");           
    4.                    
    5.     selenium.check("xpath=//input[@name='MEICK_000']");     
    6.     selenium.click("xpath=//input[@type='button']");           
    7.     selenium.waitForPageToLoad("2000");           
    8.     assertEquals(selenium.getTitle(), "Welcome");           
    9. }      

    我们可以使用 check 方法来确定选择哪个radio button

    4、得到文本框里的文字

    java 代码
    1. assertEquals(selenium.getValue("xpath=//input[@name='WNO']"), "1");  

    getValue 方法就是得到文本框里的数值,可不是 getText 方法,用错了可就郁闷了。

    5、判断页面是否存在一个元素

    java 代码
    1. assertTrue(selenium.isElementPresent("xpath=//input[@name='MEICK_000']"));  

    一般这个是用来测试当删除一些数据后,页面上有些东西就不会显示的情况。

    6、判断下拉框里选择了哪个选项

    java 代码
    1. assertEquals(selenium.getSelectedIndex("xpath=//SELECT[@name='HATIMING']"), "1");  

    这个可以用来判断下拉框显示的选项是否是期望的选项。

    7、如果有 alert 弹出对话框怎么办?

    这个问题弄了挺长时间,可以这样来关闭弹出的对跨框:

    java 代码
    1. if(selenium.isAlertPresent()) {   
    2.   
    3.    selenium.getAlert();   
    4.   
    5. }  

    其实当调用 selenium.getAlert() 时,就会关闭 alert 弹出的对话框。
    也可以使用 System.out.println(selenium.getAlert()) 来查看对跨框显示的信息。

    在测试的时候,有的人会显示许多alert 来查看运行时的数据,那么我们可以用下面的方式来关闭那些 alert:

    java 代码
    1. while(selenium.isAlertPresent()) {       
    2.       
    3.    selenium.getAlert();       
    4.       
    5. }   

    8、如何测试一些错误消息的显示?

    java 代码
    1. assertTrue(selenium.getBodyText().indexOf("错误消息")>=0);  

    切记: getBodyText 返回的时浏览器页面上的文字,不回包含html 代码的,如果要显示html 代码,用下面这个:

    java 代码
    1. System.out.println(selenium.getHtmlSource());  

    以上就是最常用的几个方法了,例如 click, type, getValue 等等。
    还有就是一定要学习 xpath, 其实xpath 也可以有“与、或、非”的操作:

    java 代码
    1. selenium.check("xpath=//input[(@name='KNYKBN')and(@value='Y')]");  

    四、其他

    selenium 还有更多的用法,例如弹出页面等等。当面对没见过的测试要求时,我最笨的方法就是按照api文档一个一个找,
    好在不多,肯定能找到。

  • 用Selenium测试web应用

    2007-12-14 15:34:41

    问题1:当用户在网上商店购物时,一次完整的购买流程需要用户进行好几个步骤的操作(包括选择商品、填写订单信息、选择支付方式、确认订单等),涉及四到五个页面以及数十个类的协作。如何在开发过程中始终确保该流程能够正确无误、畅通无碍?

    问题2:客户提出需求:在显示货物列表时,应该首先按货物名称排序,名称相同的货物再按照价格排序。我们已经实现了这一功能,并且有单元测试作为保障,但如何让客户看到我们的成果?

    问题3:美工在制作页面时,一不小心把一个<form>id属性删掉了。几天之后,另一个页面上的Javascrīpt莫名其妙地失效,我们花了很多时间才发现这个问题。应该如何避免类似的情况再次发生?

    这三个问题对于做惯了web应用的读者来说一定不陌生——实际上,我们的每个项目都或多或少地遇到类似的问题。说穿了,这三个问题都是关于同一件事情:如何验证一个东西是正确的,以及如何便利而自动地重复这一验证过程。在代码层面上,xUnit单元测试工具(对于J2EE项目,就是Junit)给了我们帮助。但是,当问题涉及到web界面和用户交互时,JUnit就显得有些力不从心了,这也是很多采用测试驱动开发(TDD)方法的团队只能把TDD贯彻到web controller层面的原因。

    单元测试 vs. 功能测试

    正如它的名字所揭示的,JUnit是一个单元测试工具。而我们在前面提出的三个问题,实际上已经属于功能测试(functional test)或者验收测试(acceptance test)的范畴。尽管单元测试能够保证各个单元的正确,却无法确保将这些单元组合起来之后的效果。需要依靠功能测试工具,我们才能继续TDD的脚步。

    另一方面,功能测试在很多时候应该由客户——或者是具有一定技术背景的客户代表(可能是项目的需求分析师)——来编写的(这也是“验收测试”这个名称的由来:通过这些测试就代表工作通过验收),因此编写这些测试不应该要求太高的编程能力。在这一点上,JUnit也是令人望而生畏的。

    ThoughtWorks员工开发并维护的Seleniumhttp://selenium.thoughtworks.com)正是帮助我们解决上述问题的得力工具。简单地说,Selenium是一个自动化的web应用功能测试工具——我知道,这个短语不足以让读者了解它所描述的对象。所以,在进一步介绍之前,我想先请读者来看一个活生生的例子。请打开你的浏览器,访问下列URL地址:

    http://www.openqa.org/selenium/demo1/TestRunner.html

    你将会看到Selenium的主操作界面(如图1)。可以看到,整个页面被分成四个部分。左上角的“Test Suite”区域显示出当前运行的测试套件包含哪些测试用例;中间上部的“Current Test”区域显示出当前执行的测试用例;右上角的“Control Panel”区域是给用户操作的区域。至于下面的一大片空间,它会在执行测试的过程中起到重要的作用,我们稍后就会看到。

    <!--[if !vml]--><!--[endif]-->

    1Selenium主界面

    点击“Control Panel”区域中的“All”按钮,读者会——或许有点惊讶地——发现,屏幕上的文字和颜色开始飞快地发生变化。如果你还没有明白这是怎么回事,可以先把按钮上方的单选按钮放在“walk”上,然后再点击按钮。这时你会清楚地看到,原来Selenium正在逐个运行套件中的测试用例:执行测试用例中指定的操作,并进行指定的条件判断。至于屏幕下方的大块空白区域,此刻正在模拟着实际的用户操作。而那些淡绿色的横条,熟悉JUnit的你应该不难猜到,正是测试通过的象征——看到这些绿色横条让你感到心情愉悦,不是吗?

    <!--[if !vml]--><!--[endif]-->

    2:测试套件执行完毕

    读者可以看到,“Control Panel”区域中还显示着本次测试的相关信息:耗时10秒,执行3个测试用例,共有10个判断条件,所有测试都通过,没有失败或未完成的测试。此外,如果点选一个测试用例,再点击“Selected”按钮,就可以单独运行这一个测试用例;如果选中“Step”选项,就可以进行单步跟踪运行。这些功能,相信聪明的读者只需要稍微尝试一下就会全部掌握了。

    经过几分钟的探索,读者应该能够明白这个Demo的奥妙所在了。没错,Selenium采用Javascrīpt来管理整个测试过程,包括读入测试套件、执行测试和记录测试结果——这在很大程度上得益于强大的Javascrīpt单元测试工具JSUnithttp://www.edwardh.com/jsunit/),正是有它的帮助,Selenium才能够模拟真实的用户操作,包括浏览页面、点击链接、输入文字、提交表单等等,并且能够对结果页面进行种种验证。也就是说,只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动运行的功能测试套件。而且,我们习惯的测试驱动开发方法也可以延伸到web表现层:我们可以先写测试、运行测试并看到它失败、然后编写功能代码让测试通过。

    现在,如果你已经对Selenium产生了兴趣,我将带领你开始真正的Selenium测试之旅。首先,请到以下地址下载最新版本的Selenium(当然,作为一个J2EE开发者,我假设你已经安装了JDKservlet容器譬如Tomcat):

    http://www.openqa.org/selenium/download.action

    Selenium的故事

    在等待下载的过程中,不妨先听我讲讲和Selenium有关的故事。正如我在前面提到过的,SeleniumThoughtWorks员工在业余时间开发并维护的开源项目,并且在ThoughtWorks的项目中被广泛应用。不过,真正有趣的是它名字的来历:在Selenium出现之前,最著名的web应用功能测试工具当属Mercury Quanlity Centerhttp://www.mercury.com/us/products/quality-center/),但那是一个商业工具,功能强大却也价格不菲,常常让开发者们又爱又恨。所以,自己动手开发开源功能测试工具的ThoughtWorker们把这个工具叫做Selenium——“mercury”有“水银”的意思,而“selenium”(硒元素)恰好是专解汞中毒的特效药。

    把下载的压缩包解压之后,你会得到两个目录:docselenium。只要把后者复制到你的web服务器根目录(对于Tomcat,就是webapps目录)下,就算是完成Selenium的安装了。安装好之后,可以启动web服务器,然后试着访问下列URL地址(假设你也像我一样,把Tomcat开在8080端口上):

    http://localhost:8080/selenium/TestRunner.html

    在这里,你应该又会看到那个熟悉的主操作界面(如图3)。不妨试着运行一下这些测试,看看它们是否能够在你本地的机器上正常运行。确认一切正常之后,我们再来编写自己的测试。

    <!--[if !vml]--><!--[endif]-->

    3:在本地运行Selenium

    缺省情况下,Selenium会从tests目录下的TestSuite.html文件加载测试套件,但我们也可以指定从别的文件加载。首先,我们在tests目录下创建一个MyTestSuite.html文件,然后在其中定义我们的测试套件:

    <html>

    <head>

    <title>My First Test Suite</title>

    </head>

    <body>

    <table cellpadding="1" cellspacing="1" border="1">

            <tbody>

                <tr><td><b>Test Suite</b></td></tr>

                <tr><td>

    <a href="./MyTests/TestHello.html">Test Say Hello</a>

    </td></tr>

            </tbody>

        </table>

    </body>

    </html>

    然后,在tests/MyTests目录下创建TestHello.html文件,在其中描述我们要做的动作和期望得到的结果:

    <html>

    <head>

      <title>Test Hello</title>

    </head>

    <body>

    <table cellpadding="1" cellspacing="1" border="1">

      <tbody>

        <tr>

          <td rowspan="1" colspan="3">Test Say Hello To World<br>

          </td>

        </tr>

        <tr>

          <td>open</td>

          <td>/sample/hello.jsp</td>

          <td>&nbsp;</td>

        </tr>

        <tr>

          <td>verifyTextPresent</td>

          <td>Hello, World!</td>

          <td>&nbsp;</td>

        </tr>

      </tbody>

    </table>

    </body>

    </html>

    测试套件和测试用例的写法都是一目了然的。在测试用例中,我们首先访问/sample/hello.jsp这个地址(open命令),然后验证页面上有“Hello, World!”字样存在(verifyTextPresent命令)。在Seleniumdoc目录下,你可以找到完整的命令帮助列表。现在访问http://localhost:8080/selenium/TestRunner.html?test=tests/MyTestSuite.html这个地址,应该就可以看到我们的测试套件,当然现在运行它会看到红色的失败信息。

    <!--[if !vml]--><!--[endif]-->

    4:运行我们的第一个测试,失败了

    熟悉TDD过程的读者现在不仅不会失望,反而会感到兴奋,因为这个失败的测试为我们指出了目标。为了让测试通过,我们可以创建一个名为sampleweb应用,在其中放上hello.jsp这个文件,让它向世界问好。然后,我们就可以享受成功的喜悦了。

    <!--[if !vml]--><!--[endif]-->

    5:我们的第一个Selenium测试通过了

    继续这个过程:编写测试--编写功能代码-绿……随着我们一步步前进,测试用例也会逐渐增加,最终构成一张庞大而严密的安全网。不仅是Java程序,在Selenium的帮助之下,界面的开发工作同样可以用TDD的方式来进行。而且,由于是架设在Javascrīpt的基础上,Selenium并不仅限于J2EE web应用的测试,实际上各种web应用都有它的用武之地。

    作为一篇简介,本文只能帮助读者对Selenium建立一个最基本的了解,更多的知识与技巧还有待读者去探索。譬如说,在持续集成的环境下,可以用Ant来驱动Selenium测试,并将测试结果汇报给CruiseControl,从而实现更加严格的集成管理。在下次的文章中,我将向读者介绍ThoughtWorks公司采用测试驱动开发的一些技巧与实践(当然也包括Selenium的使用心得)。现在,让我们先说再见吧,希望你编程愉快。
  • 设置jdk1.5-JAVA的环境变量

    2007-12-14 10:10:11

    Windows 下JAVA 用到的环境变量主要有3 个,JAVA_HOME、classpath、path。
    下面逐个分析。
    JAVA_HOME 指向的是JDK 的安装路径,如x:\JDK_1.5,在这路径下你应该
    能够找到bin、lib 等目录。

    值得一提的是,JDK 的安装路径可以选择任意磁盘
    目录,不过建议你放的目录层次浅一点,如果你放的目录很深,比如
    x:\XXXXXX\xxxxx\XXXX\xxxx\XXXX\xxxx\XXXX\xxx……
    那么,下面的步骤和以后的应用你都要受累了,呵呵。

    设置方法: 我的电脑-(右键)属性--高级--环境变量 的系统变量
    JAVA_HOME=x:\JDK_1.5 (如c:\jDK1.5----即JDK的安装目录)
    PATH 环境变量原来Windows 里面就有,你只需修改一下,使他指向JDK 的
    bin 目录,这样你在控制台下面编译、执行程序时就不需要再键入一大串路径了。
    设置方法是保留原来的PATH 的内容,并在其中加上%JAVA_HOME%\bin (注,如果
    你对DOS 批处理不了解,你可能不明白%%引起来的内容是什么意思;其实这里是
    引用上一步设定好的环境变量JAVA_HOME,你写成x:\JDK_1.5 也是可以的;
    你可以打开一个控制台窗口,输入echo %JAVA_HOME%来看一下你的设置结果) :
    PATH=%JAVA_HOME%\bin;%path%
    同样,%path%是引用以前你设置的PATH 环境变量,你照抄以前的值就行了。
    classpath 环境变量我放在最后面,是因为以后你出现的莫名其妙的怪问题
    80%以上都可能是由于classpath 设置不对引起的,所以要加倍小心才行。
    classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
    首先要注意的是最前面的".;",如果你看不清,我给你念念--句点分号。这个
    是告诉JDK,搜索CLASS 时先查找当前目录的class 文件--为什么这样搞,这
    是由于LINUX 的安全机制引起的,LINUX 用户很明白,WINDOWS 用户就很难理解(因
    为WINDOWS 默认的搜索顺序是先搜索当前目录的,再搜索系统目录的,再搜索
    path 环境变量设定的) ,所以如果喜欢盘根究底的朋友不妨研究一下LINUX。
    为什么classpath 后面指定了tools.jar 这个具体文件?不指定行不行?显然不
    行,行的话我还能这么罗索嘛!:) 这个是由java 语言的import 机制和jar 机
    制决定的,想了解的可以查资料解决。

    ==================

    最近将手上的项目(tomcat5.0+spring+struts)的jdk1.4升级到1.5的时候,出现了一堆的问题,经过不懈的努力和网上朋友的提示终于将问题解决了,现在记录如下
    1.java.lang.UnsupportedClassVersionError: com/mdcchina/userinfo/logic/UserManager (Unsupported major.minor version 49.0)提示如上的错误,很是郁闷
    经过研究和比较在两个不同环境下的编译运行,终于发现这个主要是由于我的机子上安装了两个不同版本的JDK导致的,我想很多的朋友在尝试新的JDK的时候,可能不会删除1.4的版本,但是要注意的是要将JAVA_HOME,CLASS_PATH,PATH等等的环境变量都修改成相关的JDK1.5的目录下面去,因为1.5相对于以前的版本的变化比较大.
    2.上面的问题排除后,在运行TOMCAT5.0时候由出现了如下的错误:
    2005-11-17 19:38:47 StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
    org.apache.jasper.JasperException: Unable to compile class for JSP

    Generated servlet error:
    C:\application\Tomcat 5.0\work\Catalina\localhost\mlinkweb\org\apache\jsp\layouts\layout_005findex_jsp.java:7: cannot access java.lang.Object


    Generated servlet error:
    bad class file: C:\application\Java\jdk1.5.0\jre\lib\rt.jar(java/lang/Object.class)
    class file has wrong version 49.0, should be 48.0
    Please remove or make sure it appears in the correct subdirectory of the classpath.
    public final class layout_005findex_jsp extends org.apache.jasper.runtime.HttpJspBase
                 ^
    1 error

    这个问题这是让我郁闷之极啊(^_^)
    最后在SUN的JAVA论坛里面找到了答案,只要将JDK1.5的LIB下面的TOOLS.JAR覆盖TOMCAT5.0目录/common/lib下面的tools.jar,然后重启TOMCAT5.0就可以了

  • 如何安装JDK,它和JRE有什么区别

    2007-12-14 09:58:26

     

    Sun公司提供了自己的Java开发环境,通常称之为JDK(Java Development Kit)。随着时间的推移和技术的进步,Java在继续向前发展,JDK的版本也在不断地升级,从最初的JDK1.0版本到目前最新的JDK5.0版本。每一次升级都会带来新的技术和更加丰富的类库。其中,JDK1.2版本标志着Java语言成熟的开始,为了和以前旧版本进行区别,这之后发布的JDK都称为Java 2,并正式命名为J2SDK(Java2 Software Development Kit)。Java 2支持更多的新特性,如:增加了Swing和集合框架,添加了关键字assert,新的基于通道的IO子系统,修改了网络类和线程类,同时也增强了Java虚拟机和各种编程工具等。当然,在新发布的Java 2,版本5.0中,又增加了新的功能,Sun公司提供了多种操作系统下的JDK下载,各种操作系统下的JDK的各种版本在使用上基本相似,我们可以根据自己的需要从Sun公司的官方网站(http://java.sun.com)上下载一个JDK的最新版本,如图0.2.1所示。

    或许你在下载的时候曾经感到疑惑,Sun公司的官方网站上怎么会提供那么多可以下载的链接呢?是不是网页中提供的每个开发套件都要下载才可以呢?当然不用,“NetBeans IDE+JDK5.0”是Sun公司将自己提供的IDE工具和JDK开发包捆绑在一起供程序员使用的,下载这个套件就可以同时拥有Java的集成开发工具和开发包。读者暂不用去考虑下载这组套件。因为一开始就使用IDE工具来进行Java程序的开发并不是一件很轻松的事情,反而会增加初学者学习的困难。建议读者仅下载JDK5.0这个开发工具包,如果你用的操作系统是Windows,那么选择“Download JDK for Windows”就可以了。

    此时,想必读者仍然会提出新的问题,因为读者从下载页面中还可以看到在JDK5.0下载套件下面,Sun公司还提供了一个JRE5.0的下载套件,这个套件是干什么用的呢?是不是它们都可以作为Java的开发包供程序员使用呢?这两者一定有所不同,否则Sun公司不会将两者区分开来。那么JDK和JRE两者到底有什么区别呢?

    图0.2.1  JDK下载界面

    其实,如果大家对Flash比较熟悉的话,就能很快明白它们的区别了。比如在Flash中,我们用Flash软件设计一个Flash程序,这个软件包就类似于Java中的JDK。如果需要在网页中观看Flash作品,则必须在浏览器中加上Flash的插件,浏览器和这个插件就类似于JRE。

    简单的说,JDK就是面向开发人员使用的软件开发工具包,它提供了Java的开发环境和运行环境。如果你下载并完全安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运行Java程序的平台。JRE(Java Runtime Enviroment)是指Java的运行环境,是面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。

    下面为读者演示JDK5.0的安装过程。

    首先运行从Sun公司官方网站上下载下来的JDK5.0程序压缩包,如图0.2.2所示。

    接着,选择接受使用许可书中的条款,并选择Next进入下一步,如图0.2.3所示。

    在定制安装(Custom Setup)界面中,我们可以设置需要安装的组件,这里面包含了开发工具包“Development Tools”、演示程序“Demos”、API库的源代码“Source Code”、以及包含了标准类库的运行时环境“Public JRE”4个组件。其中,除了“Development Tools”是必选的组件之外,其他3个都是可选的。此外,还可以在这个安装界面中设置Java开发。

    0.2.2  安装界面
    图0.2.3  许可书条款

    工具包安装到什么位置,默认情况下会安装到C:Program FilesJavajdk1.5.0_01目录下,如图0.2.4所示。为了便于将来使用开发工具包中的命令,Java的初学者可以修改这个路径,使其简单而且直接,如:安装路径可以设置为C:JDK。需要注意的是,如果读者使用的是JDK1.5以前的版本,那么默认安装路径会和JDK1.5有所不同,如:在安装JDK1.4.0工具包时的默认安装路径就是C:jdk1.4.0。

    接着,安装程序会开始安装我们设置好的组件,在安装到JRE时会提示如下界面,如图0.2.5所示。这个界面在JDK1.5.0以前的版本中是没有的,JDK的最新版在JRE中加入了对欧洲语言的更多的支持,正如在下图中看到的那样。此外,JRE的安装路径也是可以修改的,通常选择默认设置。

  • 几篇有关 Selenium 的文档

    2007-12-13 17:03:18

    几篇有关 Selenium 的文档

    有兴趣的可以看看,Selenium 是一个不错的 Web 自动化测试框架。

    看了这篇才知道原来自动化测试可以这么玩,佩服这些鬼佬的创造力 ^_^
    http://www.google.com/url?sa=t&ct=res&cd=3&url=http%3A%2F%2Fwww.digitalfocus.com%2F_assets%2Fdownload%2FAutomated_Functional_Testing_with_Selenium.pdf&ei=Jq_uRLKAHI6ysALG5MG3BA&sig2=AJWTzbq0oMBgaPF7ksnGBg#

    一个详细 Selenium 的 PPT
    http://www.google.com/url?sa=t&ct=res&cd=12&url=http%3A%2F%2Fwww.nealford.com%2Fdownloads%2Fconferences%2F2006_nfjs_canonical%2FNeal_Ford-Testing_with_Selenium-slides.pdf&ei=fq_uRLTuHqOMsAKksbSQBA&sig2=kz-8T612L4b4Qb49xFRwuQ#
    Watir 和 Selenium 的比较
    http://www.google.com/url?sa=t&ct=res&cd=10&url=http%3A%2F%2Fopensource.thoughtworks.com%2Fpapers%2FWatirAndSelenium.pdf&ei=Jq_uRLKAHI6ysALG5MG3BA&sig2=uXS5gTFL2IXju1fQyzODhQ#

    Feedback
  • 用 Selenium 自动化验收测试

    2007-12-13 11:06:07

    用 Selenium 自动化验收测试

    如何使用 Selenium 测试工具对 Ruby on Rails 和 Ajax 应用程序进行功能测试

    developerWorks
    文档选项
    将此页作为电子邮件发送

    将此页作为电子邮件发送

    未显示需要 Javascrīpt 的文档选项

    讨论

    样例代码



    级别: 中级

    Christian Hellsten (christian.hellsten@fi.ibm.com), IT 专家, IBM

    2006 年 1 月 04 日

    验收测试(也称功能测试)是用来测试手工任务的功能的,但是手工测试这些任务可能很花时间,并且容易出现人为的错误。在本文中,作者为架构师、开发人员和测试人员展示了如何使用 Selenium 测试工具来自动化验收测试。通过自动化测试,可以节省时间,并消除测试人员所犯的错误。文中还给出了一个例子,以演示如何将 Selenium 应用到现实中使用 Ruby on Rails 和 Ajax 的项目上。

    Web 应用程序的验收测试常常涉及一些手工任务,例如打开一个浏览器,并执行一个测试用例中所描述的操作。但是手工执行的任务容易出现操作人员人为的错误,也比较费时间。因此,尽可能将这些任务自动化,以消除人为因素,这是一种很好的做法。于是 Selenium 之类的测试工具就有了用武之地。Selenium 帮助您自动化验收测试,从而可以构建经过更严格测试、因而更为可靠也更易于维护的软件。

    验收测试也称黑盒测试和功能测试,是测试和检验应用程序是否能按照涉众(stakeholder)的功能性需求、非功能性需求和其他重要需求来运行的一种方法。验收测试是单元测试和组合测试的补充,后两者通常是使用 xUnit 框架编写的。验收测试也可以使用编程语言来编写,但是 Selenium 和其他类似的工具,例如 Fitnesse,也支持用特定于工具的文档格式编写测试。

    验收测试与单元测试和组合测试有以下不同之处:

    • 应用程序是作为一个完整的端到端实体来测试的,而不是像单元测试和组合测试那样,只是测试一个类或一组类。
    • 验收测试是在用户界面(例如一个浏览器)上执行的,而不是在 Web 应用程序界面上执行的。
    • 编写测试用例的人不一定知道应用程序的内部结构,因此也被称作黑盒测试。非技术性用户也可以编写验收测试。

    背景知识

    在讨论 Selenium 之前,我要介绍关于以下三个话题的一些背景知识,因为这些话题虽然不是本文的主题,但是和本文密切相关:

    • 持续集成
    • Ajax
    • Ruby/Ruby on Rails

    持续集成

    持续集成的目标是自动化构建和测试过程,以便每天自动运行一次或多次这些过程,而不是每个月手动地运行一次。使用持续集成的最大好处是,代码的更改会定期地自动被集成。如果系统受损,没有构建成功,Apache Continuum 和 Luntbuild 之类的持续集成工具可以自动通过发送电子邮件通知团队(见 参考资料)。

    Ajax

    Ajax 是 Asynchronous Javascrīpt and XML 的缩写,这是为相当老的技术新创造的一个术语。Ajax 背后的主要思想是,由于只需更新部分页面而不是整个页面,所以 Web 应用程序可以更快地对用户操作做出响应。

    Ajax 将更多的复杂性引入到 Web 应用程序中,这一点也反映在测试中。这是因为 Ajax 就像它的名称所表明的那样,使用 Javascrīpt 和异步 HTTP 请求来更新页面内容。每个浏览器在实现中与其他浏览器相比有一些小小的不同。Selenium 是测试和检测这些差异的很好的工具,因为它在大多数流行的浏览器中都能够运行。

    Ruby/Ruby on Rails

    Ruby 是一种开放源码的解释型脚本语言,用于快捷、容易地进行面向对象程序设计。它提供了大量的库,而且简单易用,还具有可扩展性和可移植性。该语言是由 Yukihiro “Matz” Matsumoto 创造的,目的是让程序员将更多的注意力放在手头的任务上,摆脱语法的烦恼。

    Rails 是由 David Heinemeier Hansson 创造的一种全栈的(full-stack)、开放源码的 Ruby Web 框架。Rails 的目标是使现实中的应用程序编写起来需要的代码更少,并且比 J2EE 和 XML 之类的语言更容易。所有层都能够无缝地一起工作,因此可以使用一种语言编写从模板到控制流乃至业务逻辑的各种东西。Rails 使用 YAML 而不是 XML 配置文件以及注释形式的反射和运行时扩展。这里不存在编译阶段 —— 程序修改后将直接运行。





    回页首


    什么是 Selenium?

    Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的一个验收测试工具。据 Selenium 主页所说,与其他测试工具相比,使用 Selenium 的最大好处是:

    Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 MacintoshAnd 上的 Internet Explorer、Mozilla 和 Firefox 中运行。其他测试工具都不能覆盖如此多的平台。

    使用 Selenium 和在浏览器中运行测试还有很多其他好处。下面是主要的两大好处:

    • 通过编写模仿用户操作的 Selenium 测试脚本,可以从终端用户的角度来测试应用程序。
    • 通过在不同浏览器中运行测试,更容易发现浏览器的不兼容性。

    Selenium 的核心,也称 browser bot,是用 Javascrīpt 编写的。这使得测试脚本可以在受支持的浏览器中运行。browser bot 负责执行从测试脚本接收到的命令,测试脚本要么是用 HTML 的表布局编写的,要么是使用一种受支持的编程语言编写的。

    Selenium 适用于以下浏览器:

       Internet Explorer Mozilla Firefox Safari
    Windows XP 6.0 1.6+, 1.7+ 0.8+, 0.9+, 1.0   
    Red Hat Linux    1.6+, 1.7+ 0.8+, 0.9+, 1.0+   
    Mac OS X 10.3 不支持 1.6+, 1.7+ 0.8+, 0.9+, 1.0+ 1.3+




    回页首


    Selenium 命令

    通过 Selenium 命令,脚本编写者可以描述 browser bot 在浏览器中所执行的操作。可以将这些命令分成两类 —— 操作(action)断言(assertion)

    • 操作模拟用户与 Web 应用程序的交互。例如,单击一个按钮和填写一个表单,这些都是常见的用户操作,可以用 Selenium 命令来自动化这些操作。
    • 断言验证一个命令的预期结果。常见的断言包括验证页面内容或当前位置是否正确。

    在 Selenium 网站上可以找到可用命令的完整列表(见 参考资料)。





    回页首


    Selenium 模式

    可以按两种模式来使用 Selenium:test runnerdriven。这两种模式在复杂性和编写方式方面有所不同。driven 测试脚本编写起来往往要更复杂一些,因为它们是用编程语言编写的。但是如果使用 Python 或 Ruby 之类的高级动态编程语言,那么这种复杂性方面的差异就很小。

    两种模式之间最大的不同点在于,如果使用 driven 脚本,测试有一部分在浏览器之外运行,而如果使用 test runner 脚本的话,测试是完全在浏览器中运行的。

    不管是 test runner 还是 driven 测试用例,都可以与持续集成工具集成。





    回页首


    test runner 模式

    Selenium test runner 脚本,也称测试用例(test case),是用 HTML 语言通过一个简单的表布局编写的,如 清单 1 所示。


    清单 1. Selenium 测试用例的结构
      <table border="1">
        <tr>
          <td>First command</td>
          <td>Target</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Second command</td>
          <td>Target</td>
          <td>Value</td>
        </tr>
      </table>
    

    test runner 脚本通常与所测试的应用程序(AUT)部署在同一个服务器上。这是因为 browser bot 使用 Javascrīpt 来模拟用户操作。这些脚本在一个受限制的沙箱环境中运行。如果需要绕过这些限制,可以使用一个代理。

    test runner 脚本使用与 xUnit 框架相同的测试套件(test suite)和测试用例概念。测试用例和命令按照它们在测试套件和测试用例中出现的顺序依次执行。在 清单 1 中:

    • 第一列包含命令断言
    • 第二列包含命令或断言的目标(target)。这里可以用多种受支持的组件定位符中的一种来指定目标。通常使用的是组件的 ID 或名称,但 XPath 和 DOM 定位符也是受支持的。
    • 第三列包含用于为命令或断言指定参数的。例如,当使用 type 命令时,这一列可能就是一个文本域所期望的值。

    即使对于非技术人员来说,test runner 脚本也易于阅读和编写。当在一个浏览器中打开 清单 1 中的例子时,将得到类似这样的一个表:

    First command Target Value
    Second command Target Value

    接下来,我将描述如何使用命令和断言编写一个简单但是完整的测试用例。

    测试用例实例

    执行 清单 2 中的测试脚本时,它将执行以下操作:

    1. 通过进入 /change_address_form.html 打开变更地址页面。
    2. 在 ID 为 address_field 的文本框中输入 Betelgeuse state prison
    3. 单击名为 Submit 的输入区。注意,这里使用 XPath 找到 Submit 按钮,这导致表单数据被发送到服务器。
    4. 验证页面是否包含文本 Address change successful

    清单 2. 在测试用例中使用命令和断言的例子
      <table>
        <tr>
          <td>open</td>
          <td>/change_address_form.html</td>
          <td></td>
        </tr>
        <tr>
          <td>type</td>
          <td>address_field</td>
          <td>Betelgeuse state prison</td>
        </tr>
        <tr>
          <td>clickAndWait</td>
          <td>//input[@name='Submit']</td>
          <td></td>
        </tr>
        <tr>
          <td>verifyTextPresent</td>
          <td>Address change successful</td>
          <td></td>
        </tr>
      </table>
    

    测试套件

    要达到对应用程序的完全测试覆盖,通常需要不止一个测试用例。这就是 Selenium 使用测试套件的原因。测试套件用于将具有类似功能的一些测试用例编成一组,以便让它们按顺序运行。

    测试套件和测试用例一样,都是用简单的 HTML 表编写的。Selenium 执行的缺省测试套件的名称是 TestSuite.html。清单 3 展示了一个测试套件,该套件像通常的用户一样测试应用程序。注意,测试套件使用一个只包含一列的表,表中的每一行指向一个包含某个测试用例的文件。


    清单 3. 测试套件示例
      <table>
        <tr>
          <td>Test suite for the whole application</td>
        </tr>
        <tr>
          <td><a href="test_main_page.html">Access main page</a></td>
        </tr>
        <tr>
          <td><a href="test_login.html">Login to application</a></td>
        </tr>
        <tr>
          <td><a href="test_address_change.html">Change address</a></td>
        </tr>
        <tr>
          <td><a href="test_logout.html">Logout from application</a></td>
        </tr>
      </table>
    

    接下来我将把目光转移到 driven 测试脚本。





    回页首


    driven 模式

    driven Selenium 脚本是用多种受支持的编程语言中的一种编写的 —— 目前可用的有 Java、Ruby 和 Python 驱动程序。这些脚本在浏览器之外的一个单独的进程中运行。驱动程序的任务是执行测试脚本,并通过与运行在浏览器中的 browser bot 进行通信来驱动浏览器。驱动程序与 browser bot 之间的通信使用一种简单的特定于 Selenium 的连接语言 Selenese。

    driven 脚本比 test runner 脚本更强大、更灵活,可以将它们与 xUnit 框架集成。driven 脚本的缺点(与 test runner 脚本相比)是,这种脚本编写和部署起来更复杂。这是因为驱动程序必须执行以下任务:

    • 启动服务器。
    • 部署所测试的应用程序(AUT)。
    • 部署测试脚本。
    • 启动浏览器。
    • 发送命令到 browser bot。
    • 验证 browser bot 执行的命令的结果。

    driven 脚本更依赖于应用程序运行时环境。例如,Java 驱动程序使用一个嵌入式 Jetty 或 Tomcat 实例来部署所测试的应用程序。目前,已经有人在致力于将 Selenium 集成到 Ruby on Rails 中,但是在我撰写本文之际,这个集成版本还没有被发布。

    清单 4 摘自一个使用 Ruby 驱动程序的 driven 测试脚本。注意,我省略了用于启动服务器和浏览器的步骤,这个测试脚本代码几乎和 test runner 脚本一样简单。


    清单 4. 使用 Ruby 驱动程序的例子
        .
        .
        puts selenium.open('/logout.html')
        puts selenium.verify_location('/index.html')
        .
        .
    





    回页首


    现实中的需求

    在接下来的两节(现实中的需求现实中的用例)中,我将描述如何在现实场景中使用 Selenium,并针对用 Ruby on Rails 和一点儿 Ajax 技术编写的一个简单的股票报价查看器应用程序编写 Selenium 测试用例。虽然这个应用程序是用 Ruby on Rails 编写的,但是也可以将这个例子应用于任何 Web 应用程序,因为测试脚本是按 test runner 模式以 HTML 编写的。这个示例应用程序是用 Ruby 1.8.3 和 Ruby on Rails 0.14.2 测试的,但是它也可能可以使用更旧的或更新的版本。

    如果有 Linux,那么发行版中通常已经包括了 Ruby。在命令提示符下运行 ruby -v,检查您所拥有的版本。对于大多数平台,都可以在 http://www.ruby-lang.org/ 上找到一个 Ruby 发行版。

    接下来的步骤是通过 RubyGems 打包系统安装 Ruby on Rails。为此,只需执行 gem install rails --include-dependencies。在某些平台上,必须执行一些额外的步骤,所以请访问 Ruby on Rails 网站,以获得更多细节。

    在我撰写本文之际,目前可用的 Selenium 版本是 0.6。我已经将它集成在示例应用程序中(见 下载 小节),我的做法是从 http://selenium.thoughtworks.com/ 下载 Selenium Core 包,然后将名为 selenium 的文件夹复制到用于静态内容的文件夹。在 Ruby on Rails 应用程序中,这个文件夹的名称是 public。在 J2EE Web 应用程序中,可以将 selenium 文件夹放在 Web 应用程序的根目录或 WAR 归档文件中。

    最后一步是下载示例应用程序。从 下载 小节中获得这个包。解压应用程序,并打开一个命令提示符。然后转入应用程序被解压到的那个目录。为了启动应用程序,运行 ruby scrīpt/server。应该看到 Rails 成功启动了,如 图 1 所示。


    图 1. 从命令提示符下运行 Ruby on Rails
    从命令提示符下运行 Ruby on Rails




    回页首


    现实中的用例

    在本节中,我将列出示例应用程序的用例。通过这些简化的用例,可以编写模拟用户所执行步骤的验收测试,并验证这些步骤的结果是否与预期相符。股票报价应用程序实现了以下四个用例:

    • 登录
    • 查看股票
    • 查看股票细节
    • 退出

    实现这些用例的代码已经编写好了;可以在 app 目录中找到该代码,测试用例在 public/selenium/tests 文件夹中。

    登录用例

    大多数人都知道登录页面是如何工作的 —— 输入用户名和密码,然后将数据提交到服务器。如果凭证有效,就可以成功登录,并看到受安全保护的资源。在示例应用程序中,这个测试用例包含以下用户操作和断言,必须将它转换成一个 Selenium 测试用例:

    1. 单击登录链接。
    2. 验证系统是否要求用户进行登录。
    3. 输入用户名。
    4. 输入密码。
    5. 按下登录按钮。
    6. 验证是否登录成功。

    图 2 展示了用于这些需求的 Selenium 测试用例。注意,我是在运行测试之后截取屏幕快照的。绿色箭头表示成功地通过验证的断言。


    图 2. 登录和查看股票测试用例
    登录和查看股票测试用例

    查看股票测试用例

    查看股票页面显示一个公司列表。用于这个页面的测试用例非常简单,所以被包括在前一个测试用例的后面。该测试用例验证当前位置是否为 /main/list_stocks,以及页面是否包含文本 Click on a company name to view details

    查看股票细节用例

    查看股票细节用例是在查看股票页面上触发的。用户在一个公司名称上单击鼠标时,就触发了到服务器的一个 Ajax 请求。服务器的响应包括该公司的详细信息,这些信息将插入到当前页面中,而不必重新装载完整的页面。用于这个用例的测试用例执行以下用户操作:

    1. 单击公司名称 Acme Oil
    2. 验证页面上是否显示该公司的详细信息。
    3. 单击公司名称 Acme Automotive
    4. 验证页面上是否显示该公司的详细信息。

    由于使用了 Ajax,请求是异步发生的。在一般的 Web 应用程序中,所有东西通常都是同步的,因此这一点提出了一种不同的挑战。可以像测试其他功能一样来测试 Ajax 功能。惟一的不同是,必须让 Selenium 暂停,等待 Ajax 命令完成。为此,可以使用 pause 命令来等待 Ajax 命令的完成。另外,Joseph Moore 在他最近的 blog 贴中提到,还可以使用 waitForValuewaitForCondition 命令代替 pause 命令(见 参考资料)。

    图 3 展示了被转换成 Selenium 用例的需求。


    图 3. 查看股票细节测试用例
    查看股票细节测试用例

    注意 pause 命令:必须使用这些命令,以便等待异步请求完成和更新页面内容。如果没有 500 毫秒的暂停,测试将失败(如 图 4 所示)。


    图 4. 失败的查看股票细节测试用例
    失败的查看股票细节测试用例

    pause 命令还测试 Ajax 功能的非功能性需求。500 毫秒对于 pause 命令是一个很好的值,因为 Ajax 请求应该快速地执行和完成。可以试着去掉 pause 命令,看看结果如何。如果测试在您的机器上失败,那么试着将这个值增加到 1000 毫秒。

    退出用例

    退出用例很容易实现,简单来说只有以下两步:

    1. 单击退出链接。
    2. 验证是否成功退出。

    图 5 展示了最后这个测试用例。


    图 5. 退出用例
    退出用例

    所有测试都被添加到 图 6 左侧显示的缺省测试套件中。


    图 6. 示例应用程序的测试套件
    示例应用程序的测试套件

    执行测试套件

    最后要做的是在 Mozilla Firefox 和 Microsoft Internet Explorer 中执行测试套件。为此,在浏览器中打开 http://localhost:3000/selenium/TestRunner.html,然后单击 图 6 中所示的 All 按钮。失败的测试用例和断言将被标记为红色,但是这里,在两个浏览器中所有用例都应该可以成功完成(同样见 图 6)。注意,我使用的是 Mozilla Firefox 1.0.7 和 Internet Explorer 6.0。

    还可以单步调试测试套件,这意味着 Selenium 将很慢地执行测试套件,这样当测试套件在浏览器中执行时,就可以看到它的每一步。





    回页首


    结束语

    Selenium 是软件工程师、设计人员和测试人员的工具箱中又一个有用且重要的工具。通过将该工具与持续集成工具相结合,团队就可以将验收测试自动化,并构建更好的软件,因为他们可以更容易、更早、更频繁地发现 bug。Selenium 的另一个优点是可以节省时间,使开发人员和测试人员不必将时间花在本可以(也应该)自动化的手工任务上,从而让团队将精力放在更有价值的活动上。






    回页首


    下载

    描述 名字 大小 下载方法
    Sample application wa-selenium-ajax-example.zip 286KB HTTP
    关于下载方法的信息


    参考资料

    学习

    获得产品和技术
    • 获取关于 Selenium 工具的详细信息,该工具是 ThoughtWorks 根据用于企业软件开发的敏捷开发方法而创造的。

    • 访问 Ruby on Rails 主页和 Ruby language 主页,以获得为掌握这些技术所需的各种资料。

    • 查看用于构建基于 Java 的项目的持续集成服务器 Continuum

    • 研究 Luntbuild,这是一个强大的构建自动化和管理工具,用于自动化构建,并充当构建管理系统。

    • 尝试用 Fitnesse 作为验收测试框架。

    • 获取 Mozilla Firefox 浏览器。

    • 获取 Selenium Recorder,这是一个 Firefox 扩展,通过它可以记录 Selenium 测试脚本。

    讨论


    关于作者

    Christian Hellsten 目前是 IBM 业务咨询服务部的 IT 专家。他在 IT 界有六年以上从事大型电子商务项目的经验。他的专业领域包括 Java、J2EE 和 EAI 架构、设计和开发。他还喜欢使用更动态的、高效且有趣的语言和框架,例如 Python、Ruby 和 Ruby on Rails。

  • 新手软件测试基础知识学习必知

    2007-11-19 17:01:57

    今天先来看看,测试员需要具备的一些基础知识.测试并不是想象中那么简单的事情,学习是无止境的:)

       1.计算机系统基础知识
       1.1 计算机系统构成及硬件基础知识
        ●计算机系统的构成
        ●处理机
        ●基本输入输出设备
        ●存储系统
       1.2 操作系统基础知识
        ●操作系统的中断控制、进程管理、线程管理
        ●处理机管理、存储管理、设备管理、文件管理、作业管理
        ●网络操作系统和嵌入式操作系统基础知识
        ●操作系统的配置
       1.3 数据基础知识
        ●数据库基本原理
        ●数据库管理系统的功能和特征
        ●数据库语言与编程
       1.4 中间件基础知识
       1.5 计算机网络基础知识
        ●网络分类、体系结构与网络协议
        ●常用网络设备
        ●Internet基础知识及其应用
        ●网络管理
       1.6 程序设计语言知识
        ●汇编、编译、解释系统的基础知识
        ●程序设计语言的基本成分(数据、运算、控制和传输、过程(函数)调用)
        ●面向对象程序设计
        ●C语言以及C++(或Java)语言程序设计基础知识
       2.标准化基础知识
        ●标准化的概念(标准化的意义、标准化的发展、标准化机构)
        ●标准的层次(国际标准、国家标准、行业标准、企业标准)
        ●标准的类别及生命周期
       3.信息安全知识
        ●信息安全基本概念
        ●计算机病毒及防范
        ●网络入侵手段及防范
        ●加密与解密机制
       4.信息化基础知识
        ●信息化相关概念
        ●与知识产权相关的法律、法规
        ●信息网络系统、信息应用系统、信息资源系统基础知识
       5.软件工程知识
       5.1 软件工程基础
        ●软件工程概念
        ●需求分析
        ●软件系统设计
        ●软件组件设计
        ●软件编码
        ●软件测试
        ●软件维护
       5.2 软件开发方法及过程
        ●结构化开发方法
        ●面向对象开发方法
        ●瀑布模型
        ●快速原型模型
        ●螺旋模型
       5.3 软件质量管理
        ●软件质量及软件质量管理概念
        ●软件质量管理体系
        ●软件质量管理的目标、内容、方法和技术
       5.4 软件过程管理
        ●软件过程管理概念
        ●软件过程改进
        ●软件能力成熟度模型
       5.5 软件配置管理
        ●软件配置管理的意义
        ●软件配置管理的过程、方法和技术
       5.6 软件开发风险基础知识
        ●风险管理
        ●风险防范及应对
       5.7 软件工程有关的标准
        ●软件工程术语
        ●计算机软件开发规范
        ●计算机软件产品开发文件编制指南
        ●计算机软件需求规范说明编制指南
        ●计算机软件测试文件编制规范
        ●计算机软件配置管理计划规范
        ●计算机软件质量保证计划规范
        ●数据流图、程序流程图、系统流程图、程序网络图和系统资源图的文件编制符号及约定

       6.软件测试知识
       6.1 软件测试基本概念
        ●软件质量与软件测试
        ●软件测试定义
        ●软件测试目的
        ●软件测试原则
        ●软件测试对象
       6.2 软件测试过程模型
        ●V模型
        ●W模型
        ●H模型
        ●测试模型的使用
       6.3 软件测试类型
        ●单元测试、集成测试、系统测试
        ●确认测试、验收测试
        ●开发方测试、用户测试、第三方测试
        ●动态测试、静态测试
        ●白盒测试、黑盒测试、灰盒测试
       6.4 软件问题分类
        ●软件错误
        ●软件缺陷
        ●软件故障
        ●软件失效
       6.5 测试标准
        7.5.1 GB/T 16260.1—2003 软件工程 产品质量 第1部分:质量模型
        7.5.2 GB/T 18905.1—2002 软件工程 产品评价 第1部分:概述
        7.5.3 GB/T 18905.5—2002 软件工程 产品评价 第5部分:评价者用的过程

数据统计

  • 访问量: 17992
  • 日志数: 17
  • 文件数: 3
  • 建立时间: 2007-11-19
  • 更新时间: 2008-03-24

RSS订阅

Open Toolbar