测试之道、

发布新日志

  • Loadrunner 进行 IP欺骗测试

    2008-12-25 00:13:20

    使用loadrunner进行IP欺骗首先要注意以下两点:

    1、  本地的IP设置不能为“自动获取”,必须指定一个静态IP

    如果本地是动态获取IP,在运行IP Wizard时会弹出提示:

    The IP wizard does not support DHCP-enabled network cards.
    Your cards are either DHCP-enabled or configured with invalid settings.
    Please contact your system administrator.

    此时只需要将IP地址改成静态IP地址就可以了

    2、  所添加的IP只能是局域网内的网段
    只能添加192段,127段,10段IP地址
    好下面开始介绍如何使用IP欺骗

    一、添加IP地址

    第一步:
    运行Mercury LoadRunner- Tools-IP Wizard
    弹出的IP设置向导中的各项含义如下:

    1、  create new setting   新建IP列表
    当我们第一次使用IP欺骗或已经释放所添加的IP时,需要选择此项添加新的IP地址

    2、  load previous setting from file   读取IP列表文件
    从以前设置的IP地址列表文件中读取IP地址

    3、  restore original setting   释放已设置的IP
    释放已经添加的IP地址

    说明:loadrunner在做IP欺骗时,真实的虚拟了IP地址,该IP地址均真实存在,可以ping通,可以建立网络链接,在不使用时必须进行释放,否则这些IP地址将一直存在。

     第二步:

    选择create new setting,点击“下一步”
    此时出现的页面是让输入服务器的IP地址,loadrunner通过该地址更新路由表。
    客户端计算机上添加新的 IP 地址后,服务器需要将该地址添加到路由表,以便能够识别返回到客户端的路由。如果服务器和客户端具有相同的子网掩码、IP 类和网络,则不需要修改服务器的路由表。
    注意: 如果客户端和服务器计算机之间有一个路由器,则服务器需要识别经过该路由器的路径。确保将以下路由添加到服务器路由表:从 Web 服务器到路由器的路由,以及从路由器到负载生成器计算机上的所有 IP 地址的路由。

     第三步:
    在输入服务器地址的页面中不输入任何地址,直接点击“下一步”
    进入IP添加页面
    点击“add”进行添加
     
    第四步:
    在from ip 输入框中输入起始ip,在Number to输入框中输入ip地址的位数
    输入正确的子网掩码
    选中“verify that new ip addresses are not already used”
    点击“ok”,此时IP Wizard会自动按照设置生成IP地址,并且将已经占用的IP列出
     
    第五步:
    确认可用IP地址列表内容后,点击“ok”
    此时IP Wizard提示需要重新启动计算机,点击“save as”保存IP列表
    点击“ok”,重新启动计算机
     
    第六步:
    计算机重新启动后,在运行行中输入:CMD,在DOS命令窗口中输入:IPCONFIG,此时便可看到虚拟的IP地址均已经被启用

    二、在loadrunner中使用虚拟IP

    第一步:
    打开controller,在controller中,选择 Scenario-〉Enable IP Spoofer,此项设置允许使用IP欺骗。

    第二步:
    设计场景:
    有两种方案来设计场景

    1、  本地使用虚拟IP设计场景(不带负载生成器使用localhost进行测试)
    在设置该类场景时,在场景中添加一个录制好的脚本,该脚本中添加如下代码便可看到虚拟用户在使用哪个IP地址进行消息发送,该场景是通过线程方式进行性能测试。

    char * ip;
    ip=lr_get_vuser_ip();
    if (ip)
    {
        lr_vuser_status_message("The ip address is %s",ip);
    }
     else
    lr_vuser_status_message("IP spoofing disabled");
           在controller中执行该脚本时,查看虚拟用户运行状态,便可看到当前虚拟用户使用的哪个IP地址发送消息

    2、  负载生成器使用虚拟IP设计场景
    在设置该类场景时,需要添加负载生成器,建立负载生成器时输入创建的虚拟IP,每个负载生成器为一个虚拟用户组,该场景是通过进程方式进行性能测试。
    如何添加负载生成器创建场景在这里就不多描述了。
    但需要注意,选中Tools下的Expert mode,启动专家模式
    再点击Tools下的options
    在Genearl选项卡中设置已线程方式或进程方式进行性能测试,这个选项一定要与当前场景的模式相匹配,也就是说使用本地虚拟IP测试时需要选中线程方式,使用负载生成器使用虚拟IP测试时需要选中进程方式

     三、使用虚拟IP测试完成后
    打开IP Wizard,释放所有虚拟IP。
    重新启动计算机

  • 缺陷跟踪及管理软件之--- Jira(破解版)

    2008-10-31 22:41:39

     
    一、 Jira安装
    二、 Jira破解
    三、 Jira默认数据库改为ms mqlserver
    四、 Jira跟cvs关联

    硬件环境
    thinkpad x61
    软件环境
    windows xp sp3
    ms sqlserver 2000 sp4
    网络环境
    普通局域网

    需要下载的软件
    1 jira
    下载地址:http://www.fangwai.net/
    我下载的是:atlassian-jira-enterprise-3.12.3-windows-installer.exe
    2 破解补丁
    下载地址就不放了,不和谐
    我下载的是:atlassian-extras-1.12.jar
    3 连接ms sqlserver用的JDBC驱动
    下载地址:http://jtds.sourceforge.net/
    我下载的是:jtds-1.2.2-dist.zip

    一 jira安装
    1 安装jira
    双击exe,没什么好说的,唯一一个注意的是:是否把jira注册为windows服务,安装的时候有链接详细说明,此处不再赘述。
    我选择了注册为windows服务后,可以从windows的“服务管理器”看到jira服务,我的叫做“Atlassian JIRA Enterprise Edition 3.12.3”

    二 jira破解
    1 默认可以申请30天试用,强烈不推荐非法破解,由于此文档产生的一切责任后果自负。
    注册机网上有下载,我使用的是用别人破解好的文件覆盖原文件的方法:
    将atlassian-extras-1.12.jar覆盖C:\Program Files\JIRA-Enterprise-3.12.3\atlassian-jira\WEB-INF\lib下同名文件即可。
    2 开启服务,在浏览器输入http://localhost:8080如果出现jira向导就说明成功安装了。
    输入序列号的地方输入
    12345
    12345
    12345
    12345
    12345
    如果点击下一步不提示序列号错误就完成注册了。

    三 jira默认数据库改为ms mqlserver
    1 创建jiradb数据库
    2 创建jirauser用户,密码随意,为了描述方便此处用sonic,把jiradb的public和db_ower角色赋给jirauser。
    3 编辑C:\Program Files\JIRA-Enterprise-3.12.3\conf\server.xml 文件,有一段是
    <Context path="" docBase="${catalina.home}/atlassian-jira" reloadable="false">
    <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
    username="sa"
    password=""
    driverClassName="org.hsqldb.jdbcDriver"
    url="jdbc:hsqldb:${catalina.home}/database/jiradb"
    minEvictableIdleTimeMillis="4000"
    timeBetweenEvictionRunsMillis="5000"
    maxActive="20" />
    修改几个地方:用户名、密码、驱动、URL
    修改以后类似:
    <Context path="" docBase="${catalina.home}/atlassian-jira" reloadable="false">
    <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
    username="jirauser"
    password="sonic"
    driverClassName="net.sourceforge.jtds.jdbc.Driver"
    url="jdbc:jtds:sqlserver://localhost:1433/jiradb"
    minEvictableIdleTimeMillis="4000"
    timeBetweenEvictionRunsMillis="5000"
    maxActive="20" />
    4 编辑 C:\Program Files\JIRA-Enterprise-3.12.3\atlassian-jira\WEB-INF\classes\entityengine.xml文件,有一段是:
    <datasource name="defaultDS" field-type-name="hsql"
    schema-name="PUBLIC"
    …………
    修改为
    <datasource name="defaultDS" field-type-name="mssql"
    删除下一行的
    schema-name="PUBLIC"
    5 把下载好的jtds驱动压缩包解压,把其中的jtds-1.2.2.jar文件拷贝到C:\Program Files\JIRA-Enterprise-3.12.3\common\lib目录下。
    6 最后重启一下服务就可以了。

    四 jira跟cvs关联
    1 配置cvs模块
    1.1 Cvsroot 设置:jira支持的访问方式有pserver,ext(ssh)以及本地的仓库三种。
    a :some/local/path (对于本地的仓库)
    b :pserver:username@hostname:port/some/path (利用pserver访问,适用于局域网)
    c :ext:username@hostname:/some/path (利用ssh协议访问,适用于internet)
    1.2 Module name :是cvs服务器上的模块名称。模块的名称应该和后面的log的信息是一致的,也就是说log是针对该模块的日志。所以如填写了一个cvs上没有模块,则就找不到log文件,那样创建就会失败。
    1.3 Log Retrieval:一种是自动检索cvs log, 一种是手动更新log.
    1.4 Log File Path:如果上面选择的是手动更新Log,则需要自己先建立一个log文件,然后再这里选中它,如果是自动检索的话,那么可以任意制定一个路径,jira会自动将cvs log文件复制到指定位置。
    1.5 Cvs timeout:默认设置是600秒,也就是说在cvs更新后一个小时才在jira上更新日志信息。
    1.6 Password: 如果选择了自动检索日志的话,就需要输入密码,该密码是登陆cvs服务器的密码。
    2 将cvs模块和jira的项目关联
    2.1 打开项目列表
    2.2 在需要加入cvs模块的项目后面选择查看
    2.3 在CVS Modules点击选择modules,从中选择相应的模块即可。这样系统就会获取该模块的日志,更新Jira指定的日志文件。
    2.4 对于jira中的问题,每个问题都拥有一个问题id,在cvs用户向服务器提交了该问题的修改版本时,log message中填写相应的问题id,那么对于问题所在源代码的修改就可以在jira的版本控制中反映出来。
    3 修改模块更新频率
    3.1 管理-〉System->services中更改 VCS Update Service的时间就可以了。
  • 跟踪及管理软件之--- Jira(破解版)

    2008-10-31 21:56:29

    JIRA破解版真难找。终于还是找到了。呵。。。。

          JIRA是一个优秀的问题(or bugs,task,improvement,new feature )跟踪及管理软件。
        它由Atlassian开发,采用J2EE技术.它正被广泛的开源软件组织,以及全球著名的软件公司使用,它堪称是J2EE的Bugzilla。

       JIRA提供了全面的功能,界面十分友好,可用性以及可扩展性方面都十分出色,如果购买商业版许可,还可以得到JIRA的源码(在开发许可协议下可以定制自己的JIRA系统)。

     
    JIRA 3.6 下载:
    http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-enterprise-3.6-standalone.zip

    地址已更新:

    下载(请将rar中的文件释放下来,直接覆盖掉web-inf下面的包即可,适用版本3.6):
    http://www.blogjava.net/Files/martinx/atlassian-extras-0.7.19.rar


    破解jira的License。只是把classes反编译过来,修改一下。效果如下,License的类型为JIRA Enterprise: Commercial Server。


    //要让程序能找到这个包。atlassian-extras-0.7.19.jar

    import com.atlassian.license.LicensePair;
    import java.io.*;
    import java.security.KeyFactory;
    import java.security.Signature;
    import java.security.spec.PKCS8EncodedKeySpec;

    public class keygen
    {

    public keygen()
    {
    }

    public static void main(String args[])
    throws IOException
    {
    try
    {
    long l = 267L;
    long l1 = System.currentTimeMillis();
    long l2 = System.currentTimeMillis();
    String s = “”;
    System.out.println(”Keygen for JIRA Enterprise Edition.”);
    System.out.print(”created by mydaj[ROR].”);
    do
    {
    System.out.print(”\nEnter your organization name: “);
    for(int i = System.in.read(); i != 10 && i != 13; i = System.in.read())
    s = s + (char)i;

    } while(s == “”);
    try
    {
    PKCS8EncodedKeySpec pkcs8encodedkeyspec = new PKCS8EncodedKeySpec(EncodedPrvKey);
    KeyFactory keyfactory = KeyFactory.getInstance(”DSA”, “SUN”);
    java.security.PrivateKey privatekey = keyfactory.generatePrivate(pkcs8encodedkeyspec);
    String s1 = Long.toString(l, 10);
    s1 = s1 + “^^”;
    s1 = s1 + Long.toString(l1, 10);
    s1 = s1 + “^^”;
    s1 = s1 + Long.toString(l2, 10);
    s1 = s1 + “^^”;
    s1 = s1 + s;
    byte abyte0[] = s1.getBytes();
    Signature signature = Signature.getInstance(”SHA1withDSA”);
    signature.initSign(privatekey);
    signature.update(abyte0);
    byte abyte1[] = signature.sign();
    LicensePair licensepair = null;
    try
    {
    licensepair = new LicensePair(abyte0, abyte1);
    }
    catch(Exception exception1)
    {
    exception1.printStackTrace();
    }
    System.out.println(s1);
    System.out.println(”Your license key is: “);
    System.out.println(licensepair.toString());
    }
    catch(Exception exception)
    {
    exception.printStackTrace();
    }
    }
    catch(IOException ioexception) { }
    }

    static byte EncodedPrvKey[] = {
    48, -126, 1, 75, 2, 1, 0, 48, -126, 1,
    44, 6, 7, 42, -122, 72, -50, 56, 4, 1,
    48, -126, 1, 31, 2, -127, -127, 0, -3, 127,
    83, -127, 29, 117, 18, 41, 82, -33, 74, -100,
    46, -20, -28, -25, -10, 17, -73, 82, 60, -17,
    68, 0, -61, 30, 63, -128, -74, 81, 38, 105,
    69, 93, 64, 34, 81, -5, 89, 61, -115, 88,
    -6, -65, -59, -11, -70, 48, -10, -53, -101, 85,
    108, -41, -127, 59, -128, 29, 52, 111, -14, 102,
    96, -73, 107, -103, 80, -91, -92, -97, -97, -24,
    4, 123, 16, 34, -62, 79, -69, -87, -41, -2,
    -73, -58, 27, -8, 59, 87, -25, -58, -88, -90,
    21, 15, 4, -5, -125, -10, -45, -59, 30, -61,
    2, 53, 84, 19, 90, 22, -111, 50, -10, 117,
    -13, -82, 43, 97, -41, 42, -17, -14, 34, 3,
    25, -99, -47, 72, 1, -57, 2, 21, 0, -105,
    96, 80, -113, 21, 35, 11, -52, -78, -110, -71,
    -126, -94, -21, -124, 11, -16, 88, 28, -11, 2,
    -127, -127, 0, -9, -31, -96, -123, -42, -101, 61,
    -34, -53, -68, -85, 92, 54, -72, 87, -71, 121,
    -108, -81, -69, -6, 58, -22, -126, -7, 87, 76,
    11, 61, 7, -126, 103, 81, 89, 87, -114, -70,
    -44, 89, 79, -26, 113, 7, 16, -127, -128, -76,
    73, 22, 113, 35, -24, 76, 40, 22, 19, -73,
    -49, 9, 50, -116, -56, -90, -31, 60, 22, 122,
    -117, 84, 124, -115, 40, -32, -93, -82, 30, 43,
    -77, -90, 117, -111, 110, -93, 127, 11, -6, 33,
    53, 98, -15, -5, 98, 122, 1, 36, 59, -52,
    -92, -15, -66, -88, 81, -112, -119, -88, -125, -33,
    -31, 90, -27, -97, 6, -110, -117, 102, 94, -128,
    123, 85, 37, 100, 1, 76, 59, -2, -49, 73,
    42, 4, 22, 2, 20, 42, 50, -88, 30, 125,
    -37, 118, -50, 20, -82, -63, 0, 8, -36, 106,
    -9, -110, 124, 107, 68
    };






    环境:windows,Tomcat5.5.4,MS SQLServer2000

    1.将JIRA的zip包文件解压缩到硬盘中(不要使用windowsXP自带的unzip功能!);

    2.运行JIRA的启动脚本文件:windows平台上就是运行bin目录下的startup.bat 文件;

    以上就可以启动JIRA了,通过http:/localhost:8080/就可以访问JIRA了!
    这时候的JIRA使用了Standalone版本中集成的Tomcat和HSQL数据库(轻量级的数据库)。

    如果用作商业使用,应该将JIRA安装到企业级的外部数据库上!以下介绍JIRA的Standalone版本在外部MS SQLServer2000上的安装过程:

    1.安装MS SQLServer2000数据库,记着要安装MS SQLServer2000的Service Pack4;
    1.1安装过程要自定义,选择chinese_RPC排序方式,语言为simple chinese;
    1.2身份验证选择混合模式;

    2.然后创建jiradb和jirauser,创建jirauser的过程中要先创建一个登录名jirauser;把public和dbo角色赋给jirauser,不要将jirauser作为dbower;

    3.编辑conf/server.xml 文件,将<Context ... .../>中的内容,修改为:
    <Context path="" docBase="${catalina.home}/atlassian-jira" reloadable="false">
    <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
    username="jirauser"
    password="123456"
    driverClassName="net.sourceforge.jtds.jdbc.Driver"
    url="jdbc:jtds:sqlserver://localhost:1433/jiradb" />

    4.编辑 atlassian-jira/WEB-INF/classes/entityengine.xml文件, 修改field-type-name 的属性值为mssql(field-type-name="mssql");

    5.下载连接MS SQLServer数据库的JDBC Driver,推荐使用JTDS(http://jtds.sourceforge.net/),将jtds-[version].jar文件拷贝到common\lib目录下;

    6.运行bin目录下的startup.bat,启动JIRA;

    7.通过浏览器地址http://localhost:8080/访问JIRA,根据向导配置JIRA.
  • LoadRunner使用笔记

    2008-10-19 18:08:14

    工具介绍

    LoadRunner: LoadRunner是一种预测系统行为和性能的工业标准级负载测试工具。通过模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题。

    10字真言:虚拟的用户,真实的负载

    VuGen: 脚本录制工具

    Controller:场景控制器

    Analysis: 结果分析工具

    经验总结

    1.测试需求及目标

    a.性能测试的第一步工作就是要“明确客户的需求“,这一阶段我称之为命题作文。作文如果跑题了即使长篇大论也无济于事。

    b.这一阶段的参与者包括需求提出人员和测试人员,由于性能测试一般没有需求变更的情况,要求需求人员一定是比较权威。

    c.一般来说,项目级性能测试客户自身会根据系统使用者范围(总用户数或在线用户数),系统使用环境(集中或分布),高峰作业量(并发用户)提出明确的要求,测试人员也可以提出一些供参考的经验值作为预期的目标。

    d.如果系统测试属于产品测试,那么除了经验值目标外还应包含产品比对,这也是很多产品性能测试采用的一般模式。

    e.性能测试的需求的大致分为两种:

    一种是压力需求,要求××场景××并发用户下平均响应时间小于可接受值;

    另一种是负载需求,要求××场景响应时间在××内支持××用户数。

    二种测试的方法略有不同,但都能够通过测试工具简单操作完成切换。

    2.测试设计

    a.测试设计的原则:从简单到复杂

    b.测试设计主要是测试人员根据测试目标准备测试方案和选取案例。

    c.对于项目级测试,在测试需求中一般都会进行相关的说明,大多数情况下是将系统中关键业务处理场景作为性能测试案例,

    d. 考虑到减少测试的复杂性,可以对业务场景中的测试案例进行进一步加工,比如实际场景中可能在一次请求中包含多次子操作(既查询,又修改),那么可以将这些操作拆分,这样更有利于分析结果数据,同时可以抛开业务操作功能之外的消耗(比如有些复杂页面包含很多查询结果,可以拆开分别进行测试,或者页面中包含较多的图片或flash也可以剥离出去,当然也可以利用测试工具中功能达到类似效果)

    3.测试环境

    a.测试环境=硬件环境+软件环境

    b.测试环境在整个性能测试中是一个非常重要的工作。因为在测试报告中测试环境是最客观的指标,同时也是整个性能测试结果的基础

    c.测试环境包括网络环境、硬件环境和软件环境。测试的服务器最好在同一个网段,硬软件最好和真实环境一致。说起来简单做起来难,在搭建环境的过程中一定要自己检查,尤其是软件环境涉及操作系统、应用服务器、数据服务器,更要做到完全一致,因为性能测试的数据都是上万级,结果数据往往相差都是毫秒级,一个小小的索引都会导致极大的差异。

    4.脚本录制和测试工具

    a.环境搭建好之后,可以开始录制脚本,录制脚本使用LoadRunner Virtual User Genorator工具,具体使用的方法网上有很多介绍,我的体会还是很容易上手,下面介绍一些经验和体会

    b.事务设置

    由于实际业务可能包括多个子操作,新增、查询、修改、删除。可以考虑使用事务分别进行监控,事务的使用也很简单,loadrunner的菜单栏提供加入事务功能。

    c.参数变量和函数的使用

    在测试中,我们可能需要录入一个随机数据或者一个枚举的顺序数据,比如业务场景中的数据主键可能一个日期+唯一序列码,同时业务场景中主键是由系统程序(java代码)而不是数据库生成,这时候可以使用LoadRunner提供的参数来实现,参数被定义来自一个文件、一个随机数或者是一个顺序枚举,我仅尝试了后两种。(实际操作中定义参数后可以使用函数将参数和日期拼接成主键值)

    d.Loadrunner提供一系列脚本函数,我使用其中的一部分,感觉还是很好用的。包括日志输出、数据转换、页面交互(以 Web_***开头的),尤其是在作删除事务的时候,由于需要取得新增数据的主键,可以考虑在新增数据后把主键值保存在页面,loadrunner会在请求的时候从返回数据中得到这个主键值并保存在脚本变量中,删除的时候可以使用这个变量来进行删除工作。使用 web_reg_save_param可以达到这个目的,比如 web_reg_save_param(”userid”,”LB=ABC”,”RB=EFG”,LAST)就是把返回页面中的正则匹配 ABC***EFG中的***保存在userid变量中,”LB”标志数据的左边界,同时”RB”标志数据的右边界,使用时同时要注意,这个函数相当于一个过滤器filter,所以一定要把它放在发出请求的事务前面。如果页面返回的数据比较多可以设置buffer值来增大返回数据的容量。

    e.所有函数的用法都可以在工具提供的帮助文件中找到,个人体会比使用Google要好。

    f.即使是测试本地系统,录制脚本的目标URL不要设置为http://localhost:7073/*.do或者http: //127.0.0.1:7073/*.do,而应该使用真实的本地ip。

    g.运行结束后,LoadRunner会弹出一个测试结果窗口,同时运行时的页面还可以通过在LoadRimmer User Generator中切换察看树形视图进行检查。

    h.通过检查数据库可以确认脚本是否按照预期进行了正确的数据操作。

    i.在做关联的时候,应该从数据第一次出现的位置之前做关联,否则就会出现找不到数据的情况

    5.测试计划及测试工具

    a.脚本调试完毕,我们进入正式的测试工作,开始使用LoadRunner的控制台进行详细的测试计划编排和设置

    b.关于如何使用控制台大家可以找到很多参考,我这里仅列出几点体会:

    i.运行测试之前一定要先进行脚本验证,保证在无并发用户的情况下脚本能正确执行。

    ii .运行测试一般设置测试运行的duration即可,但是为了对测试所执行的数据监控,也可以采取设置运行次数RunLogic来达到目的,比如并发用户 10个,每个用户运行10次,那么如果每个用户执行一次插入数据动作,最终应该产生100条数据。

    iii.取消浏览器模拟browser emulation可以阻止测试中页面非测试数据的下载进而让测试结果更干净。

    iv .no thinktime模式服务器压力比较大,如果是稳定性测试可以在事务间加入适当的thinktime,因为稳定性测试并不是压力测试。

    v.并发用户较大时应该采用逐步增加用户的方式来执行计划(比如每隔15秒增加10个用户),执行计划时间一定要达到足够产生稳定的数据。(通过测试监控观察,可以在测试运行中随时增加新的用户来延长测试时间)

    6.测试结果分析

    a.测试分析是性能测试的最后一关,如果前面的工作没有失误的话,应该是水到渠成,可是大多数情况下我们还是需要对结果进行进一步分析,并调整我们的测试策略(包括环境、案例及脚本)

    b.Loadrunner提供强大的测试分析工具-analysis,可以将测试数据提取出来进行事后分析。

    c. 其中最重要的是响应时间response time和吞吐量(hps),顾名思义,响应时间越小越好,吞吐量越高越好。当然资源消耗(CPU,MEMORY)越少越好。但是其实并不完全,对于一个系统来说,也要讲和谐,也既是所有的资源使用应该使用率应该保持一致。如果测试显示应用服务器CPU特别高,数据服务器特别低,那么系统运行肯定不正常,这时候需要检查是否网络正常,数据服务器是否有死锁等。

    d.一般我们可以对测试结果做一点处理让数据更准确,比如设置过滤器去除不稳定数据,可以设置时间段截取稳定运行时间内的数据作为标本数据。

    e.一旦分析完毕,可以将结果导出到网页作为测试报告。

  • LoadRunner参数的设置

    2008-10-19 18:05:48

     做负载或者压力测试时,很多人选择使用了Loadrunner测试工具。该工具的基本流程是先将用户的实际操作录制成脚本,然后产生数千个虚拟用户运行脚本(虚拟用户可以分布在局域网中不同的PC机上),最后生成相关的报告以及分析图。但是在录制脚本的过程中会遇到很多实际的问题,比如不同的用户有不同的使用数据,这就牵涉到参数的设置问题。本文就Loadrunner中参数的设置进行说明,希望对大家有所帮助。

        在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本。如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询、提交等等),那么你必须用参数值取代录制的数值。这个过程称为参数化脚本。

        本文主要包括如下内容:理解参数的局限性、建立参数、定义参数的属性、理解参数的类型、为局部数据类型设置参数的属性、为数据文件设置参数的属性、从已经存在的数据库中引入数据。

        除了GUI,以下的内容适合于各种类型的用户脚本。

        一、关于参数的定义在你录制程序运行的过程中,脚本生成器自动生成由函数组成的用户脚本。函数中参数的值就是在录制过程中输入的实际值。

        例如,你录制了一个Web应用程序的脚本。脚本生成器生成了一个声明,该声明搜索名称为“UNIX”的图书的数据库。当你用多个虚拟用户和迭代回放脚本时,也许你不想重复使用相同的值“UNIX”。那么,你就可以用参数来取代这个常量。结果就是你可以用指定的数据源的数值来取代参数值。数据源可以是一个文件,也可以是内部产生的变量。

        用参数表示用户的脚本有两个优点:① 可以使脚本的长度变短。② 可以使用不同的数值来测试你的脚本。例如,如果你企图搜索不同名称的图书,你仅仅需要写提交函数一次。在回放的过程中,你可以使用不同的参数值,而不只搜索一个特定名称的值。

        参数化包含以下两项任务:① 在脚本中用参数取代常量值。② 设置参数的属性以及数据源。

        参数化仅可以用于一个函数中的参量。你不能用参数表示非函数参数的字符串。另外,不是所有的函数都可以参数化的。

        二、参数的创建可以指定名称和类型来创建参数。不存在对脚本中参数个数的限制。在Web程序的用户脚本中,你可以使用如下过程在基于文本的脚本视图中创建参数。或者,也可以在基于图标的树形视图中创建参数。

        在基于文本的脚本视图中创建一个参数:1、 将光标定位在要参数化的字符上,点击右键。打开弹出菜单。

      2、 在弹出菜单中,选择“Replace with a Parameter”。选择或者创建参数的对话框弹出。

        3、 在“Parameter name”中输入参数的名称,或者选择一个在参数列表中已经存在的参数。

        4、 在“Parameter type”下拉列表中选择参数类型。

        5、 点击“OK”,关闭该对话框。脚本生成器便会用参数中的值来取代脚本中被参数化的字符,参数用一对“{}”括住。

        注意:在参数化CORBA或者General-Java 用户脚本的时候,必须参数化整个字符串,而不是其中的部分。另外注意:除了Web或者WAP,缺省的参数括号对于任何脚本都是 “{}”。你可以在“General Options”对话框中的“Parameterization”标签(Tools>General Options)中定义参数括号种类。

    6、 用同样的参数替换字符的其余情况,选中参数,点击右键,弹出菜单。从弹出的菜单中,选择“Replace More Occurrences”。搜索和替换对话框弹出。“Find What”中显示了你企图替换的值。“Replace With”中显示了括号中参数的名称。选择适当的检验框来匹配整个字符或者大小写。如果要搜索规则的表达式(。,!,?等等),选中“Regular Expression”检验框,然后点击“Replace”或者“Replace All”。

        注意:小心使用“Replace All”,尤其替换数字字符串的时候。脚本生成器将会替换字符出现的所有情况。

        7、 如果想用以前定义过的参数来替换常量字符串的话,选中该字符串,点击右键,然后选择“Use Existing Parameter”,子菜单“Use Existing Parameters”弹出。从子菜单“Use Existing Parameters”选择参数,或者用“Select from Parameter List”来打开参数列表对话框。

        注意:如果用以前定义过的参数来替换常量字符串的话,那么,使用“Parameter List”非常方便。同时,还可以查看和修改该参数的属性。

        8、 对于已经用参数替换过的地方,如果想取回原来的值,那么,就在参数上点击右键,然后选择“Restore Original value”。

        在Web用户脚本的树形视图中创建参数:1、将光标定位在企图参数化的地方,点击右键,从弹出的菜单中选择“Properties”。则相关的属性对话框打开。

        2、点击在要参数化的参量的旁边的“ABC”形状的图标。“Select or Create Parameter”对话框打开。

        3、在“Parameter name”中输入参数的名称,或者从列表中选择一个已经存在的参数。

        4、在“Parameter type”中输入参数的类型。

    5、点击“OK”关闭该对话框。用户脚本生成器会用参数来替换最初的字符串常量,并用一个表格形状的图标替换“ABC”形状的图标。

        6、要恢复参数化以前的值,点击图标,然后从弹出的菜单中选择“Undo Parameter”,则以前的值便会重现。

        三、定义参数的属性创建参数完成后,就可以定义其属性了。参数的属性定义就是定义在脚本执行过程中,参数使用的数据源。在Web用户脚本中,你既可以在基于文本的脚本视图中定义参数属性,也可以在基于图标的树形视图中定义参数属性。下面的过程将教你如何在基于本文的脚本视图中定义参数属性。

        在基于文本的脚本视图中定义参数属性步骤:1、 在参数上点击右键,有菜单弹出。

        2、 在弹出的菜单中,选择“Parameter Properties”。参数属性对话框打开,显示和当前参数类型相关的属性。

        3、 输入参数的属性值。

        4、 点击“Close”关闭参数属性对话框。

        在Web用户脚本的树形视图中定义参数的属性:1、 将关标定位在参数上,然后点击右键,选择“Properties”。属性对话框打开。

        2、 点击要定义属性的参数旁边的表格形状按钮,点击右键,选择“Parameter Properties”。参数属性对话框打开,和参数类型相关的属性显示出来。

        3、 输入参数的属性。

    4、 点击“Close”关闭参数属性对话框。

        使用参数列表:  使用参数列表可以在任意时刻查看所有的参数,创建新的参数、删除参数,或者修改已经存在参数的属性。

        1、 点击参数列表按钮或者用“Vuser>Parameter List”。参数列表对话框打开。

        2、 要创建新的参数,点击“New”按钮。新的参数则被添加在参数树中,该参数有一个临时的名字,你可以给它重新命名,然后回车。设置参数的类型和属性,点击“OK”,关闭参数列表对话框。

        注意:不要将一个参数命名为“unique”,因为这个名称是用户脚本生成器本身的。用户脚本生成器创建新的参数,但是不会自动用该参数在脚本中替换任意选中的字符串。

        3、 要删除已有的参数,那么,要先从参数树中选择该参数,点击“Delete”,然后确认你的行为即可。

        4、 要修改已有参数,那么,要先从参数树中选择该参数,然后编辑参数的类型和属性。

        四、理解参数的类型  在你定义参数属性的时候,要指定参数值的数据源。你可以指定下列数据源类型的任何一种:Internal Data―― 虚拟用户内部产生的数据。

        Data Files ――存在于文件中的数据。可能是已存在的文件或者是用脚本生成器新创建的。

        User-Defined Functions―― 调用外部DLL函数生成的数据  Internal Data包括以下几种:1、 Date/Time  Date/Time用当前的日期/时间替换参数。要指定一个Date/Time格式,你可以从菜单列表中选择格式,或者指定你自己的格式。这个格式应该和你脚本中录制的Date/Time格式保持一致。

     2、 Group Name  Group Name 用虚拟用户组名称替换参数。在创建scenario的时候,你可以指定虚拟用户组的名称。当从用户脚本生成器运行脚本的时候,虚拟用户组名称总是None. 3、 Load Generator Name  Load Generator Name用脚本负载生成器的名称替换参数。负载生成器是虚拟用户在运行的计算机。

        4. Iteration Number  Iteration Number用当前的迭代数目替换参数。

        5、 Random Number  Random Number用一个随机数替换参数。通过指定最大值和最小值来设置随机数的范围。

        6、 Unique Number  Unique Number用一个唯一的数字来替换参数。你可以指定一个起始数字和一个块的大小。

        7、 Vuser ID  Vuser ID用分配给虚拟用户的ID替换参数,ID是由Loadrunner的控制器在scenario运行时生成的。如果你从脚本生成器运行脚本的话,虚拟用户的ID总是-1.

        五、数据文件  数据文件包含着脚本执行过程中虚拟用户访问的数据。局部和全局文件中都可以存储数据。可以指定现有的ASCII文件、用脚本生成器创建一个新的文件或者引入一个数据库。在参数有很多已知值的时候数据文件非常有用。数据文件中的数据是以表的形式存储的。一个文件中可以包含很多参数值。每一列包含一个参数的数据。列之间用分隔符隔开,比如说,用逗号。  对数据文件设置参数属性  如果使用文件作为参数的数据源,必须指定以下内容:文件的名称和位置、包含数据的列、文件格式,包括列的分隔符、更新方法。  如果参数的类型是“File”,打开参数属性(Parameter Properties)对话框,设置文件属性如下:1、 在“File path”中输入文件的位置,或者点击“Browse”指定一个已有文件的位置。缺省情况下,所有新的数据文件名都是“parameter_name.dat”,注意,已有的数据文件的后缀必须是。dat.

        2、 点击“Edit”。记事本打开,里面第一行是参数的名称,第二行是参数的初始值。使用诸如逗号之类的分隔符将列隔开。对于每一新的表行开始一行新的数据。  注意:在没有启动记事本的情况下如果想添加列,就在参数属性对话框中点击“Add Col”,那么“Add new column”对话框就会弹出。输入新列的名称,点击“OK”。脚本生成器就会添加该列到表中,并显示该列的初始值。

        3、 在“Select Column”部分,指明包含当前参数数据的列。你可以指定列名或者列号。列号是包含你所需要数据的列的索引。列名显示在每列的第一行(row 0)。

        4、 在“Column delimiter”中输入列分隔符,你可以指定逗号、空格符等等。

        5、 在“First data line”中,在脚本执行的时候选择第一行数据使用。列标题是第0行。若从列标题后面的第一行开始的话,那就在“First data line”中输入1.如果没有列标题,就输入0.

        6、 在“Select next row”中输入更新方法,以说明虚拟用户在脚本执行的过程中如何选择表中的数据。方法可以是:连续的、随机的、唯一的、或者与其它参数表的相同行。

        6.1、 顺序(Sequential):该方法顺序地给虚拟用户分配参数值。如果正在运行的虚拟用户访问数据表的时候,它会取到下一行中可用的数据。

    6.2、 随机(Random):该方法在每次迭代的时候会从数据表中取随机数6.3、 使用种子取随机顺序(Use Random Sequence with Seed):如果从Loadrunner的控制器来运行scenario,你可以指定一个种子数值用于随机顺序。每一个种子数值在测试执行的时候代表了一个随机数的顺序。无论你何时使用这个种子数值,在scenario中同样的数据顺序就被分配给虚拟用户。如果在测试执行的时候发现了一个问题并且企图使用同样的随机数序列来重复测试,那么,你就可以启动这个功能(可选项)。

        6.4、 唯一(Unique):Unique方法分配一个唯一的有顺序的值给每个虚拟用户的参数。

        6.5 、与以前定义的参数取同一行(Same Line As ):该方法从和以前定义过的参数中的同样的一行分配数据。你必须指定包含有该数据的列。在下拉列表中会出现定义过的所有参数列表。注意:至少其中的一个参数必须是Sequential、Random或者Unique.如果数据表中有三列,三个参数定义在列表中:id1,name1和title1,如下:。

        ID Name Title 132 Kim Manager 187 Cassie Engineer 189 Jane VP对于参数id1,你可以指示虚拟用户使用Random方法,而为参数name1和title1就可以指定方法“Same Line as id1”。所以,一旦ID“132”被使用,那么,姓名(Name)“Kim”和职位(Title)“Manager”同时被使用。

        7、Updta value on数据的更新方法7.1、Each iteration――每次反复都要取新值。

        7.2、Each occurrence――只要发现该参数就要重新取值。

      7.3、Once――在所有的反复中都使用同一个值

        8、When out of values超出范围:(选择数据为unique时才可用到)

        8.1、Abort Vuser――中止8.2、Continue in a cyclic manner――继续循环取值8.3、Continue with last value――取最后一个值

        9、Allocate Vuser values in the Controller在控制器中分配值:(选择数据为unique时才可用到)

  • 软件测试及测试工具比较

    2008-09-16 10:40:05

    1、测试自动化实现到何种程度为好
    (1)、测试自动化的程度再高都不可能取代手工测试,即测试工具不可能取代测试人员;
    (2)、一般来讲,测试自动化在整个测试过程中只能占到30%左右;
    (3)、实现、运用自动化的程度还取决于各方面的资源,特别是软件的行业规范性和软件开发的稳定性;
    (4)、对于部分白盒测试可以使用测试工具,如对代码性能分析等;
    2、如何实现测试自动化的计划
    (1)、首先将测试的基本管理形成自动化,如BUG管理等;
    (2)、然后利用测试自动化工具来实现一些手工无法进行的测试活动,如:压力,并发,强度测试等;
    (3)、接着利用测试自动化工具来完成回归测试中的缺陷跟踪测试;
    (4)、再往后就可以利用测试自动化工具来记录两个版本的异同,以找出缺陷
    (5)、最后将整个回归测试都用自动化脚本保存,以完成每次的回归测试;
    (6)、而对于白盒测试则可以引入测试工具进行代码分析;
    3、对测试工具的使用现状及分析
    (1)、目前,软件测试方面的工具很多,主要有MercuryInteractive(MI)、Segue、Rational、 Compuware和Empirix等公司的产品,而MI公司的产品占了主流。以下就各种常用测试工具进行简要对比:
    主要厂商及其测试工具如下表:
    Mercury Interactive Winrunner、loadrunner、TestDirector、Astra QuickTest
    Rational Rational Purify (测试时用,检查运行时内存错误)
    Rational Quantify (性能检测工具,查出系统瓶颈以便改进运行速度)
    Rational TestManager (测试管理)
    Robot (软件测试用,通过scrīpt自动模拟输入输出)


    LoadTest
    TestFactory (软件测试用)
    Compuware QACenter、Perfromance Edition、EcoScope、TrackRecord
    Segue SilkTest
    Empirix eTest Suite
    以下从常见测试工具功能、使用范围、目前市场情况、应用前景等方面做简要比较:
    工具名称 功能范围
    WinRunner-----功能:
    1.插入检查点;
    2.检验数据;
    3.增强测试;
    4.分析结果;
    5.维护测试;、
    6.为无线应用作准备。
    范围:功能测试、生成测试用例、分析测试结果、维护测试用例、回归测试
    LoadRunner-----功能:
    1.松创建虚拟用户;
    2.创建真实的负载;
    3.定位性能问题;
    4.分析结果以精确定位问题所在;
    5.重复测试保证系统发布的高性能;
    6.Enterprise Java Beans的测试;
    7.支持无线应用协议;
    8.支持Media Stream应用;
    9.完整的企业应用环境的支持。
    范围:性能测试、压力测试、模拟多用户、定位性能瓶颈。


    TestDirector------功能:
    1.需求管理;
    2. 计划测试;
    3. 安排和执行测试;
    4. 缺陷管理;
    5. 图形化和报表输出;
    范围:测试管理工具
    Rational系列-------Rational Purify (测试时用,检查运行时内存错误);
    Rational Quantify(性能检测工具,查出系统瓶颈以便改进运行速度);
    Rational TestManager (测试管理);
    Robot (软件测试用,通过scrīpt自动模拟输入输出);
    LoadTest (负载测试);
    TestFactory (软件测试用);
    QACenter-----QACenter帮助所有的测试人员创建一个快速,可重用的测试过程。
    这些测试工具自动帮助管理测试过程,快速分析和调试程序,
    包括针对回归,强度,单元,并发,集成,移植,容量和负载.
    建立测试用例,自动执行测试和产生文档结果。
    QACenter主要包括以下几个模块:
    - QARun:应用的功能测试工具。
    - QALoad:强负载下应用的性能测试工具。
    - QADirector:测试的组织设计和创建以及管理工具。
    - TrackRecord:集成的缺陷跟踪管理工具。
    - EcoTools:高层次的性能监测工具。
    QARun----
    1.强大的测试脚本建立功能。
    2.可反复运行,进行回归测试。
    3.支持更多的应用访问


    QALoad------
    1.自动捕获实际执行过程,自动生成测试脚本
    2.通过控制台(安装在Windows NT)控制各个Agent(安装在Windows和Unix),进行脚本分配。
    3.模拟实际操作,压力测试。
    WebLoad-----Web压力测试工具
    (2)、对于测试工具目前的使用状况,总结就是,大家都处于学习阶段,部分虽有一些应用到工作中,但也是比较有限的,最主要是应用在性能测试方面;

    Tags: 软件测试  
  • 开放源代码的软件测试工具

    2008-09-16 10:37:31

       目前市场主流的测试工具管理软件,如Rational和Mercury的系列产品,大多比较昂贵。
    商业软件的优势主要表现在其售后服务和工具本身的强大和易用性上,而作为技术基础相对较好的测试人员,也可考虑使用开源的软件,这将为公司节省一大笔开支,必要时也有更好的扩展自由度。


    开源测试工具——功能测试工具

    Linux Test Project
    http://ltp.sourceforge.net/
    工具描述:
    Linux Test Project是一个测试Linux内核和内核相关特性的工具集合。该工具的目的是通过把测试自动化引入到Linux内核测试,提高Linux的内核质量。
    使用环境:
    Linux
    MaxQ
    http://maxq.tigris.org/
    工具描述:
    MaxQ是一个免费的功能测试工具。它包括一个HTTP代理工具,可以录制测试脚本,并提供回放测试过程的命令行工具。测试结果的统计图表类似于商用测试工具,比如Astra QuickTest和Empirix e-Test,这些商用工具都很昂贵。MaxQ希望能够提供一些关键的功能,比如HTTP测试录制回放功能,并支持脚本。
    使用环境:
    Java 1.2以上版本

    WebInject
    http://www.webinject.org/
    工具描述:
    WebInject是一个针对Web应用程序和服务的免费测试工具。 它可以通过HTTP接口测试任意一个单独的系统组件。可以作为测试框架管理功能自动化测试和回归自动化测试的测试套。
    使用环境:
    Windows, OS Independent, Linux
    开源测试工具——性能测试工具
    Apache JMeter
    http://jakarta.apache.org/jmeter/
    工具描述:
    Apache JMeter是100%的Java桌面应用程序,它被设计用来加载被测试软件功能特性、度量被测试软件的性能。设计Jmeter的初衷是测试Web应用,后来又扩充了其它的功能。Jmeter可以完成针对静态资源和动态资源(讹误女监, Servlets, Perl脚本, Java对象, 数据查询s, FTP服务等)的性能测试。。 Jmeter可以模拟大量的服务器负载、网络负载、软件对象负载,通过不同的加载类型全面测试软件的性能。Jmeter提供图形化的性能分析。
    使用环境:
    Solaris, Linux, Windows (98, NT, 2000). JDK1.4以上.

    DBMonster
    http://dbmonster.kernelpanic.pl/
    工具描述:
    DBMonster是一个生成随机数据,用来测试SQL数据库的压力测试工具。
    使用环境:
    OS Independent

    OpenSTA (Open System Testing Architecture)
    http://portal.opensta.org/index.php
    工具描述:
    基于CORBA的分布式软件测试构架。使用OpenSTA,测试人员可以模拟大量的虚拟用户。 OpenSTA的结果分析包括虚拟用户响应时间、web服务器的资源使用情况、数据库服务器的使用情况,可以精确的度量负载测试的结果。
    使用环境:
    OS Independent

    TPTEST
    http://tptest.sourceforge.net/about.php
    工具描述:
    TPTest的提供测试Internet连接速度的简单方法。
    使用环境:
    MacOS/Carbon、 Win32

    Web Application Load Simulator
    http://www.openware.org/loadsim/index.html
    工具描述:
    LoadSim是一个网络应用程序的负载模拟器
    使用环境:
    JDK 1.3以上
    开源测试工具——缺陷管理工具

    Mantis
    http://mantisbt.sourceforge.net/
    工具描述:
    Mantis是一款基于WEB的软件缺陷管理工具,配置和使用都很简单,适合中小型软件开发团队,关于Mantis的介绍文章参见51testing软件测试网顾问蔡琰的文章 《使用开源软件 Mantis 实施缺陷跟踪的成功实践》
    使用环境:
    MySQL, PHP

    Bugzilla
    http://www.mozilla.org/projects/bugzilla/
    工具描述:
    一款不错的软件缺陷管理工具。
    使用环境:
    TBC
    开源测试工具——测试管理工具
    TestLink
    http://testlink.sourceforge.net/docs/testLink.php
    工具描述:
    基于WEB的测试管理和执行系统。测试小组在系统中可以创建、管理、执行、跟踪测试用例,并且提供在测试计划中安排测试用例的方法。
    使用环境:
    Apache, MySQL, PHP
    Bugzilla Test Runner
    http://sourceforge.net/projects/testrunner/
    工具描述:
    Bugzilla Test Runner基于Bugzilla缺陷管理系统的测试用例管理系统
    使用环境:
    Bugzilla 2.16.3 or above

    Tags: 软件测试  
  • 软件测试过程中的工具使用

    2008-09-16 10:33:35

    软件测试过程中的工具使用

    摘要:软件测试是保证软件质量的重要手段,它在整个软件开发过程中占据了将近一半的时间和资源。在软件测试过程中合理的引入测试工具,能够加快测试进度,提高测试质量,实现更快、更好的开发软件产品的目标。本文介绍了覆盖软件测试各个阶段的测试工具,说明了每一类工具所应用的测试阶段,以及它能发挥的作用。

      Abstract:Software test is one measure to insure the quality of software, it costs half of time and resource in the whole process of development. If test tools can be used in the process, it would to improve the speed of test and the quality of test, It's probable to develop software rapidly and to produce high quality. In this document it introduces some software test tools for the different of test moment, it introduce the time for every kind of tools, but the function of the test tool.

      关键字:软件测试工具;测试设计;静态分析;单元测试;功能测试;性能测试;测试过程管理;

      Keywords:software test tool;test design;static analysis;unit test;function test;performance test;test process management;

      1、引言

       最近几年,软件测试在国内越来越受到重视,因为大家逐渐认识到了软件测试对于保证软件质量的重要性。随着对软件测试重视的提高,国内软件测试技术的发展也很快,逐渐从过去手工作坊式的测试向测试工程化的方向发展。

      要真正实现软件测试的工程化,其基础之一就是要有一大批支持软件测试工程化的工具。因此,软件测试工具对于实现软件测试的工程化来说至关重要。本文就从如何进一步提高软件测试质量和效率的角度出发,讨论测试工具在软件测试过程中的应用。

      2、为什么要引入测试工具

       在测试过程中引入测试工具能给我们带来以下的好处。

      2.1、提高工作效率

       这是引入测试工具给我们带来的一个显著好处。那些固定的、重复性的工作,可以由测试工具来完成,这样就使得测试人员能有更多的时间来计划测试过程,设计测试用例,使测试进行的更加完善。

      2.2、保证测试的准确性

       测试是需要投入大量的时间和精力的,人工进行测试时,经常会犯一些人为的错误,而工具的特点恰恰能保证测试的准确性,防止人为疏忽造成的错误。

      2.3、执行困难的测试工作

       有一些测试工作,人工进行是很困难的。有的是因为进行起来较为复杂,有的是因为测试环境难以实现。测试工具可以执行一些通过手工难于执行,或者是无法执行的测试。

      3、测试工具在软件测试过程中的具体应用

       在这一部分,我们讨论测试工具在测试过程中的具体应用。

      现在的测试工具很多,基本上覆盖了各个测试阶段。按照工具所完成的任务,可以分为以下几大类:测试设计工具、静态分析工具、单元测试工具、功能测试工具、性能测试工具、测试过程管理工具。下面,我们就针对每一类工具展开介绍。

      3.1、测试设计工具

       测试设计工具,更完整的名称应该是测试用例设计工具,是一种帮助我们设计测试用例的软件工具。

      设计测试用例是一项智力性的活动,工具如何能够代替呢?确实是这样,但仔细思考一下我们就会发现,很多设计测试用例的原则、方法是固定的,比如等价类划分、边界值分析、因果图等等,这些成型的方法,很适合通过软件工具来实现。

      测试用例设计工具按照生成测试用例时数据输入内容的不同,可以分为:基于程序代码的测试用例设计工具和基于需求说明的测试用例设计工具。下面分别对这两类工具进行介绍。

      3.1.1、基于程序代码的测试用例设计工具

       基于程序代码的测试用例设计工具是一种白盒工具,它读入程序代码文件,通过分析代码的内部结构,产生测试的输入数据。这种工具一般应用在单元测试中,针对的是函数、类这样的测试对象。由于这种工具与代码的联系很紧密,所以,一种工具只能针对某一种(些)编程语言。

      这类工具的局限性是——只能产生测试的输入数据,而不能产生输入数据后的预期结果,这个局限也是由这类工具生成测试用例的机理所决定的。所以,基于程序代码的测试用例设计工具所生成的测试用例,还不能称之为真正意义上的测试用例。不过即使这样,这种工具仍然为我们设计单元测试的测试用例提供了很大便利。

      3.1.2、基于需求说明的测试用例设计工具

       这种测试用例设计工具,依据软件的需求说明,生成基于功能需求的测试用例。这种工具所生成的测试用例既包括了测试输入数据,也包括预期结果,是真正完整的测试用例。

      使用这种测试用例设计工具生成测试用例时,需要人工的事先将软件的功能需求转化为工具可以理解的文件格式,再以这个文件作为输入,通过工具生成测试用例。在使用这种测试用例设计工具来生成测试用例时,需求说明的质量是很重要的。

      由于这种测试用例设计工具是基于功能需求的,所以可用来设计任何语言、任何平台的任何应用系统的测试用例。

      我们来看一个这类工具的例子——SoftTest。在使用SoftTest生成测试用例时,先将软件功能需求转化为文本形式的因果图,然后让SoftTest读入,SoftTest会根据因果图自动生成测试用例。在这个过程中,工具的使用者只需要完成由功能需求到因果图的转化,至于如何使用因果图来生成测试用例,则完全由Softtest完成。

      所有测试用例设计工具都依赖于生成测试用例的算法,工具比使用相同算法的测试人员设计的测试用例更彻底、更精确,这方面工具有优势。但人工设计测试用例时,可以考虑附加测试,可以对遗漏的需求进行补充,这些是工具无法做到的。所以,测试用例设计工具并不能完全代替测试工程师来设计测试用例。使用这些工具的同时,再人工的检查、补充一部分测试用例,会取得比较好的效果。

      3.2、静态分析工具

       一提到软件测试,人们的第一印象就是填入数据、点击按钮等这些功能操作。这些测试工作确实是重要的,但它们不是软件测试的全部。与这种动态运行程序的测试相对应,还有一种测试被称为静态测试,也叫做静态分析。

      进行静态分析时,不需要运行所测试的程序,而是通过检查程序代码,对程序的数据流和控制流信息进行分析,找出系统的缺陷,得出测试报告。

      进行静态分析能切实提高软件的质量,但由于需要分析人员阅读程序代码,使得这项工作进行起来工作量又很大。对软件进行静态分析的测试工具在这种需求下也就产生了。现在的静态分析工具一般提供以下两个功能:分析软件的复杂性、检查代码的规范性。

      软件质量标准化组织制定了一个ISO/IEC9126质量模型,用来量化的衡量一个软件产品的质量。该软件质量模型是一个分层结构,包括质量因素、质量标准、质量度量元三层。质量度量元处于质量模型分层结构中的最底层,它直接面向程序的代码,记录的是程序代码的特征信息,比如函数中包含的语句数量、代码中注释的数量。质量标准是一个概括性的信息,它比质量度量元高一级,一个质量标准由若干个质量度量元组成的。质量因素由所有的质量标准共同组成,处于软件质量模型的最高层,是对软件产品的一个总体评价。具有分析软件复杂性功能的静态分析工具,除了在其内部包含上述的质量模型外,通常还会从其它的质量方法学中吸收一些元素,比如Halstend质量方法学、McCabe质量方法学。这些静态分析工具允许用户调整质量模型中的一些数值,以更加符合实际情况的要求。

      在用这类工具对软件产品进行分析时,以软件的代码文件作为输入,静态分析工具对代码进行分析,然后与用户定制的质量模型进行比较,根据实际情况与模型之间的差距,得出对软件产品的质量评价。

    具有检查代码规范性功能的静态分析工具,其内部包含了得到公认的编码规范,比如函数、变量、对象的命名规范,函数语句数的限制等等,工具支持对这些规范的设置。工具的使用者根据情况,裁减出适合自己的编码规范,然后通过工具对代码进行分析,定位代码中违反编码规范的地方。

      以上就是静态分析工具所具有的功能。与人工进行静态分析的方式相比,通过使用静态分析工具,一方面能提高静态分析工作的效率,另一方面也能保证分析的全面性。

      3.3、单元测试工具

      单元测试是软件测试过程中一个重要的测试阶段。与集成测试、确认测试相比,在编码完成后对程序进行有效的单元测试,能更直接、更有效的改善代码质量。

      进行单元测试不是一件轻松的事。一般来讲,进行一个完整的单元测试所需的时间,与编码阶段所花费的时间相当。进行单元测试时,根据被测单元(可能是一个函数,或是一个类)的规格说明,设计测试用例,然后通过执行测试用例,验证被测单元的功能是否正常实现。除此之外,在单元测试阶段,我们还需要找出那些短时间不会马上表现出来的问题(比如C++代码中的内存泄露),还需要查找代码中的性能瓶颈,并且为了验证单元测试的全面性,我们还想了解单元测试结束后,我们的测试所达到的覆盖率。

      针对这些在单元测试阶段需要做的工作,各种用于单元测试的工具就产生了。典型的单元测试工具有以下几类:动态错误检测工具、性能分析工具、覆盖率统计工具。

      动态错误检测工具,用来检查代码中类似于内存泄露、数组访问越界这样的程序错误。程序功能上的错误比较容易发现,因为它们很容易表现出来。但类似于内存泄露这样的问题,因为在程序短时间运行时不会表现出来,所以不易发现。遗留有这样问题的单元被集成到系统后,会使系统表现的极不稳定。

      性能分析工具,记录被测程序的执行时间。小到一行代码、一个函数的运行时间,大到一个exe或dll文件的运行时间,性能分析工具都能清晰的记录下来。通过分析这些数据,能够帮助我们定位代码中的性能瓶颈。

      覆盖率统计工具,统计出我们当前执行的测试用例对代码的覆盖率。覆盖率统计工具提供的信息,可以帮助我们根据代码的覆盖情况,进一步完善测试用例,使所有的代码都被测试到,保证单元测试的全面性。

      动态错误检测工具、性能分析工具、覆盖率统计工具的运行机理是:用测试工具对被测程序进行编译、连接,生成可执行程序。在这个过程中,工具会向被测代码中插入检测代码。然后运行生成的可执行程序,执行测试用例,在程序运行的过程中,工具会在后台通过插入被测程序的检测代码收集程序中的动态错误、代码执行时间、覆盖率信息。在退出程序后,工具将收集到的各种数据显示出来,供我们分析。

      目前被普遍使用的单元测试工具中有Compuware公司的NuMega DevPartner Studio,Rational公司的Rational Suite Enterprise。这些软件产品都是一个工具套件,其中包含了我们前面所讨论的动态错误检测工具、性能分析工具、覆盖率统计工具等。

      3.4、功能测试工具

      在软件产品的各个测试阶段,通过测试发现了问题,开发人员就要对问题进行修正,修正后的软件版本需要再次进行测试,以验证问题是否得到解决,是否引发了新的问题,这个再次进行测试的过程,称为回归测试。

      由于软件本身的特殊性,每次回归测试都要对软件进行全面的测试,以防止由于修改缺陷而引发新的缺陷。进行过回归测试人都会深有体会,回归测试的工作量是很大的,而且也很乏味,因为要将上一轮执行过的测试原封不动的再执行一遍。设想一下,如果能有一个机器人,就象播放录影带一样,忠实的将上一轮执行过的测试原封不动的在软件新版本上重新执行一遍,那就太好了。这样做,一方面,能保证回归测试的完整、全面性,测试人员也能有更多的时间来设计新的测试用例,从而提高测试质量;另一方面,能缩短回归测试所需要的时间,缩短软件产品的面市时间。功能测试自动化工具就是一个能完成这项任务的软件测试工具。

      功能测试自动化工具理论上可以应用在各个测试阶段,但大多数情况下是在确认测试阶段中使用。功能测试自动化工具的测试对象是那些拥有图形用户界面的应用程序。

      一个成熟的功能测试自动化工具要包括以下几个基本功能:录制和回放、检验、可编程。

      录制,就是记录下对软件的操作过程,回放,就是象播放电影一样重放录制的操作。启动功能测试自动化工具,打开录制功能,依照测试用例中的描述一步一步的操作被测软件,功能测试自动化工具会以脚本语言的形式记录下你操作的全过程。依照此方法,可以将所有的测试用例进行录制。在需要重新执行测试用例时,回放录制的脚本,功能测试自动化工具依照脚本中的内容,操作被测软件。除了速度非常快之外,通过功能测试自动化工具执行测试用例与人工执行测试用例的效果是完全一样的。

      录制只是实现了测试输入的自动化。一个完整的测试用例,由输入和预期输出共同组成。所以,光是录制回放还不是真正的功能测试自动化。测试自动化工具中有一个检验功能,通过检验功能,在测试脚本中设置检验点,使得功能测试自动化工具能够对操作结果的正确性进行检验,这样,就实现了完整的测试用例执行自动化。软件界面上的一切界面元素,都可以作为检验点来对其进行检验,比如文本、图片、各类控件的状态等。

      脚本录制好了,也加入了检验点,一个完整的测试用例已经被自动化了。但我们还想对脚本的执行过程进行更多的控制,比如依据执行情况进行判断,从而执行不同的路径,或者是对某一段脚本重复执行多次。通过对录制的脚本进行编程,可以实现上述的要求。现在的主流功能测试自动化工具都支持对脚本的编程。象传统的程序语言一样,在功能测试自动化工具录制的脚本中,可加入分支,循环,函数调用这样的控制语句。通过对脚本进行编程,能够使脚本更加灵活,功能更加强大,脚本的组织更富有逻辑性。在传统的编程语言中适用的那些编程思想,在组织测试自动化脚本时同样适用。

      在测试过程中,使用功能测试自动化工具的大体过程是这样的:

      ●准备录制

      保证所有要自动化的测试用例已经设计完毕,并形成文档。

      ●进行录制

      打开功能测试自动化工具,启动录制功能,按测试用例中的输入描述,操作被测试应用程序。

      ●编辑测试脚本

      通过加入检测点、参数化测试,以及添加分支、循环等控制语句,来增强测试脚本的功能,使将来的回归测试真正能够自动化。

      ●调试脚本

      调试脚本,保证脚本的正确性。

      ●在回归测试中运行测试

      在回归测试中,通过功能测试自动化工具运行脚本,检验软件正确性,实现测试的自动化进行。

      ●分析结果,报告问题

      查看测试自动化工具记录的运行结果,记录问题,报告测试结果。

      功能测试自动化工具是软件测试工具中非常活跃的一类工具,现在发展的已经较为成熟,象Mercury Interactive公司的WinRunner,Rational公司的Robot,都是被广泛使用的功能测试自动化工具。

      3.5、性能测试工具

       通过性能测试,检验软件的性能是否达到预期要求,是软件产品测试过程中的一项重要任务。性能测试用来衡量系统的响应时间、事务处理速度和其它时间敏感的需求,并能测试出与性能相关的工作负载和硬件配置条件。通常所说的压力测试和容量测试,也都属于性能测试的范畴,只是执行测试时的软、硬件环境和处理的数据量不同。

      对系统经常会进行的性能测试包括:系统能承受多少用户的并发操作;系统在网络较为拥挤的情况下能否继续工作;系统在内存、处理器等资源紧张的情况下是会否发生错误,等等。由于性能测试自身的特点,完全依靠人工执行测试具有一定的难度。比如,我们要检验一个基于Web的系统,在10000个用户并发访问的情况下,是否能正常工作。如果通过人工测试的方式,很难模拟出这种环境。在这种情况下,就需要使用性能测试工具。

      使用性能测试工具对软件系统的性能进行测试时,大体分为以下几个步骤:

      首先,录制下软件产品中要对其进行性能测试的功能部分的操作过程。这一步与前面我们讨论过的功能测试自动化工具中的那个录制过程很相似。功能录制结束后,会形成与操作相对应的测试脚本。

      然后,根据具体的测试要求,对脚本进行修改,对脚本运行的过程进行设置,如设置并发的用户数量、网络的带宽,使脚本运行的环境与我们实际要模拟的测试环境一致。

      最后,运行测试脚本。性能测试工具会在模拟的环境下执行我们所录制的操作,并实时的为我们显示与被测软件系统相关的各项性能数据。

      性能测试工具实际上是一种模拟软件运行环境的工具,它能帮助我们在实验室里搭建出我们需要的测试环境。现在,基于Web是软件系统发展的一个趋势,性能测试也就变的比以往更加重要了,性能测试工具也自然会在软件测试过程中被更多的使用。

      3.6、测试过程管理工具

       软件测试贯穿于整个软件开发过程,按照工作进行的先后顺序,测试过程可分为制定计划、测试设计、测试执行、跟踪缺陷这几个阶段。在每个阶段,都有一些数据需要保存,人员之间也需要进行交互。测试过程管理工具就是一种用于满足上述需求的软件工具,它管理整个测试过程,保存在测试不同阶段产生的文档、数据,协调技术人员之间的工作。

      测试过程管理工具一般都会包括以下这些功能:管理软件需求、管理测试计划、管理测试用例、缺陷跟踪、测试过程中各类数据的统计和汇总。

      市面上商用的测试管理工具有很多,基本上都是基于Web的系统,这样更利于跨地区团队之间的协作。

      4、正确认识测试工具的作用

      如果一个现在正在从事软件测试工作,但在测试过程中还没有使用过测试工具的人看到以上的这些内容,可能会非常兴奋,因为他觉的只要在测试过程中引入相关的测试工具,那些一直困扰他们测试团队的问题就都能轻松解决了。

      在业内经常会有这种想法,认为通过引入一种新的技术,就能解决面临的所有问题了。这种想法,忽视了除技术以外我们仍然需要做的工作。软件测试工具确实能提高测试的效率和质量,但它并不是能够解决一切问题的灵丹妙药。

      软件测试工具能在测试过程中发挥多大的作用,取决于测试过程的管理水平和人员的技术水平。测试过程的管理水平和人员的技术水平都是人的因素,是一个开发组织不断改进,长期积累的结果。如果一个测试组织的测试过程管理很混乱,人员缺乏经验,那么不必忙于引入各种测试工具,这时首先应该做的是改进测试过程,提高测试人员的技术水平,待达到一定程度后,再根据情况逐步的引入测试工具,进一步的改善测试过程,提高测试效率和质量。

      5、结束语

      软件测试在整个软件开发过程中占据了将近一半的时间和资源。通过在测试过程中合理的引入软件测试工具,能够缩短软件开发时间,提高测试质量,从而更快、更好的为用户提供他们需要的软件产品。
Open Toolbar