发布新日志

  • 性能测试乱弹

    2017-11-16 08:34:02

       性能测试是软件测试中非常重要的一种测试类型,相对而言技术性较强。有些尚未入门的同行可能很向往却不知如何入手,或者有一定经验的同行仍不太明了什么是性能测试或如何做有效的性能测试。
       性能测试是什么?个人认为性能测试就是模拟用户使用场景验**效率是否满足要求。
    1、性能测试不一定就是并发测试,如客户端不是并发也存在性能问题,如移动端通讯录要加载大量的人员,可能导致加载渲染性能急剧下降甚至崩溃闪退,这是大数据量导致的性能问题。2、模拟用户场景,有些同行一说性能测试就想到loadrunner测试,甚至等价。其实只要能很好地模拟出用户场景即可,即使手工完成模拟操作。当然好的测试工具不仅提高效率,测试结果也更加准确。3、用户场景:必须让模拟符合用户场景,如用户场景基本是命中缓存而模拟却总是从数据库获取,这是无效的测试(除非目标就是压数据库)4、验**效率,这个涉及到性能测试的3个层次:1>模拟测试后得出性能指标及基本资源(如服务器的资源)的监控数据,此为最基本的性能测试;2>获取更多的资源使用数据如数据库、中间件等,并能从中分析出性能瓶颈大概位置,起码可定位瓶颈是否在服务器、网络、程序或数据库;3>进一步明确性能瓶颈位置,非程序以外的瓶颈能自行优化,甚至协助开发同事或自行优化程序代码 。5、满足要求,需要获取性能目标如通过以往的运营数据或需求数据来确定性能目标,同时转化成性能测试目标,即与当前测试环境匹配的性能目标。
       如何入门性能测试?根据性能测试的层次,入门则是先达到第1个层次,模拟场景并获取性能数据。目前大部分应用都是采用http协议,建议先学习http协议(熟悉此协议对任何测试类型都有莫大的帮助)才能明白测试脚本是什么东西(有些初学者甚至有一定经验的同行,发现loadrunner无法录制就举手无措就是因为不了解什么是协议)。解决脚本问题后则需要学习服务器相关东西,才能监控理解服务器资源使用情况。至此可基本完成第一层次的性能测试。
       性能测试进阶,则根据3个性能测试层次学习相关知识或技术,入门后则靠各自修行了。
       性能测试涉及的知识面非常广(测试本身就是涉及东西非常广,容易变成万金油,所以要有意识发掘加强专长),建议根据需要学习了解如下知识或技术:
    1、通信协议,起码了解TCP熟悉HTTP协议;2、相关网络知识;3、服务器如linux相关;4、数据库如常见的mysql、mongodb或缓存如mencache;5、中间件或容器相关知识如weblogic、tomcat或jvm相关知识(java应用);6、代码,虽然排在最后可它却是最核心的,只是测试职业在这方面是弱势(需要关注太多非代码以外的东西如以上5点)。
  • MySQL索引优化总结

    2017-10-31 08:28:28

         索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。常见比喻是数据库索引好比是一本书前面的目录,能加快数据库的查询速度。那么为什么查索引比查记录要快呢?一是索引的算法不必整个索引扫描后才能定位到记录而扫描记录则必须全部扫描完,另外一个索引字段少文件小加载进内存更快甚至常驻内存。《高性能MySQl》书中提到MySQL索引对某个查询是否合适的三星索引评估准则,索引将相关行放在一起(避免扫描更多的索引)则可获取一星,返回结果都在索引中(避免再查表) 则获取两星,索引顺序与查询要求的返回顺序相同(避免再排序)则获得三星,优化时可参考朝这3个方面去优化。

         是否需要创建索引?1、索引并不是越多越好,特别是OLTP型的,因为更新(插入、删除、更新)数据时均可能要更新索引,那么整体更新时间就增加了,一般情况下索引越多更新数据越慢。2、数据量不多(一般不上万,还要跟表的关,如相当多字段又另当别论了)时也可不必创建索引,因为直接扫描数据可以比扫描索引再找数据更快。3、如果字段的索引基数很小,创建索引也没太多意义,甚至更慢。4、频繁更新的字段建议不使用索引,因为更新时也要更新索引,甚至导致B-Tree或B+Tree的分裂重组则更慢了。5、字段不在where中出现是不需要添加索引, where后含IS NULL   like ‘%输入符%’等条件,也不建议使用索引,因为 like "%_" 百分号在前不走索引, B-tree索引 is null不走索引(is not null会走,位图索引 is null,is not null 则都会走索引)6、 where 子句里对索引列使用不等于(<>),要看字段的数据情况,因为很多时候覆盖索引比直接扫描更慢,可能不走索引。

         如何创建索引?创建索引的方式一般有如下3种:1、创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);2、修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);3、创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) )。创建索引时首先需要分析确认是否需要创建索引(参考上文),除了where,关联查询时join的字段一般也需要添加索引。然后考虑是创建单索引还是组合索引,注意索引的最左前缀原则即查询条件必须包括索引的最左部分。最后创建索引后通过查看执行计划验证是否有走索引,或通过强制走索引的方式验证是否有提高效率。
         索引是否有应用?创建完索引后还需要考虑此索引面向哪些查询,是否都有效(是否应用及效率是否有提高)。 MySQL查询优化器是基于代价(cost-based)的查询方式,根据查询语句依据多种索引,计算查询需要的代价,从而选择最优的索引方式生成查询计划。所以可能出现有索引却并未应用上的情况,不应用的场景总结主要如下:
    1. 如果条件中有or,即使其中有部分条件带索引也不会使用。要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引(出现索引合并的话可能性能理差)。
    2. 组合索引,要符合最左前缀才会应用。
    3. like查询是以%开头不会应用索引。
    4. where 子句里对索引列上有数学运算,用不上索引。
    5. where 子句里对有索引列使用函数,用不上索引。
    6. 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。如查询的数量是大表的大部分,应该是30%以上;或是小表。
    7. 统计数据不真实,需要用analyze收集统计信息
    8. 隐式转换导致索引失效,也是开发中经常会犯的错误。由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给数据库,这样会导致索引失效.
    9. not in ,not exist可能不会用索引,参数6。
    10. B-tree索引 is null不走索引(is not null会走,位图索引 is null,is not null 则都会走索引)





  • json schema 测试

    2017-10-24 08:09:53

        最近在开发接口自动化测试工具时,发现restFull接口测试工具中提供了json schema的测试,特意去了解json schema。

        Json schema 于json 类似于xml schema 于 xml,用于定义如何基于 JSON 格式描述 JSON 数据结构的规范,从而可利用此 数据校验、文档生成和接口数据交互控制等。如果接口返回的数据格式是json,那么我们就可以创建json schema来校验接口返回的数据是否满足要求,可校验必需字段是否返回,字段类型是否正确,值是否满足要求如大小、范围或要求包含某些值等。如此,我们便可实现大部分接口测试用例。

        json schema定义的主要关键字如下( draft 4版本):
    关键字描述
    $schemaThe $schema 关键字状态,这种模式被写入草案V4规范。
    title将使用此架构提供一个标题
    description架构的一点描述
    type我们 JSON 数据类型关键字定义的第一个约束条件:它必须是一个JSON对象
    properties定义各个键和它们的值类型,最小和最大值中要使用JSON文件
    required这样可以使所需的属性的列表
    minimum这是约束的值,并代表可接受的最小值
    exclusiveMinimum如果“exclusiveMinimum”的存在,并且具有布尔值true的实例是有效的,如果它是严格的最低限度的值
    maximum这是约束的值被提上表示可接受的最大值
    exclusiveMaximum如果“exclusiveMaximum”的存在,并且具有布尔值true的实例是有效的,如果它是严格的值小于“最大”。
    multipleOf数值实例有效反对“multipleOf”分工的实例此关键字的值,如果结果是一个整数。
    maxLength字符串实例的长度被定义为字符的最大数目
    minLength字符串实例的长度被定义为字符的最小数目
    patternString实例被认为是有效的,如果正则表达式匹配成功实例

        json schema的经典样例如下:
    {
        "$schema": "http://json-schema.org/draft-04/schema#",

        "title": "Product",

        "description": "A product from Acme's catalog",

        "type": "object",

        "properties": {

            "id": {

                "description": "The unique identifier for a product",

                "type": "integer"

            },

            "name": {

                "description": "Name of the product",

                "type": "string"

            },

            "price": {

                "type": "number",

                "minimum": 0,

                "exclusiveMinimum": true

            }

        },
        "required": ["id", "name", "price"]}

        json schema 校验json字符串是否满足要求,则是通过校验关键字去校验,如required,是否必需,maxItems用于校验数组的大小等,详细请见https://datatracker.ietf.org。所以我们要创建好json schema才能根据要求去校验数据,https://jsonschema.net/#/editor可用于生成json schema不过因google被墙可能无法正常使用,亦可搜索其它生成工具。
  • 接口自动化测试工具研发

    2017-10-13 08:07:58

       此前做接口自动化测试用了不少工具,如selenium、robotframwrok+httplib、soapUI、jmeter等,总是在脚本与数据分离、脚本维护、前置数据及结果校验等问题上不能如意。为此,决定自己研发一个接口自动化测试工具以更好地解决以上问题,并实现测试配置的方法实现可以不同环境运行。

       工具主要分前端界面与执行引擎。前端界面采用BS架构,在浏览器上创建项目、接口定义、测试数据、测试配置以及执行计划等,后端主要是执行引擎,可基于HttpClient、okHttp、rest-assured等封装好的http请求组件(不用自己造轮子,而且在多线程处理及性能上往往不如封装好的组件)。执行时,执行引擎读取测试接口及数据构造http请求,然后再根据测试数据中配置的检查点进行检查,从而完成整个测试过程。

       此时,工具的基本框架已完成,解决脚本与数据分离、脚本维护(只需维护接口定义)问题。前置数据即是用例执行前的初始化动作,目前设计是通过三种方式实现。一、通用数据如账号密码那些则通过自定义的配置项传入,并缓存起来供测试过程中调用(如脚本中通过?{#client_id}方式调用),从而实现在不同环境中运行;二、自定义函数,此主要是与业务相关的,如接口测试在审批某个流程,此前的流程在初始化方法中调用自定义函数完成初始化操作或返回数据给测试用例。函数可实现某个业务操作或直接操作数据库(非测试环境可能不允许),但函数都需要在工具中定义(也曾考虑在前端编写函数存入数据库,执行时再调用,但考虑到函数需要调试,直接在工具中编写调试更方便,由此则出现工具与业务混杂的问题。当然也可将业务相关的迁移到另外一个工具中由测试工具调用,没有将工具产品化的计划就不折腾了)。三、执行其它测试用例作为初始化动作或获取相关数据。 目前三种方式基本可解决前置数据或初始化操作的问题,但测试数据中可能会较多的函数调用或参数调用,没那么直观,而且自定义函数需要一定的编码功能才能完成。

       结果校验也有两种方式实现。一、基本校验:如校验http返回状态码,校验返回数据是否存在(如果返回的是json字符串,建议基于rest-assured 实现执行引擎,此组件已封装有不少校验);二、自定义函数:可通过自定义函数进行业务检查或直接查询数据库方式进行验证,如果返回的是json字符串,可实现校验json schema,这个非常方便校验返回的字段及类型。

       此外,再加上查看测试报告、定时执行以及发送测试结果等辅助功能,工具基本成型。目前工具在试用完善中,待实践验证后或可开源出来供大家参考。
  • 10年测试路-困

    2017-10-11 07:59:04

       曾几何时,对5年工作经验的同事敬仰有加-“工作那么久了"。如今,悄无声息地自己工作10年了,似乎只剩下困,突然得有点不知所措。

       困难。 作为小公司的测试经理,突然感觉职业前景不明朗了。下个目标是大公司测试总监?空降测试总监的可能性不大,除非在业界非常知名,所以在小公司工作一段时间后建议尽早去大公司就职,上升空间更大。所以年初曾去大公司就职,想往大公司测试总监准备。谁料,大公司加班强度太大、不喜欢上级的管理风格等因素4个多月后离职了,再度回到小公司,就业后唯一不快且遗憾的就职经历。但即使成为测试总监,似乎到头了,测试在IT公司中很难再有更高的职位了并且较难转去其它职能,没有想力的职业前景形成职业发展瓶颈与心理瓶颈。

       困惑。10年后的自己该何去何从?从未有过的困惑萦绕不断。继续在IT行业工作,测试职业前景并没有太多想象空间。转去做开发还来得及吗?转去做产品?或许也是一条路,但一般产品的前景似乎并不好多少。如果合适转销售或许也是个选择,销售成为公司核心高层还是很常见的。
       如果继续走测试职业道路,那牛逼的测试是如何的呢?理论上还是技术上?疑惑中。提高开发测试比?牛逼的测试方式?困惑中,或许我应该跳出测试的圈子,整个研发角度考虑这个问题。另外,转行能做什么?自己有什么优势?IT创业中软件测试基本忽略了?更无法成为真核心。或许跳出IT研发创业的圈子,IT应用创业的圈子或许是个方向。

       困。 困难或困或的根本原因是觉得测试职业前景没有想象力,或许这也自己纠结测试开发的比较有关,一直为此心累。很多时候,测试与开发从薪酬、职位、发语权等方面去比较,不仅测试人员比较,外部人员一样会去比较,甚至有时都不好意思说自己是做软件测试。并不是不自信,似乎地球人都知道,与开发各方面比较测试都是占下风。大家都认为是干不了开发所以去做测试,但坦白说大部分同行确实如此。
       IT最终输出就是软件,软件最重要的技术能力就是编码,是基础也是核心,而软件测试却远离了它。所以IT公司可以没有测试但不能没有开发,IT创业也是如此,往往基于成本等考虑确实不会有测试。所以,感觉测试很鸡肋,在公司越高层的测试职业越有有明显体会。
       计算机科学与技术作为我第二学位,虽然并未荒废但此前并未考虑以此为职业,就业时匆忙选择了不甚了解的软件测试,以为真像传说中的“测试像医生一样,越老越吃香”。其实刚工作不久,有同事直接转去做开发或专门辞职学习再转开发,自己却想着“行行出状元”,或许也是惰性使然,无语中... 所以现在跟刚毕业或毕业不久的同学聊天,都建议尽量选择开发职业,即使你想往测试方向发展。

       曾经以为注重职业规划,规划并努力学习相关技术,最终发现数据库相关技术可能不如专业DBA,服务器相关技术不如专业的实施,编码不如开发人员,而测试理论相关却并没有太高的门槛,自己似乎成了个万金油,10年后只剩下3个困。不怀疑软件测试的价值,但怀疑软件测试的职业!
  • 使用VBS直接读取loadrunner 结果MDB文件

    2011-04-07 17:09:14

    Dim Conn

    Dim Rst

    set Conn=CreateObject("Adodb.Connection")
    Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\Work\test\result\gdkkx\运行数据查询\运行数据查询.mdb"
    Set Rst=CreateObject("Adodb.RecordSet")

    Rst.Open "Select * from Result",Conn

    Do while not Rst.EOF:
      scenario  = Rst.Fields("Scenario Name").Value
      name      = Rst.Fields("Result Name").Value
      tz        = Rst.Fields("Time Zone").Value / 3600
      startTime = Rst.Fields("Start Time").Value
      endTime   = Rst.Fields("Result End Time").Value
      Rst.MoveNext

    Loop

    Wscript.Echo " "
    Wscript.Echo "  Scenario: %s " & scenario
    Wscript.Echo "    Run ID: %s " &  name
    Wscript.Echo "        TZ: %s " &  tz
    Wscript.Echo "Start Time: %s " &  time.asctime(time.localtime(startTime))
    Wscript.Echo "  End Time: %s " &  time.asctime(time.localtime(endTime))

  • 诚聘软件测试工程师[广州]

    2009-12-15 17:39:13

    公司名称:广州粤能电力科技开发有限公司

        
    本公司主要面向广东电网和南方电网开展业务,现有员工300多人,业务量充沛,

    福利待遇稳定有保障(五险一金齐全,有项目提成等激励机制),发展前景较好。

    工作内容:软件功能和性能测试

    联系人:梁先生

    QQ:164685500(
    注明:应聘)

    座机:020-85124034

    邮箱:liangzhihong1984@126.com

    岗位描述:

    岗位一
    岗位名称:高级软件测试工程师(2人)

    学历要求:大学本科或以上学历 

    岗位描述:

    1
    、参与软件产品的需求分析,负责测试计划与测试方案制定;
    2
    、带领其他测试工程师执行项目测试;
    3
    、执行软件产品的性能测试和分析,预测系统性能瓶颈,风险和安全隐患;

    岗位要求 

    1
    、计算机相关专业,本科或以上学历;3年以上软件性能测试工作经验; 
    2
    、有担当软件性能测试项目负责人经验者优先;
    3
    、精通测试用例设计,掌握系统性能测试方法;
    4
    、精通相关测试工具(WinrunnerLoadRunnerSilkPerformer 
    5
    、精通QC或相关测试以及缺陷管理工具 
    6
    、具有良好的沟通能力和较强的分析和总结软件问题的能力
    7
    、有开发经验者优先考虑


    岗位二
    岗位名称:软件测试工程师(4人)

    学历要求:大学本科或以上学历 

    岗位描述:

    1
    、参与软件产品的需求分析,负责测试计划与测试方案制定;
    2
    、执行项目测试;
    3
    、执行软件产品的性能测试和分析,预测系统性能瓶颈,风险和安全隐患;

    岗位要求 

    1
    、计算机相关专业,本科或以上学历;
    2
    、掌握测试用例设计,掌握系统性能测试方法;
    3
    、掌握相关测试工具(WinrunnerLoadRunnerSilkPerformer );
    4
    、熟悉Oracle,SQL ServerDB2数据库中的一种或多种;
    4
    、掌握QC或相关测试以及缺陷管理工具; 
    5
    、具有良好的沟通能力和分析总结软件问题的能力、有开发经验者优先考虑

  • Tomcat ssl安全证书配置

    2009-07-12 21:26:12

        话说第一次配置tomcat SSL,还真折腾了我一些时间!其实整个过程不是很复杂,要特别注意一些地方就是了!步骤如下:
        1)生成生成KeyPair: 在命令行模式下切换到目录%TOMCAT_HOME%,在command命令行输入如下命令(jdk1.4以上带的工具):
    keytool -genkey -alias tomcat -keyalg RSA -keypass password -storepass password -keystore name.keystore -validity 3600
    其中,keytool是java命令,特别注意storepass与ketystore的值,会在tomcat 配置中用到!此外,特别注意。。。输入这个命令后,它会要求你输入一些信息,第一个信息是姓名,那个必须是使用localhost或者你所拥有的域名,最好使用域名,这个错了就会导致整个配置失败,其它信息可不输入。
        2)将证书导入的JDK的证书信任库中:这步对于Tomcat的SSL配置不是必须,但对于CAS SSO是必须的,否则会出现如下错误:edu.yale.its.tp.cas. client.CASAuthenticationException: Unable to validate ProxyTicketValidator。。。导入过程分2步,第一步是导出证书,第二步是导入到证书信任库,命令如下:
    keytool -export -trustcacerts -alias tomcat -file server.cer -keystore server.keystore -storepass password
    keytool -import -trustcacerts -alias tomcat -file server.cer -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass password
    如果有提示,输入Y就可以了。这里有些地方要注意下:1》将证书导入JDK证书信任库时注意参数-keystore是JDK中的JRE即是%JAVA_HOME%/jre/lib/security/ cacerts,而且注意JDK不能放在有空格的目录中,否则会导不进去,切记!2》import 到JDK那个storepass有时候要用默认的即是changeit,至于为什么还不清楚。
        3)然后就是配置tomcat:配置你的Tomcat服务器配置文件%CATALINA_HOME %/conf/server.xml,不同版本会有点不一样,参考如下:

    xml 代码
    1.  
    2.<Connector port="8443" maxHttpHeaderSize="8192"  
    1.           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  
    2.           enableLookups="false" disableUploadTimeout="true"  
    3.           acceptCount="100" scheme="https" secure="true"  
    4.           clientAuth="false" sslProtocol="TLS"    
    5.           keystoreFile="server.keystore"    
    6.           keystorePass="password"/>  
    Tomcat5.5.20配置(此配置同样可用于Tomcat6.0):

    xml 代码
    1.  
    2.<Connector protocol="org.apache.coyote.http11.Http11Protocol"    
    1.                     port="8443" maxHttpHeaderSize="8192"  
    2.           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  
    3.           enableLookups="false" disableUploadTimeout="true"  
    4.           acceptCount="100" scheme="https" secure="true"  
    5.           clientAuth="false" sslProtocol="TLS"                   
    6.           keystoreFile="server.keystore"    
    7.           keystorePass="password"/>  
    Tomcat6.0.10配置:
    xml 代码
    1.<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"  
    2.           port="8443" minSpareThreads="5" maxSpareThreads="75"  
    3.           enableLookups="true" disableUploadTimeout="true"    
    4.           acceptCount="100" maxThreads="200"  
    5.           scheme="https" secure="true" SSLEnabled="true"  
    6.           clientAuth="false" sslProtocol="TLS"  
    7.           keystoreFile="server.keystore"    
    8.           keystorePass="password"/>  

    这里要注意,如果本身已经启用SSL,要将之前关于SSL的注释掉,防冲突了。这里的前面两个设置没试过,后面那个设置是经过验证的。

       步骤还是比较多,留意该注意的地方就是了!

  • Tomcat 内存设置

    2009-07-12 21:26:12

        这次发布测试的JAVA项目确实让我受了不少苦啊。当然也学习了。。呵呵
        这次发布的是个BOSS系统,由4个子系统构成,发布前开发部也没介绍说系统有多大,当然也是自己经验缺乏,没意识到4个子系统一个tomcat下面默认内存肯定是不够的。所以发布时没有修改tomcat默认内存设置,结果出错了:java.lang. OutOfMemoryError: PermGen space。
        自己很菜,只得网上搜索,原来是内存不够。那就设置了,综合了网上众多网友的方法还是不行,因为上面不少是转的,有些又没转全。汗。。。折腾了不少时间,所以写下保存下。
        PermGen space这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
        既然内存不够那就加了!如果是通过%tomcat_home%\bin中的startup.bat脚本启动,则在环境变量中加上CATALINA_OPTS这个属性。即是编辑%tomcat_home%\bin下的catalina.bat, 在最前面加上set JAVA_OPTS=-Xms1024m -Xmx1024m  -XX:PermSize=128M -XX:MaxNewSize=512m -XX:MaxPermSize=512m ,当然具体设置就要看实际情况了。 其中-Xms是指初始的大小,-Xmx是指最大值,以免多次加载,一般这两个设为同一个值即可。这是针对 windows 系统,如果是linux 即修改catalina.sh。
        另外,如果tomcat是作为系统服务启动的,以上设置则不灵了!因为作为系统服务的话,系统启动时调用的是 %tomcat_home%\bin\tomcat5w.exe,他读取注册表中的值,而不是catalina.bat的设置,因此需要修改注册表:
    解决办法:
    修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\Java\Options
    原值为
    -Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
    -Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
    -Xrs
    改为:
    -Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
    -Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
    -Xrs -Xms300m -Xmx350m
    重起tomcat服务,设置生效。 这个是我转摘的,我没试验过,不过看上去应该没问题的。
  • Java 与空格

    2009-07-12 21:26:12

        上个星期接了个测试项目是java开发的,要搭建测试环境。原来那个服务器什么都没装,只得自己装了JDK啊,TOMCAT啊,  mysql那些。原以为发布个JAVA 项目非常简单,结果一塌糊涂,而这就是空格惹的祸。
        以前装JDK都是装在默认路径中,觉得默认路径好点,他们自己开发的东西知怎么也清楚过别人啊。呵呵。。。这次也不例外,结果着道了。这个项目的登录支持SSL协议,所以要导入安全证书到JDK的证书信任库中,结果导了大半天就是不行!汗。。。只得请教我们系统架构师,高手就是高手啊,他说JAVA 的东西不要放在目录名有空格的目录中。结果换了个目录,搞掂!但还是觉得没那么严重吧,人家自己默认路径也有空格!这个次可能碰巧吧!
        然后就是部署系统了,这个系统是利于CAS做单点登录(SSO)的,结果启动TOMCAT后那个CAS就是启动不了,怎么也想不明白,只得请教开发人员了。开发人员一看也懵了,这里改下那里改下还是不行。汗。。。又折腾了半个下午。最后我自己上网搜索下,终于看到了有些网友相同的遭遇。又是空格啊。。。我将TOMCAT放在目录名有空格的目录下。一个悔字啊。。。不听老人言,吃亏在眼前啊!
        同志们!JAVA的东西尽量不要放在目录名带空格的目录下啊。。。切记!
  • Sql子查询

    2009-06-28 21:56:53

       Sql子查询即是当一个查询语句嵌套在另一个查询语句的查询条件中时叫做子查询也叫做嵌套子查询。根据子查询的返回结果不同,子查询又可分为单行子查询,多行子查询与多列子查询。现在如下三类子查询作说明,并假设有如下四个表记录学生选修课的成绩: Student(stId, stName); course(coId,coName); teacher(teId, teName); score(stId, teId, coId, score) 其中学生可以有多门选修课,一个老师也可以教多门课程。
       1> 单行子查询
       单行子查询是指子查询的返回结果只有一行数据。当主查询语句的条件语句中引用子查询结果时可用单行比较符号(=, >, <, >=, <=, <>)来进行比较。
       例子:查询名叫Kaka的学生的所有成绩 sql> Select score from score where stId=(select stId from Student where stName='Kaka');
       2> 多行子查询
       多行子查询即是子查询的返回结果是多行数据。当主查询语句的条件语句中引用子查询结果时必须用多行比较符号(IN,ALL,ANY)来进行比较。其中,IN的含义是匹配子查询结果中的任一个值即可,ALL则必须要符合子查询的所有值才可,ANY要符合子查询结果的任何一个值即可。而且须注意ALL 和ANY 操作符不能单独使用,而只能与单行比较符(=、>、< 、>= 、<= 、<>)结合使用。
       多行子查询使用IN操作符号例子:查询选修了老师名叫Rona(假设唯一)的学生名字 sql> select stName from Student where stId in(selectdistinct stId from score where teId=(select teId from teacher where teName='Rona'));
       多行子查询使用ALL操作符号例子:查询有一门以上的成绩高于Kaka的最高成绩的学生的名字 sql> select stName from Student where stId in(select distinct stId from score where score >all(select score from score where stId=(select stId from Student where stName= 'Kaka') ));
       多行子查询使用ANY操作符号例子:查询有一门以上的成绩高于Kaka的任何一门成绩的学生的名字 sql> select stName from Student where stId in(select distinct stId from score where score >any(select score from score where stId=(select stId from Student where stName='Kaka')));
       3> 多列子查询
       以上的单行与多行子查询的返回结果都是单列数据,而这个多例子查询顾名义当然就是返回结果是多列的数据。而多列子查询当然也可以返回单行或是多行的多列数据,当是单行多列的子查询时,主查询语句的条件语句中引用子查询结果时可用单行比较符号(=, >, <, >=, <=, <>)来进行比较;当是多行多列子查询时,主查询语句的条件语句中引用子查询结果时必须用多行比较符号(IN,ALL,ANY)来进行比较。
       具体跟以上两个并无太多不同,只是比较的不是单列而是多列数据而已。
       除了以上子查询,还有相关子查询。然后听说子查询嵌套多了性能影响较大,用关联可以改善性能,这两个问题就要再研究下先再总结出来了。
  • 测试工作两年感

    2009-06-15 23:28:53

        测试工作两年多了,对这两年来的工作有太多的感触。
        大学时期本专业是工商管理,由于对计算机的向往(那时觉得计算机是很神奇的)及本专业的空余时间多的原因修读了计算机科学与技术双学位。基本上大学时期还是比较认真的吧,起码每年有奖学金拿,呵呵。毕业找工作了也没想过找计算机相关的,一个偶然的机会听同学介绍软件测试这个职业,网上搜索下似乎不错哦(什么缺口大啊,薪水高啊。。一个晕),就投了一些软件测试的职位。无心插柳柳成荫,就这样选择了软件测试这个职业。
        “误入歧途”,一开始还是很感兴趣的。但一段时间后觉得软件测试技术含量太低了,一起进去的几个同事也离职转开发去了,心真是拔凉拔凉的。半年后也有想离职了,但就在那时,公司换了个新的技术主管,比较看重我,并带领我们开始做自动化测试(selenium),其中不少探索性的工作都交给了我。那个时期被委以重任的感觉真是很好。可惜,公司领导始终不够重视测试,我最终选择了离开(真的很舍不得我的主管Stanley,也觉得辜负了他的期望)。
        继续测试职业。有了一年多的测试经验特别有自动化测试经验再去找工作还是比较容易,让我感觉到了测试职业有那么一点亮,进入第二家公司继续测试。不久后感到郁闷了,虽然leader还是比较支持自动测试方面(selenium and QTP),但由于我所在团队是测试外包的项目(美国一家公司),环境搭建那些完全由美国那边搞定,对数据库啊,服务器那些完全接触不了,更糟的是他们从不做性能测试,也从不想去改进测试流程。看到论坛上那些测试牛人的介绍,仿佛我还处于测试的边缘,开始失望。但公司气氛不错,我也不想工作换得太频繁,对自己职业发展不利,等待机会。一年后,工作内容没有太大变化,我们测试团队也没有发展的迹象,反倒是团队越来越小。一年续签了,公司没有实现当初的加薪的许诺,我辞职了。当然,我辞职是早有的念头,觉得在这里再工作一年自己的能力也没多大提升,不如趁早离开,不加薪只是导火索吧。
        就这样,两年多的测试,让我喜让我忧,时而惊喜时而失落,让我看到希望又让无数次迷茫,矛盾。很明显,软件测试这一职业完全没有培训机构吹的那么高,在中国绝大部分公司内,软件测试是绝对次于软件开发的,薪水更是无法比较的。所以经常有不少讨论开发与测试,其实很明显开发对测试占绝对优势。那就是软件测试完全没有前途了?那也不是,不常说360行,行行出状元嘛。这句话虽然说得有失偏颇,但软件测试牛人(包括技术与薪水)还是有的,但说实在,不多。大部分中小公司对软件测试技术要求并不太高,薪水当然也就高不了。所以如果在考虑选择开发还是测试,无疑开发是首选,即使最终希望做测试工作最好也先选择软件开发。
        于我自己而言,如果没有出现特别好的机遇,软件测试将是我长期从事的稳定职业。我本身对软件测试还是比较感兴趣的,特别是自动化测试与性能测试,自身也还是比较适合这个职业。这几年还是会侧重于技术方面的学习吧,包括各个系统平台,网络编程,数据库等方面,也开始涉及测试管理方面。对于所能到达的高度,我不敢保证是最优秀的,但我一定会是中上的。即将加入新公司,对自己说声“加油!”
  • 验收测试(UAT)

    2009-05-31 22:58:45

        按照软件开发阶段来划分测试可以分为单元测试,集成测试,系统测试,确认测试与验收测试。其中,验收测试是部署软件之前的最后一个测试操作。验收测试是按照任务书或合同或其它验收依据进行的整个系统的测试与评审,决定是否接收或拒收系统。
        事实上,软件开发人员不可能完全预见用户实际使用程序的情况。例如,用户可能错误的理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解,等等。因此,软件是否真正满足最终用户的要求,应由用户进行一系列“验收测试”。验收测试既可以是非正式的测试,也可以有计划、有系统的测试。有时,验收测试长达数周甚至数月,不断暴露错误,导致开发延期。一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用称为α、β测试的过程,以期发现那些似乎只有最终用户才能发现的问题。 α测试是指软件开发公司组织内部人员模拟各类用户行对即将面市软件产品(称为α版本)进行测试,试图发现错误并修正。α测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有可能的用户操作方式。经过α测试调整的软件产品称为β版本。紧随其后的β测试是指软件开发公司组织各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见。然后软件开发公司再对β版本进行改错和完善。一般包括功能度、安全可靠性、易用性、可扩充性、兼容性、效率、资源占用率、用户文档八个方面。β版本在有些项目的持续相当长,如Google的Gmail至今持续了数年,普通认为是较为成熟和产品了,但它仍然是β版本。这是对产品质量的不懈追求还是系统开发策略则不得而知了。
        曾在网上看到过关于α、β测试是不是属于验收测试的讨论,最张是各有各的说法。我倒较认同其中一种说法,其认为:施验收测试的常用策略有三种,它们分别是:正式验收,非正式验收或 Alpha 测试,Beta 测试,即α、β测试是验收测试的一种。我觉得狭义的验收测试就是在公司内部由测试人员(通常是测试负责人或主管)按照设计的测试用例进行的一种测试,是系统测试的延续。广义上的验收测试则包括狭义的验收测试,α测试与β测试。一般用户对象相对固定的则只进行狭义的验收测试或是由公司内部非测试开发人员进行的α测试,如果是用户对象广泛且不固定的则有必要进行β测试。
  • 软件测试原则

    2009-05-25 21:27:39

        软件测试作为一门科学与艺术也有着自己的原则,《软件评测师教程》中总结归纳了七大测试原则,现在将其与本人的理解列如下:
        1> 所有的软件测试都应该追溯到用户需求。这是勿庸置疑的,软件的产生与目的就是为了满足用户的需求,作为软件开发工程中的一个工作流程的软件测试也是以用户需求为根据的。也可以说软件测试就是为了找出与用户需求不一致的地方,当然用户需求包括用户规定的需求与潜在需求。
        2> 应当把“尽早地和不断的进行软件测试”作为软件测试者的座右铭。这说得一点也不为过,软件测试本身就贯穿于软件开发的各个阶段中。而且软件测试也有自己的独立的工作流程,并不只是软件开发后期阶段的检验过程。要知道由于编程不正确产生的缺陷并不占多数,绝大部分是需求分析与设计方面产生的缺陷。而且越到后期修复缺陷的成本越高,所以应该尽早地,不断地进行软件测试。
        3>完全测试是不可能的,测试需要终止。由于软件的复杂性,一个适度规模的程序其测试路径的组合就近似天文数字,要进行穷举测试是不可能的。另外,这也是基于测试成本的考虑。所以要进行完全测试,在有限的资源条件下,找出所有缺陷以使软件趋于完美是不可能的。
        4>测试无法显示软件潜在的缺陷。软件测试的目的是尽量找出多的缺陷,对软件质量进行评估。因为穷尽测试的不可能,所以从理论上说软件缺陷总是存在的,也就不能显示 软件潜在的缺陷。
        5>充分注意测试中的群集现象。如是有测试经验的同行都会有此体会,在某一模块或功能点上的缺陷总是特别多,往往越挖越多,这就是群集现像,也是符合80/20原理的。这是可能由于模块设计得不好,或是功能点特别复杂,亦或是负责相关模块的开发人员水平问题等这些特殊个别原理造成了缺陷群集现像。所以实际测试过程中,我也应该利用这个原理以发现更多的缺陷。
        6>程序员应避免检查自己的程序。这主要是心理因素,一是思维定势,二是总是认为自己是对的心理。这也就是为什么会有测试与开发之分。不过由于也就引出了另外一个问题,我们测试人员编写的测试脚本又让谁来测试呢?虽然说一般来说测试脚本在逻辑上不如实体软件程序复杂,但也是会有不少错误的。有可能就是由于脚本设计的错误造成了错误的测试,很多缺陷被忽略。在这种情况下,如果有足够的时间与人力资源相互检测测试脚本不失为一个好方法,但实际工作中往往不允许有足够的资源。这时我们可以以免一个人分别负责一整个功能模块,交叉进行,分别调其它同事的脚本,在阅读与调用脚本时就可以看作是简单的脚本测试。
        7>尽量避免测试的随意性。测试应该从工程的角度去理解软件测试,它是有组织,有计划,有步骤的活动。这是无疑的,测试也是一个工程。但是不是就就随机测试也是应该避免的?不是。随机测试(Ad-hoc testing)并不是随意测试,它是基于系统的测试后根据人员的经验来猜测问题的所在而进行随机测试。往往很多时候,随机测试的作用是非常明示的。
        这就是教程中提到的七大软件测试原则,也是非常中肯实用的原则。这比哪些讨论什么是质量模型等到实际测试更有指导意义,所以我们测试中应该好好应用。
  • 软件测试与软件质量保证

    2009-05-25 21:27:39

       通常在一般的中小企业中会不将软件测试与软件质量保证加以细分,软件测试人员也叫做质量保证人员即QA,我所在公司也是如此。其实软件测试与软件质量保证是软件质量工程的两人不同层面的工作。
       
    质量保证(QA)是通过预防,检查与改进来保证软件质量的。QA所关注的是软件质量的检查和测量,他的工作是软件生命周期的管理以及验证软件是否满足质量和用户需求,主要着眼于软件开发活动中的过程、步骤和产物,而不对软件进行剖析找出问题。一般情况下,QA应独立于项目之外,以第三方的姿态来对整个开发过程进行评审,检查开发和管理活动是否与已定的过程策略、标准和流程一致,检查工作产品

    是否遵循模板规定的内容和格式。所以,质量保证是通过过程改进来保证软件质量的。
       
    软件测试关注的不是过程活动,而是每个过程活动的产出物。它对活动的产物进行剖析,检测以期发现更多的问题,从而保证软件质量。所以软件测试是保证软件质量的一个重要环节,但不是质量保证的一个环节。
       
    对软件测试与软件质量保证进行区分并不是闲聊而咬文嚼字,而是要知道他们都是为了保证软件质量的两个不同层面的工作,他们对保证软件质量有着不可替代的作用。但现实中大部分中小企业都只知道软件测试而没有专门的质量保证,即使有也是虚设,其实这是本末倒置。软件测试只是项目中的一个流程或是环节,只是对个别项目。所以个别项目如果取得成功,质量得到了很好的保证,可能是因为项目的个别因素,如项目需要做得较好或是测试人员水平较高等个别因素。所以一个项目做得好不能保证别的项目也做得好,即是公司的开发水平,产品的质量水平能够提高。这就需要通过质量保证来提取成功的因素而上升到流程规范上来规范所有项目,从而提高公司产品质量水平。一个公司的好的管理标准就是有个好的规章流程得以执行,所以一个好的项目管理,质量保证也在于规章流程,这些也是共性的东西,才不会以项目中的个别因素改变而改变。当然,也并不是说有好的质量保证就有好的产品质量,他们之间不是充分的关系,而是必要。
       
    所以软件测试与软件质量保证是两个保证软件质量的重要手段,套些初中教科书上的话,他们的关系就是相互区别,相互联系,相互依存。

     

  • 软件评测师

    2009-05-24 10:38:33

        终于,昨天考完了软件评测师。
        至于结果就由它吧,通过了无疑是好的,如没通过也达到了自己当初考软件评测师的目标。刚开始工作时就有听说过软件评测师这个考试,但听当时的leader说含金量不高,所以就不去留意它了。但后来听一个较资深的leader推荐它,认为它虽然考试含金量不高,但它要求的知识面却是我们日常工作中需要的,而且那个《软件评测师教程》虽然讲得比较浅显,但比较全面系统,值得一看。我随即想下也是,在学校没有专门的软件测试这课程,那些理论知识也是东看一点西看一点,没有很系统化。现在工作了快二年了,对软件测试也有自己的一些肤浅看法跟体会,不如就趁此好好全面系统的看下软件测试理论知识,顺便温习下相关的知识吧。
        所以在看《软件评测师教程》的时候,我还是比较认真地去看了,研究就讲不上了。呵呵。。。然后结合自己的实践却也是受益匪浅。对于系统化的理论知识有了个较为清晰的认识,理论指导实现的意义与局限性及实践中应用理论的不足也有一些体会,并做了记录,想看完考试后陆续贴上博客来与大家分享,也记录下自己的测试足迹。
        或许有同行会说懂那些理论有什么用呢?现实中基本上用不上。这在我们现在这样的测试环境确切有不少是根本不需要“懂”所谓的测试,甚至有些夸张的说会用电脑就可以了。那个什么理论有意义吗?我要肯定的说理论绝对有意义,而且有非常重要的意义。理论指导实践,这是无可厚非的,没有理论指导的实践会成为无头苍蝇。当然你只将理论记下来是没用的,只会纸上谈兵。我们需要将它与实践相结合,转化为自己的测试思想,以更好的指导实践,并更好的修正深化理论。
        理论也很重要,这是我在看完软件测试教程后,联系自己的实践得到的第一个成果。
  • selenium + ant 应用

    2009-02-12 23:38:30

        selenium ThoughtWorks专门为Web应用开发的自动化测试工具,适合用于功能测试与验收测试.也是近年来较为流行的开源测试工具.selenium这一强大的Web测试工具主要由selenium IDE, selenium core, selenium Remote Control 及selenium Grid组成. 其中selenium RC 应用较为广泛亦算是功能最为强大的一个,通常它会与其它工具结合起来使用以更好地发挥其强大功能.现介绍构建工具Ant与selenium结合用于测试java应用项目.Ant+selenium可以构建测试build,然后部署到相应的测试环境中,再编译执行生成测试报告,最后通过邮件发送测试报告.
        对selenium 和ant 有所了解的同行应该看得出这个应用主要是使用Ant来构建版本,然后部署到测试环境中去,再然后执行测试脚本到生成发送测试报告.即是使用Ant这个强大的构建部署工具帮我们做那些外围的工作,使测试跟开发完美结合,让selenium 自动化测试应用完全自动化.所以这个应用主要是Ant的应用.
        介绍下我当时使用情况.当时一个项目中使用selenium RC来做自动化测试,主要是冒烟测试跟回归测试.我们测试所用的build是在香港开发部门每天使用Bamboo持续构建的,所以我们必须用Ant通过网络从上面拿相应的build下来,修改相应的配置文件,然后部署到相应的测试环境中去. 部署好测试系统后,我们就可以通过Ant编译运行我们的测试脚本(用java写的selenium RC 脚本).运行完成后用Ant自带的方法来生成测试报告,最后还是能过Ant以邮件发送报告.所以,我们只需要用鼠标点一下,甚至不用点而用其它工具每天自动执行.
       当然这也并不是什么很高明的应用,但借助Ant强大功能,使用selenium自动化测试做得更为彻底,将测试各个步骤很好地连接起来,当然带来更高效率.这个应用主要就是Ant的使用,难点也在Ant的使用,因为其中涉及到不少的Ant tasks.不过它官网上都有详细的使用介绍:http://ant.apache.org/manual/index.html. 现贴出我之前使用的ant build 文件,有兴趣的同行可以参考下.

    <?xml version="1.0"?>
    <project name="camp-testuff" default="main">
     <!-- properies -->
     <property file="./resources/build.properties" />

     <!-- 定义classpath -->
     <path id="master-classpath">
      <fileset file="${lib.dir}/*.jar"/>
      <pathelement path="${classes.dir}" />
      <pathelement path="${resources.dir}" />
      <pathelement path="${src.dir}" />
     </path>

     <!-- 初始化任务 -->
     <target name="init">
      <java jar="${selenimhome}/selenium-server.jar" fork="true" spawn="true" />
     </target>

     <!--下载更新build-->
     <target name="download" if="isdowload">
      <get src="${targeturl}" dest="${filePath.dir}/${filename}" verbose="true" usetimestamp="true" />
     </target>


     <!--更新编绎war文件-->
     <target name="war" depends="download">
      <unwar src="${filePath.dir}/${filename}" dest="${filePath.dir}/project" />
      <propertyfile file="${filePath.dir}/project/WEB-INF/classes/jdbc.properties" comment="My properties">
       <entry key="jdbc.url" value="${jdbc.url}" />
       <entry key="jdbc.username" value="${jdbc.username}" />
       <entry key="jdbc.password" value="${jdbc.password}" />
      </propertyfile>
     
      <propertyfile file="${filePath.dir}/project/WEB-INF/classes/systemConfiguration.properties" comment="My properties">
       <entry key="mail.host" value="${mail.host}" />
      </propertyfile>

      <war destfile="${filePath.dir}/${projectfile}" needxmlfile="false">
       <fileset dir="${filePath.dir}/project" includes="**/*.*" />
      </war>
     </target>

     <!-- 部署项目 -->
     <target name="deploy">
      <mkdir dir="${tomcatlog.dir}" />
      <mkdir dir="${tomcatconfig.dir}" />
      <taskdef resource="cargo.tasks">
       <classpath>
        <pathelement location="${cargo-uberjar}" />
        <pathelement location="${cargo-antjar}" />
       </classpath>
      </taskdef>

      <cargo containerId="tomcat5x" home="D:\tomcat" ōutput="${tomcatlog.dir}/output.log" log="${tomcatlog.dir}/cargo.log" action="start" failonerror="false" wait="false">
       <configuration home="${tomcatconfig.dir}">
        <property name="cargo.servlet.port" value="8080" />
        <property name="cargo.logging" value="high" />
        <property name="cargo.jvmargs" value="-Xmx500m"/>
        <deployable type="war" file="${filePath.dir}/${projectfile}" />
       </configuration>
      </cargo>
     </target>

     <!-- 编译脚本-->
     <target name="compile"  descrīption="compile the source files">
      <mkdir dir="${classes.dir}" />
      <javac srcdir="${src.dir}" failonerror="false" destdir="${classes.dir}">
       <include name="**/*.*" />
       <exclude name="**/*ViewCustomerTest.*" />
       <exclude name="**/*SubmittingMaintenanceApplicationTest.*" />
       <exclude name="**/*SubmittingMaintenanceApplicationTest.*" />
       <exclude name="**/*AddMaintenance.*" />
       <exclude name="**/*EditMaintenance.*" />
       <classpath refid="master-classpath" />
      </javac>
     </target>

     <!-- 测试 Junit脚本-->
     <target name="test" descrīption="run junit test">
      <tstamp>
       <format property="stratTime" pattern="MM/dd/yyyy  HH:mm:ss" />
      </tstamp>
      <mkdir dir="${report.dir}" />
      <junit printsummary="on" haltonfailure="false" failureproperty="tests.failed" showoutput="true">
       <classpath refid="master-classpath" />
       <formatter type="xml" />

       <batchtest todir="${report.dir}">
        <fileset dir="${src.dir}">
         <include name="${testname}" />
         <exclude name="**/*ViewCustomerTest.*"/>
         <exclude name="**/*SubmittingMaintenanceApplicationTest.*"/>
         <exclude name="**/*SubmittingMaintenanceApplicationTest.*"/>
         <exclude name="**/*AddMaintenance.*"/>
         <exclude name="**/*EditMaintenance.*"/>

        </fileset>
       </batchtest>
      </junit>
     </target>

      <!-- 生成报告 -->
     <target name="junitreport" depends="test">
      <mkdir dir="${report.dir}/html" />
      <junitreport todir="${report.dir}">
       <fileset dir="${report.dir}" includes="TEST-*.xml" />
       <report format="frames" todir="${report.dir}/html" />
      </junitreport>
     </target>

     <!-- 发送测试结果 -->
     <target name="SendEmail" depends="junitreport">
      <tstamp>
       <format property="endTime" pattern="MM/dd/yyyy HH:mm:ss " />
       <format property="endTime2" pattern="MM/dd/yyyy " />
       <format property="endTime3" pattern="yyyyMMddHHmmss " />
      </tstamp>
      <zip destfile="${report.dir}/html/Report.zip">
       <zipfileset dir="${report.dir}/html" includes="**/*.*" />
      </zip>
      <mail mailhost="${host}" messagemimetype="${messagetype}"
       mailport="${mailport}" subject="Test Report_${endTime3}"
       user="${user}" password="${password}" messagefile="${messagefile}"
       tolist="${tolist}" cclist="${cclist}">
       <from name="${fromname}" address="${fromaddress}" />
       <attachments>
        <fileset dir="${report.dir}/html">
         <include name="*Report.zip" />
        </fileset>
       </attachments>
      </mail>
     </target>

     <!-- 清除生成文件(报告) -->
     <target name="clean">
      <delete dir="${tomcatconfig.dir}" />
      <delete dir="${report.dir}" />
      <delete dir="${classes.dir}" />
      <delete file="${filePath.dir}/project.war" />
      <delete dir="${filePath.dir}/project" />
      <sql driver="org.gjt.mm.mysql.Driver"
          url="jdbc:mysql://${jdbc.urlAndPort}"
          userid="${jdbc.username}"
          password="${jdbc.password}"
          >
       drop schema ${jdbc.schema};
       <classpath location="${lib.dir}/mysql-connector-java-5.0.5.jar"/>
      </sql>
     </target>

     <!-- 测试完成关闭计算机 -->
     <target name="shutDown">
      <sleep minutes="2" />
      <exec executable="shutdown">
       <arg value="-s" />
      </exec>
     </target>

     <!-- Stop tomcat -->
     <target name="stoptomcat">
      <taskdef resource="cargo.tasks">
       <classpath>
        <pathelement location="${cargo-uberjar}" />
        <pathelement location="${cargo-antjar}" />
       </classpath>
      </taskdef>

      <cargo containerId="tomcat5x" home="D:\tomcat" action="stop">
       <configuration home="${tomcatconfig.dir}"/>
      </cargo>
     </target>

     <!-- 主要目标 -->
     <target name="main">
      <!-- 清理并初始化环境 -->
      <antcall target="clean" />
      <antcall target="init" />
      <!-- 部署项目 -->
      <antcall target="war" />
      <antcall target="deploy" />
      <!-- 编译脚本 -->
      <antcall target="compile" />
      <!-- 测试并发送报告 -->
      <antcall target="SendEmail" />
      <antcall target="stoptomcat" />
      <antcall target="shutDown" />
     </target>

    </project>

     

  • 测试用例优先级

    2009-01-30 22:44:18

    Priority即是优先级,只要我们提到测试用例基本上都会涉及到,或许应该说是完整的测试用例的一个基本元素.但在现实应用中是否有对测试用例进行划分,是否真正有应用到?未必!相信大部分的同行都会对测试用例进行等级划分,但仍不少同行并未认识到其重要性而没有真正应用起来.
        优先级,对此我是感慨良深.春节前一个外包项目测试全面展开,项目还是比较大的,有测试用例接近3000个.拿到最新的测试用例一看,一个汗啊...我负责的接近1200个,有10多个是优先级为3的即是传说中的P3,似乎没有P2的,有也就是30个左右,其余全是P1的.一个关于用户名(注册邮箱地址)的验证如长度,允许输入字符等都设置为P1.更汗的是距离春节放假就6天了,说要春节前完成所有非P3的用例(因为开发在美国,他们没假期...).期间还不只是执行用例还要首先跟踪BUG.当然结果是推迟完成日期,可能是小学数学老师找他们谈心然后恍然大悟吧.可惜他们数学老师只会计数,不知所谓的优先级.测试效果是可想而知了,我们测试员要完成不可能完成的任务,心理感受是可想而知,效果肯定也打折扣;而开发方面收到的BUG大部分是验证不够完善或是一些较为琐碎的问题,而严重的BUG后面才发掘出来,整个项目进度受到相当大的影响.
        或许你会觉得我夸张了,如果不是亲身经历我也难以相信.这是一个十分失败的项目开发测试,而其中一个原因就是没有发挥优先级作用.在软件项目中,我们几乎没有足够的时间来做任何我们需要做的事情,特别是如果测试置于项目边缘的话就更不用谈了.相信同行刚接触测试时都应该听过80/20原理跟测试是不可能穷尽的,也正是因为这样,我们必须对测试用例进行优先级设置.只有对测试用例进行了优先级设置,并在执行测试时根据所处的测试生命周期跟项目进度的需要有所放矢的选择相应的测试用例进行测试,才能有更好的测试效果并保证整个项目的进度.
        那测试用例应该有哪些级别呢?没有明确的答案,这要根据项目所处的生命周期跟进度来决定.通常情况下我觉得设置3级已经足够.P1: 即是确保系统基本功能及主要功能的测试用例;P2则是确保系统功能的完善方面的测试用例;P3则是关于用户体验,输入输出的验证及其它较少使用或辅助功能的测试用例.根据所搜集的资料各优先级所占全部测试用例比例通常如下: P130%-45%,P240%-60%, P310%-15%.
        不少同行却总觉得不用测试用例一样测试,更不用谈用例优先级.这是非常错误的一个观点,省了那么点时间功夫换来的是更多的付出甚至是低劣的产品. 其实,对测试用例进行优先级的设置是最基本的,也是必须的.这并不是很需要技术或技巧的东西,但一旦很好地应用了它,却可收到丰厚的回报. 当然,对测试用例做了优先级的设置还必须能很方便地筛选出所要测试用例,能快速地筛选出某个模块,某个优先级的用例进行测试,这有赖于选择个好的测试管理工具.

  • 回归测试漫谈

    2009-01-13 21:22:06

       众所周知软件测试这个职业有一个为从业者不悦的一个特点就是有时特别烦琐,要经常做重复性的东西,相信同行或多或少都会有这个感慨,而罪魁祸首就是回归测试.如果每次测试的功能点都是新的,每次执行的测试用例都是未曾执行过的话,我相信同行都不会觉得厌烦反而很有兴致想看下新的功能是怎样的,执行起用例来也特认真.我也是如此,如果做久了一个项目特别是总是推迟发布的话每天就祈祷着当前项目快点了结.一接到新项目就有如获新生的感觉...确实回归测试次数多了,测试员不由变得烦躁起来,特别如果是回归测试策略又不妥当的话简直令人发疯....
       我深受其害.进新公司近半年来还没有完全是自己负责的项目,除了花了一定的时间做自动化方面的东西外,其它的时间就是执行测试用例了,当然也就有大量的回归测试了.更郁闷的是没有相应的回归测试策略,而且不少测试用例已经不再适用了,数量又多(以前新功能测试的用例),我逐渐变得厌烦,然后是麻木,最后几近崩溃.一个汗啊...痛苦泥潭中的只好搜索相关资料并结合自己的实践,总结下如何更有效地做回归测试,让回归测试做得更有意义.
       所谓回归测试就是当软件发生改变时,重新测试已经通过测试的测试区域,以验证修改的正确性及其影响.其实我们做测试的大部分工作也是在做回归测试,严格按照定义的话一旦软件作了修改就必须进行回归测试.我想对修改过后的软件要进行回归测试应该就是无可厚非的,无论是教科书上的介绍还是前人的经验总结都知道回归测试的必要性与重要性.那非要做回归测试,那样怎样才能做得更为有效有意义呢?显然这都需要从测试用例着手.
       首先我们必须有个管理良好的测试用例库,这个用例库中的所有用例必须是有效的,有达到足够的覆盖率,并且是容易查找组织的.这需要有良好的测试管理工具,并有相应的资源(时间与人力)去维护这个测试用例库,务必使其中没有过时,冗余的测试用例,并达到一定的覆盖率.如何管理组织好测试用例已是一个很值得深入研究的课题,在此不再阐述(我也没有很好的见解..)总之,要做好回归测试,组织管理良好的测试用例库是前提.
       有了测试用例库,那我做回归测试时就执行所有有效的测试用例?这个没有绝对的答案,在很多的时候如果你有足够的资源用全部测试用例来做回归测试是最佳选择. 但现实中呢?有足够资源这个理想状态比较少,并且有些时候也没有必要这样做.如果只是修改了某个警告对话框中的单词就要执行完所有测试例以确保其修改正确性及其影响?或许你会说只有疯子才会那么做,但事实上有时候我们正是那个疯子.基本上很多时候连开发自己都不敢肯定会不会影响到其它部分,所以我们就不得不扩大测试范围.那应该如何选择回归测试使用呢?前人已经总结了很多,主要是如下4种.
    1>选择全部测试用例
    选择测试用例库中的所有测试用例作为回归测试用例,这是一个较为保险的方法.在理想的状态下(有足够的资源,测试人员不知疲惫),这种方法绝对是首选.但理想与现实的差距是惨不忍赌的,测试资源缺乏是行内常情,特别是由于进度而导致测试时间极为苛刻,而且测试人员会因多次执行相同用例而产生厌烦,这对测试质量影响是非常大的.所以,无论从现实资源考虑还是从成本上考虑都不可能每次回归测试包都是选择所以测试用例.
    2>基于风险选择测试用例
    这是基于一定的风险标准从测试用例库中选择部分测试用例形成测试包.按测试优先级来来选择最重要的、关键的和可疑的测试,而跳过那些非关键的、优先级别低的或者高稳定的测试用例.这样测试任务会大为减轻但效果并不差,因为由此没有被发现的缺陷是较少并严重性较低的.
    3>基于操作剖面选择测试用例
    这种方法适用于测试用例是基于软件操作剖面开发的,测试用例的分布情况反映了系统的实际使用情况。回归测试时可以优先选择那些针对最重要或最频繁使用功能的测试用例,释放和缓解最高级别的风险,有助于尽早发现那些对可靠性有最大影响的故障。
    4>再测试修改部分
    这种是基于开发对修改的影响区域有较大把握时所采取的一个策略.通过相依性分析识别软件的修改情况并分析修改的影响,将回归测试局限于被改变的模块和它的接口上,此时只选择相应的测试用例来做回归测试.此策略风险最大,但成本也是最能低的,通常用于做小回归测试.
       以上四种回归测试策略各有优缺点,实际应用中应根据项目的资源,进度及项目开发的模式等实际情况来选择最优策略.1>一般情况在在一个非用于基线的build中作了小修改,建议采用策略4,只测试修改部分,因为现在的开发流程中build更新较快特别是极限编程中,要进行完全的回归测试是比较不现实的,即使有自动化工具的辅助亦未必能实现.2>在一个milestone中,一个作为基线的build中则可采用策略2或3,基于一定的风险选择测试,这是一个较为折中的办法,但如果资源允许的话建议进行全回归测试.3>较重要的mileStone或是最终版本,最好选择全回归测试.因为如果一般来说此时软件改动会较大,选择全部测试较为保险.当然这还是要依据当时的实际出发.
       但无论采取何种策略,回归测试还是让人欲弃之不做却又不得不做的一种测试,因为它重复多并且经常工作量大但经常发现的缺陷相对工作量来说太少.但是谁都不敢承担不做回归测试带来的后果,真是食之无味,弃之不能.所以在做回归测试时我们必须采取一些较为有效的方法来保证做好回归测试.例如安排新的测试者完成手工回归测试,让更有经验的测试者开发新的测试用例,编写和调试自动测试脚本,做一些探索性的或ad hoc测试。或是采取轮流执行不同模块,尽量避免一人一直测试某一模块,不论从测试员感受还是测试效果来看,这都是一个不好的方法.但我觉得最重要的就是基于实际可行的话引进自动化测试,因为机器不会累,可以日夜跑.
       回归测试这个令人头痛的问题需要根据项目跟测试资源等实际情况来采取更有效的策略来解决.其中需要注意的是必须重视回归测试,在测试计划中有很好的进度安排及选择相应的回归策略,重视测试用例的维护,借助于自动化工具.
  • QTP与QC/TD整合设置host(转载)

    2009-01-08 23:47:02

    Product:
    TestDirector 8.0
    TestDirector for Quality Center 8.2
    TestDirector for Quality Center 9.0
    DB(s):
    Not Relevant


    Topics:
    Integrating with Astra QuickTest / QuickTest Professional
    Integrating with WinRunner
    Error Messages
    Integrating with QuickTest Professional
    Integrating with VAPI-XP
    Integrating with Business Process Testing
    OS:
    Windows XP

    Creation Date:
    14 Aug 2004  Last Modified Date:
    18 Sep 2006

     

    --------------------------------------------------------------------------------

    Problem Descrīption: Error: "RPC server is unavailable" or "Access is denied" during remote execution of automated scrīpts on Windows XP SP2

    The user receives the following error message when executing a automated scrīpt remotely after installing Windows XP SP2:

    "The RPC server is unavailable."

    or

    "Access is denied."

    Executing the scrīpt locally works correctly.

    Diagnosis: Security changes in Windows XP SP2 have blocked the remote agent of the testing tool from being launched. This caused the failure of the automated scrīpt execution.

    Note: Windows XP SP2 is supported with TestDirector 8.0 SP2 and TestDirector for Quality Center 8.2 and above only. For more information on supported operating systems, please refer to the links below:
    Problem ID 44879 - What are the system requirements for TestDirector for Quality Center 9.0
    Problem ID 36167 - What are the system requirements for Quality Center 8.2
    Problem ID 25963 - What are the system requirements for TestDirector 8.0

     


    --------------------------------------------------------------------------------

    Solution: Change the DCOM permissions on the Windows XP SP2 client to allow for remote execution

    Notes:

    The security changes suggested below should be applied by your System Administrator. Please contact Microsoft Support if you have questions regarding changes in DCOM securities caused by installing Windows XP SP2.

    If you disable the firewall installed with Windows XP SP2, you do not need to apply the steps in Part II below. However, a utility (CPT33502C.zip) has been created to automate the steps for opening the ports outlined in Part II.

    Part III - VI can be applied automatically by running the attached batch file included in CPT33502B.zip. You will need to extract the contents of this zip file to a temp directory and execute the SetWRandQTPIPDCOM.bat file. The batch file (CPT33502B.zip) will use the dcomperm.exe (CPT33502D.zip) provided by Microsoft to update the DCOM properties of the remote agents for WR, QTP, BPT, System Test, and VAPI-XP. Your system administrator should be able to run this batch file across the network to update each Windows XP SP2 machine. If you apply the batch file, you do not need to implement the steps in Part III - VI below.
    The following is the manual process for openning the firewall ports and modifying the DCOM properties for WR, QTP, BPT, System Test, and VAPI-XP.

    Part I:
    Add both machines into the same domain. For the domain users logged into both machines, add these domain users to the Local Administrators group on the QTP/WR machine. This is required for Windows to authenticate the remote user executing the tests against the DCOM objects.

    Part II:
    On the Testing Tool client machine configure Windows Firewall to allow Port 135 for DCOM:
    1. Select Start -> Control Panel -> Windows Firewall.
    2. Navigate to the Exceptions tab.
    3. Configure the Remote Agent to be allowed under "Programs and Services." Configuration should be done for each testing tools as given below:


    WinRunner Remote Agent (path: <System Drive>:\Program Files\Common Files\Mercury Interactive\WR_Remoter\wrrmtsrv.exe)
    QuickTest Professional Remote Agent (path: <System Drive>:\Program Files\Mercury Interactive\QuickTest Professional\bin\AQTRmtAgent.exe)
    Execution Agent for Business Process Testing (path: <System Drive>:\Program Files\Common Files\Mercury Interactive\TD2000_80\bp_exec_agent.exe)
    4. Click on <Add Port> and add the DCOM TCP port 135 to the Exceptions list.
    Note: The WR remote agent is a DCOM object and requires port 135 to work. The list of "Port Assignments for Commonly-Used Services" is provided in the URL below:
    http://www.microsoft.com/resourc ... t/cnfc_por_SIMW.asp

    Part III:
    Modify DCOM Security Properties:
    1. Select Start -> Run and enter dcomcnfg.
    2. Navigate to Console Root -> Component Services -> Computers -> My Computer.
    Note: If Windows Security Alert dialog window appears, click on <Ask me later> or <Unblock>.
    3. Right-click on My Computers and select "Properties."
    4. Navigate to the Default Properties tab.
    5. Make sure the Default Impersonation Level is "Identify."
    6. Click <Apply>.
    7. Navigate to the Defualt COM Security tab.
    8. Under Access Permissions, click on <Edit Limits>. The Access Permission dialog window appears.
    9. Click on <Add>. The Select Users or Groups dialog windows appear.
    10. Click on <Advanced>.
    11. Click on <Find Now>.
    12. Add the following groups and users from the local machine (below is an example screenshot):


    Administrator
    Administrators
    Authenticated User
    Anonymous Logon
    Everyone
    Interactive
    Network
    System

    13. Click <OK>.
    14. Add the following groups and users from the domain:

    <tdomain user logged into the QTP/WR box>
    <domain user logged into the TD client box executing the remote execution>

    15. Click <OK>.
    16. Give "Local Access" and "Remote Access" permissions to the groups and users.
    17. Click <OK>.
    18. Under Access Permissions, repeat steps 9-17 for <Edit Default>.
    19. Under Launch and Activation Permissions, click on <Edit Limits>. The Launch Permission dialog window appears.
    20. Repeat steps 9-15.
    21. Enable "Local Launch," "Remote Launch," "Local Activation," and "Remote Activation" permissions to the groups and users.
    22. Click <OK>.
    23. Repeat steps 20-22 for <Edit Default>.
    Part IV: (for QTP only)
    1. While still in the Component Services window, navigate to Console Root -> Component Services -> Computers -> My Computer -> DCOM Config.
    2. Look for the following.


    AQTRmtAgent
    QuickTest Professional Automation
    TlpRmtServer

    3. For each of these DCOM applications, right click and select <Properties>.
    4. Under the Identity tab, select <The Interactive User>. This will allow the DCOM application to authenticate the process against the logged in Windows user and run the process in that security context.
    5. Next, go to the Security tab.
    6. For both the <Launch and Activation Permissions> and <Access Permissions>, select <Use Default>. This will use the Default security settings as we did in Part III.
    7. Click Apply, then OK to commit the changes.
    8. Now, you are ready to run a remote execution test with QTP.
    Example Screenshot of the Security Configuration (see word attachment)
    Part V: (for WR only)
    1. While still in the Component Services window, navigate to Console Root -> Component Services -> Computers -> My Computer -> DCOM Config.
    2. Look for the following:

    {0B171F02-F204-11D0-9398-0080C837F11F}
    Wrun Document

    3. For each of these DCOM applications, right click and select <Properties>.
    4. Under the Identity tab, select <The Interactive User>. This will allow the DCOM application to authenticate the process against the logged in Windows user and run the process in that security context.
    5. Next, go to the Security tab.
    6. For both the <Launch and Activation Permissions> and <Access Permissions>, select <Use Default>. This will use the Default security settings as we did in Part III.
    7. Click Apply, then OK to commit the changes.
    8. Now, you are ready to run a remote execution test with WR.
    Part VI: (For System Test, BPT, and VAPI-XP)
    Repeat the procedure outlined in Part V above but replace the WR Application ID in step 2 with the appropriate one for each of the remote agent listed below:


    Vapi-XP object
    {CD70EDCE-7777-11D2-9509-0080C82DD192}

    Business Process Testing object
    {6A03829E-EC39-4802-A631-3841484EFBE3}

    System Test Remote Agent
    {1B78CAE4-A6A8-11D5-9D7A-000102E1A2A2}

    Notes:


    If you have not configured the Remote Agent to be allowed under "Programs and Services," a Windows Security Alert message will appear while running a test remotely. Click <Unblock> to resolve this problem. The next time you execute an automated scrīpt, the warning will not appear.
    If after performing all the described steps and you still receive "The RPC server is unavailable" message, create some shared folder anywhere on the Testing Tool machine.
    Below is a list of supported Mercury's Testing Tools on Windows XP SP2:

    TestDirector Version Testing Tool Testing tool versions
    TestDirector for Quality Center 8.2 QuickTest Professional 8.2
      WinRunner 8.0, 8.2
      Business Process Testing 8.2
    TestDirector 8.0 SP2 QuickTest Professional 8.2
      WinRunner 8.0, 8.2

311/212>
Open Toolbar