j将测试进行到底~~

发布新日志

  • 【转】云计算将改变传统软件软件测试行业?

    2009-04-03 11:32:08

    最近在写一篇自动化测试框架的论文,其中涉及了部分关于云计算的东西,自己也是对云计算这个概念似懂非懂的,所以就去查了些资料。在查找资料的过程中发现了这篇文章,觉得写的很不错,也许这就是未来软件测试行业的发展方向吧,所以转到这里,Share给大家:)

     

    “云”为企业开发人员及提供相关服务和工具的供应商带来了新机遇。对于测试团体来说,在面临新挑战的同时,他们也将得到新工具以解决Soasta公司CEO所说的关键问题:可以正式启动了吗?

    位于加利福尼亚洲圣马迪奥的Keynote Systems公司副总裁Vik Chaudhary说:“测试人员必须能够有效率地对所有层面进行测试——从应用到云服务供应商。”

    根据市场研究公司IDC的调查,到2012年,在云服务上的消费将提高三倍,达到420亿美元。IDC指出,在所有IT消费中,云计算占到25%的比例,并且到2013年,这一比例还将提高到三分之一。

    IDC在概念上对“云服务”和“云计算”做了区分。他们认为,云服务是指“可以在网络上实时交付并使用的产品、服务和方案”。而相对的,云计算则被定义为用于开发和部署“可以在网络上实时交付并使用的产品、服务和方案”的基础设施或软件系统。

    Chaudhary对此做了如下解释:“Schwab、Travelocity等企业多年来一直在开发自己的数据中心。而其中的关键问题是要对扩展性极强的应用程序进行管理,并保证最好的客户体验。为此,他们聘用了大量人员来做监控、测试和添加服务等工作。”而最近云设施技术的发展,比如Google App Engine,使得其它企业可以在Google的设施上运行他们的应用。“这意味着在云中部署应用的门槛已经相当低了。你不再需要数据中心或操作团队,而可以全力以赴地开发应用和功能。这是一种应用开发范例的转变。”

    对于测试人员来说,这同样意味着一种转变。Chaudhary举例道:“比如你构建了一个应用,可以通过黑莓手机使用,并托管于一家云公司(Salesforce),Salesforce要运行一定量的测试以保证服务可以正常使用。但是,对于应用本身来说,它是运行在1部手机上还是50部手机上呢?你是否需要加载一个非常大的页面呢?”另外,云托管公司可能会使用第三方的服务来提高性能。其对于测试结果就是,终端用户的体验将受到公司、云供应商和所有其它相关团体的影响。

    减少测试成本

    Lounibos说,加利福尼亚山景城的Soasta公司有一个正在逐渐扩大的客户群,他们没有自己的服务器,所有的操作都在云环境下进行,“尽管如此,他们的大部分操作还是比较传统的;他们与托管服务供应商合作,对云领域只做适度地深入。”然而,他也指出,基于云的测试也是企业了解云并减少测试成本的一个途径。

    “传统的客户认为测试是一个扔钱的无底洞。他们一直在寻找可以减少成本的方法。对于公司来说,云计算的主要问题是,它是否足够可靠。而测试不同。云环境下的测试只是模拟真实的情况,它并不涉及与生产相关的问题。但是它确实可以减少成本。”

    Lounibos说,通过云计算,测试人员“能够访问并使用大量的计算资源,而这正是测试所需要的。这个主意实在是太诱人了:你可以在5到8分钟内准备好125台服务器,但只需要按测试时间支付费用。你再也不需要为Web应用准备大型测试实验室了。”

    比如,可以使用Soasta的CloudTest虚拟云环境测试实验室或设备。它支持负载、性能、功能和Web UI/Ajax测试。

    而Keynote公司则为测试和分析互联网云上的Web应用提供了KITE (Keynote Internet Testing Environment)。通过KITE,可以在桌面及地理位置不同的各个位置随时进行测试。

    Chaudhary认为,互联网应用的性能测试特别需要在云环境下进行。“对于互联网应用来说,这不只是应用本身的问题,它涉及所有相关的供应商。你无法决定用户是使用DSL还是拨号,或者是移动设备。性能测试本来就是取决于环境的。”

    对于移动应用,Chaudhary认为,性能测试和功能测试都应该在云环境下进行。他说:“对于移动应用来说,功能测试同样也取决于供应商。你有一个可以登录的显示屏,即使应用可以正常运行,网页的大小、显示屏的大小,以及所有供应商也都会对其产生影响。”通过在云环境下进行测试,企业就能更容易地对上百种设备进行测试,同时节省更多的成本。

    市场研究公司Enterprise Management Associates副总裁Dennis Drogseth认为,对于在云环境中的应用来说,“你要测试与应用有关的网络性能、服务器性能、数据库性能、软件性能,以及它在客户端上的缓存情况。如果你只有在某个位置上运行的一个应用,你当然可以在一个位置上对其进行测试。但是对于Amazon或Facebook来说,应用分布在许多不同且无法预测的位置上。这种情况显然要比运行一个基于单一服务器的应用测试脚本复杂得多。”

    我们所面临的问题就是,要在各个不同的组件和地理位置上运行测试以确定问题,而“企业的应用开发通常无法使用这种环境。因此,Keynote(以及其它类似公司)就为这些测试人员提供了一个可用的环境,让他们可以利用互联网云和各种可能出现的情况,使用真实的网络和桌面。”

    对新测试工具的需求

    Drogseth认为现在需要新型测试工具。“你不能再使用为LAN或独立服务器准备的测试工具来进行云计算。所以,我们需要可以让我们了解网络和桌面等相关问题的工具。我们要让开发人员进入网络环境。”

    Lounibos也认为,“在将来五年的时间里,所有的测试工具供应商都会进入到云领域。届时将产生新一代的测试公司。云计算是一块有巨大潜力的市场,因为这就是我们使用服务的方式。”

  • 收藏精品文章

    2009-03-31 18:33:47

    什么是好的测试用例(一)http://www.51testing.com/html/200810/n96319.html

    什么是好的测试用例(二)http://www.51testing.com/html/200810/n96324.html

    什么是好的测试用例(三)http://www.51testing.com/html/200810/n96333.html

    什么是好的测试用例(四)http://www.51testing.com/?action_viewnews_itemid_96334.html

  • 如此对白!

    2009-03-31 17:51:59

    场景:B今天过生日,可是昨天晚上A刚和B开始冷战,而A又觉得一年才一次的生日都不送个祝福的话也太不像话了,或许还可能因此让自己这一年都过的不踏实,于是。。。

    (2009-03-31 15:03:22)   A
    生日快乐!
     
    (2009-03-31 15:04:00)   B
    我不生日了
    (2009-03-31 15:16:02)   B

    我的仙人掌要死了
    (2009-03-31 15:16:28)   A
    都是你不浇它
     
    (2009-03-31 15:16:40)   B
    你得还活着呢
    (2009-03-31 15:17:05)   A
    你浇浇它,它也会活的。
     
    (2009-03-31 15:17:55)   B
    被我那天压了下,皮都开始皱了
    (2009-03-31 15:18:40)   A
    谁让你平白无故去欺负人家,它生气了,不活了。
     
    (2009-03-31 15:19:03)  B


    (2009-03-31 15:19:24)   A
    哼!!
     

  • 开发转测试,怎么有种孙子变爷爷的感觉,哈哈

    2009-03-27 17:27:42

    不得不写日志留个纪念,呵呵,第一次提交BUG的心情可真好,和从前拿到BUG REPORT 的心情完全不一样。不得不说,同样是工作啊,测试还真是HAPPY.

  • Jmeter测试报表相关参数说明(转载)

    2009-03-09 17:46:39

    采用Jmeter测试工具对web系统作的负载测试,得出的响应报表,数据比较难懂,现作一具体说明。

    以下是在一次具体负载测试中得出的具体数值,测试线程设置情况为:线程数:200,等待时间(ramp-up):0秒,循环次数为永远,另:线程组——这些元件用于指定运行的线程数和等候周期。每个线程模拟一个用户,而等候周期用于指定创建全部线程的时间。例如,线程数为5,等候时间为10秒,则创建每个线程之间的时间间隔为2秒。循环数定义了线程的运行时间。使用调度器,还可以设置运行的起始时间。  取样器——对于服务器HTTP、FTP或LDAP请求,这些元件是可配置请求。该教程仅侧重于Web Services请求。  监听器——这些元件用于请求数据的后期处理。例如,可以将数据保存到文件或用图表来说明结果。此时JMeter图表并没有提供许多配置选项;然而它是可扩展的,它始终可以添加额外的可视化效果或数据处理模块。  得出的图形报表和聚合报告如下所示:  

    一、 图形报表

     

    图表底部参数的含义如下:  样本数目是总共发送到服务器的请求数。  最新样本是代表时间的数字,是服务器响应最后一个请求的时间。  吞吐量是服务器每分钟处理的请求数。  平均值是总运行时间除以发送到服务器的请求数。  中间值是代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。  偏离表示服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布。

  • 验收测试点总结(转载)

    2009-03-09 13:15:28

    一.功能测试

      1. 安装测试:

      1) 安装过程中对于缺省安装目录及任意指定的安装目录,是否都能正确安装;

      2) 若是选择安装,查看能否实现其相应的功能;

      3) 在所有能中途退出安装的位置退出安装程序后,验证此程序并未安装成功(没有程序组及程序项产生);

      4) 软件安装后,对其它已经安装的软件是否有影响;

      5) 裸机安装后,各功能点是否可用;

      6) 安装前,安装程序是否判断可用磁盘空间大小,如果不能满足安装空间要求,安装程序能否继续;

      7) 安装过程中查看 版权声明、版本信息、公司名称、LOGO等是否符合标准;

      8) 安装过程中界面显示与提示语言是否准确、友好;

      9) 重复安装时系统是否有提示、是否可以覆盖安装、是否可以升级安装、是否允许多版本共存;

      10) 是否有注册码或硬件加密狗,在没有它们(或错误)存在的情况下能否顺利安装。

      2.配置测试

      1) 是否可以按照用户手册的说明,运行于多种操作系统Windows各版本 、Unix 、Linux等);

      2) 按系统最低要求进行软件的安装配置,查看能否正常实现各种功能;

      3) 数据源等信息配置不正确时能否给出提示信息;

      4) 是否可以按照用户手册的说明,支持多种数据库

      3. 卸载测试

      1) 卸载后注册表中的注册信息及相关的程序安装目录是否能完全删除掉;

      2) 卸载过程中完全删除共享文件后,看其它程序能否正常运行;

      3) 卸载后,是否对其它已经安装的软件有影响;

      4) 系统卸载后用户建立文档是否保留;

      5) 软件卸载画面上的软件名称及版本信息是否正确;

      6) 在所有能中途退出卸载的位置是否能正确退出;

      7) 卸载过程中界面显示与提示语言是否准确、友好;

      8) 卸载后安装此系统能否打开原来保存的文件,并一切运行正常;

      9) 卸载程序如果要求重新启动机器,在重启动之间是否给用户提示以保存现有的己运行的程序的资料;

      10) 是否可以选择组件进行卸载;

      11) 卸载过程中,对意外情况的处理(掉电等)。

      12) 在卸载过程中,是否有终止或者结束按钮。

      4. 运行与关闭测试

      1) 运行时是否与其它应用程序有冲突(内存冲突);

      2) 是否可以同时运行多个程序;

      3) 任务栏有无程序运行提示;

      4) 若有未保存的数据,关闭系统时是否有提示;

      5) 后台服务程序在点击关闭按钮时是否有确认提示;

      6) 运行时是否过份占用系统资源、退出时能否完成释放占用的系统资源。

      5. 服务程序的测试:

      1) 系统是否限制服务器程序启动的数量,如不限制,同一范围内启动多个服务是否对系统有影响;

      2) 服务程序能否长时间正常运行;

      3) 外界异常后,服务程序的自动恢复能力(服务器掉电、网络中断后恢复、数据库异常后恢复…);

      4) 在点击关闭按钮时是否有确认提示;

      5) 应用程序与其他程序是否兼容(能否避免内存冲突)。

     6. 系统管理(参数设置)

      1) 参数设置后,能否正确的进行应用;

      2) 设置错误参数,系统的容错能力;

      3) 修改参数,对与之相关模块的影响;

      4) 系统是否有默认的参数,A 有:默认的参数是否起到作用 ;B 没有:不设置,系统能否运行或者给出提示。

      7. 用户、权限管理

      1) 赋予一个人员相应的权限后,在界面上看此人员是否具有此权限,并以此人员身份登陆,验证权限设置是否正确(能否超出所给予的权限);

      2) 删除或修改已经登陆系统并正在进行操作的人员的权限,程序能否正确处理;

      3) 重新注册系统变更登陆身份后再登录,看程序是否能正确执行,具有权限是否正确;

      4) 在有工作组或角色管理的情况下,删除包含用户的工作组或角色,程序能否正确处理;

      5) 不同权限用户登录同一个系统,权限范围是否正确;

      6) 覆盖系统所有权限设定;

      7) 能否添加信息为空的用户(其中包括空用户名及空口令、空用户名非空口令、非空用户名及空口令);

      8) 能否添加长用户名及长口令,如果允许,新用户能否正确登录;

      9) 系统是否允许删除系统管理员这一特殊用户或修改系统管理员口令,删除或修改后系统的实际情况;

      10) 登录用户能否修改自己的权限;

      11) 添加用户(有标识或编号):标识相同,用户名不同;标识相同,用户名相同;标识不同,用户名相同;标识不同,用户名不同;

      12) 登录用户能否修改本人(或其他人)的信息,删除本人(或其他人);

      13) 修改用户的信息(包括权限,口令,基本信息等),对其他模块的影响;

      14) 修改用户信息:修改后的用户信息和已经存在的用户信息相同;修改后的用户信息和已经存在的用户信息不同;

      15) 不给用户授权,是否允许登录;

      15) 改某些设置时,是否会影响具有上级权限及相同权限人员的设置;

      16) 系统管理员修改了某些数据,以其他人员身份登录时数据是否改变;

      17) 用户能否同时属于多个组,各个组的权限能否交叉;

      18) 删除后重新添加的用户是否具有以前的权限;更改用户各项属性(包括权限)看对权限是否有影响。

      8. 系统登录测试

      1) 使用合法用户登录系统;

      2) 用户名、口令错误或漏填时能否登陆;

      3) 系统是否容许多次非法登陆,是否有次数限制;

      4) 使用已登录账号登录系统系统能否正确处理;

      5) 使用禁用帐号登陆系统能否正确处理;

      6) 删除或修改后的用户用原用户登录;

      7) 不输入用户名和口令,重复点“确定”和“取消”按钮,是否允许登录。

      9. 注销

      1) 注销为原模块、新模块系统能否正确处理;

      2) 中止注销能否返回原模块、原用户;

      3) 注销为原用户、新用户系统能否正确处理;

      4) 使用错误的帐号、口令或无权限帐号、被禁用帐号进行注销。

      10. 修改口令

      1) 正常情况;

      2) 输入错误的原口令或新口令与确认口令不一致系统能否正确处理;

      3) 修改口令后,用原口令是否能登录(同时验证新口令是否有效);

      4) 是否能修改其它用户的口令。

      11. 右键功能

      1) 右键菜单中的功能是否与菜单(或工具栏)中对应的功能一致;

      2) 右键菜单中的功能能否正确实现;

      3) 同一菜单下的热键是否相同。

      12. 记录列表

      1) 增加重复记录、空白记录,系统能否正确处理;

      2) 修改后不保存(有保存按钮),系统能否正确处理;

      3) 删除或修改正在使用信息,系统能否正确处理;

      4) 删除级联记录的上游或下游记录,系统能否正确处理;

      5) 删除记录时是否有提示;

      6) 记录中包含的缺省系统信息能否删除和修改;

      7) 记录列表能否及时反应记录的变化;

      8) 记录变化之后系统相关信息能否及时更新;

      13. 统计、查询

      1) 对非法的时间范围系统能否正确处理;

      2) 统计查询语句包含多个与或非条件时,系统能否正确处理;

      3) 条件逻辑混乱,系统能否正确处理;

      4) 多表查询统计及单表查询统计功能是否正确实现;

      5) 分类查询、精确查询、无条件查询、组合查询能否完整列出满足条件的记录;

      6) 能否按系统默认的条件进行查询;

      7) 当统计时间段为当日、跨日、跨月、跨季、跨年度时,统计查询结果是否正确;

      8) 当某些操作被别人取消后,设置条件段为取消前、取消后、包含取消操作的一段时间;

      9) 以不同的权限登录时,统计、查询是否正确;

      10) 在查询或统计大数据量时,系统是否允许终止操作;

      11) 查询、统计按钮是否允许双击或更多的点击,系统做何反映;

      12) 查询出的数据是否允许修改。

      14. 文件操作

      a、保存

      1) 文件是否能够正确保存在在缺省位置或指定位置(本地、网络);

      2) 系统能否正确处理长文件名、特殊字符文件名保存;

      3) 文件能否保存为其它扩展名;

      4) 如应用程序对文件名区分大小写,当这些文件在导出到介质中时,系统能否正确处理;

      5) 介质空间已满时,系统是否给出提示。

      b、打开

      1) 打开文件是否正确显示上一次保存的内容;

      2) 系统能否正确处理非系统默认扩展名的文件;

      3) 文件能否被其他程序正确打开;

      4) 打开对话框中,是否有默认扩展名的文件类型;

      5) 打开对话框时,是否有默认的路径。

      c、打印输出

      1) 是否按所设置的格式打印;

      2) 是否有打印预览,能否设置打印字体,打印效果是否合乎客户要求;

      3) 打印预览的内容是否正确,内容是否能够进行拖拽操作,是否影响实际的打印;

      4) 安装或不安装打印功能模块,对其它模块是否有影响;

      5) 打印机未安装系统有无提示;

      6) 打印中途能否进行正常的打印中断,是否可以选择打印的内容。

      7) 能否进行本地或网络打印。

      d、导入、导出功能

      1) 导入的文件格式非要求时,系统如何处理;

      2) 导入、导出的有效文件能否完整正确地显示并被使用;

      3) 导出后的文件是否允许修改,如果允许,导入后能否使用;如不允许,系统有何限制;

      4) 导入,导出是否可以选择路径;

      5) 在客户端和服务器端进行导入,导出;

      6) 在客户端和客户端之间进行导入,导出;

      7) 在本地进行导入,导出;

      8) 不同文件格式的导入,导出。

      e、检入与检出

      1) 单文件、多文件检入与检出;

      2) 能否多次检入与检出;

      3) 文件检出后其它人能对其做何操作。

    二.性能测试

      具体用例不好设计,下面列出了一些有性能要求的测试点:

      1) 查询

      2) 保存

      3) 统计

      4) 刷新

      5) 显示

      6) 传输

      7) 响应

      8) 下载

      打开网络上其它介质上的文件时,可制造网络拥挤情况下的文件打开操作。主要测试点,集中在几个点上。一是数据量小的时候主要的查询统计刷新等功能点;二是数据量积累到一定程度时的查询统计刷新时间,这里的一定程度是根据实际的项目和客户需求来定的。

      三.极限压力测试

      1) 接收大数据量的数据文件时间;

      2) 大数据恢复时间;

      3) 大数据导入导出时间;

      4) 大批量录入数据时间;

      5) 大数据量的计算时间;

      6) 多客户机同时进行某一个提交操作;

      7) 采用测试工具软件;

      8) 编写测试脚本程序;

      9) 大数据量的查询统计时间。

      四. 容错测试

      1) 通过断开网线的强制性停止数据传输以及重新将网线接上,查看提示信息及对系统的影响;

      2) 系统断电,恢复后查看对系统的影响程度;

      3) 死机后,看程序如何处理;

      4) 服务器DOWN掉,客户端程序如何处理。

      五.并发测试

      1) 登录的并发操作:多人同时登录系统,使用不同或相同账号;

      2) 提交的并发操作:多人同时提交相同的工作项、不同的工作项;

      3) 对数据库操作的并发操作:多人同时从数据库中读出(或向数据库导入) 相同文件、不同文件。

    ************************

      附:一些容易出错的地方

      ************************

      一. 有关新建和修改

      1. 创建或修改的内容为已经存在的内容,系统是否有提示;

      2. 修改正在使用的数据。

      二. 删除

      1. 应有确认提示;

      2. 若删除的内容在文件或数据库中,应作实际校验;

      3. 删除正在使用的数据;

      4. 考虑删除数据的相关数据是否同时被删除;

      5. 重新使用已删除的数据。

      三.关于提示信息的验证

      有些操作系统会给出成功(有时没有成功提示)或失败的提示,一定要验证提示的正确性(尤其是一些重要操作,如修改口令),即用其它方法检查所作的操作是否真正成功或失败。

      四.关于考虑硬盘空间已满的情况

      1. 数据存储和备份;

      2. 生成文件;

      3. 拷贝文件

      五.关于修改系统时间

      对于和时间有关的业务,测试时考虑修改系统时间对系统的影响。

      六.对于响应速度慢的按钮进行连续点击;或中途取消,再继续…

      七.凡是支持并发过程的功能,一定要做并发测试(手工进行或利用工具);

      八.打印功能(能否正确打印,打印效果与预览是否一致)

      九.系统初始化

      1) 如果系统安装后需要进行初始化,初始化过程是否正确;

      2) 如果系统安装后不需要进行初始化,安装后的默认设置是否正确、适当。

      十.版权声明是否符合标准,如果有公司的logo,图标是否正确(最容易测试的地方,也是最容易被忽略的地方)

      十一.如果捆绑硬件,如果可能的话,在测试我们的软件产品前要对硬件的性能、稳定性进行严格测试。(包括大数据量的传输入等)

      十二.备份与恢复

      1) 备份与恢复过程本身的正确性;

      2) 备份内容的正确性(通过事先准备的测试数据在恢复后验证);

      3) 备份与恢复过程中对异常情况的处理(掉电、网络不通等);

      4) 在原始机上的恢复;

      5) 在非原始机上的恢复;

      6) 在裸机(只有操作系统和必要的数据库或第三方产品)上的恢复;

      7) 在一台机器上进行若干次的备份与恢复;

      8) 如果是支持多数据库的软件,备份与恢复是容易出错的地方。

      需要严格把握的错误类别:

      在整个测试过程中对每条问题都制定有错误归类,现按照问题的严重程度,把问题主要分为四类:

      A:严重影响系统运行:导致系统出现不可预料的严重错误的问题,例如:运行过程中出现页面或页面无法显示、死机等;

      B:影响系统运行:系统中重要的功能出现运行错误,例如:导致用户必须重新登录的问题,导致个别用户不可用的问题;

      C:不影响系统运行但必须修改:系统中基本的操作或功能没有实现或实现有误的问题,以及不符合常规的操作界面的问题;

      D:所提建议:不影响系统运行,对系统的可用性等提示的建议性的问题。


  • LoadRunner8.2不支持IE7.0

    2009-03-06 16:42:58

    错误提示:The default browser registered at this machine is not supported by the Web VUser recorder.Please change the recording options or select another default browser.

    在安装完LR8.2开始准备录制时也许会出现以上的错误,出现上面错误又两种可能,一种是您使用的浏览器没有将IE设置为默认的浏览器,在IE浏览器的Tools的设置中更改一下即可。不过由于这种原因导致LR不能正常录制的可能性比较小。很大的可能是因为您正使用的IE7浏览器,而HP官方已经解释LR8.2是不能支持IE7录制脚本的,所以,您的解决方案是:升级LR8.2至LR9.0或者给LR8.2打FP4的补丁。鉴定完毕

     

  • IE7.0访问QC解决方案

    2009-01-09 14:36:03

    在装了IE7.0后不能访问Mercury Quality Center了,IE上报告的错误是:

    Microsoft Internet Explorer : 4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; CIBA) is not supported!

    造成这个问题的主要原因时,目前Mercury不支持IE7.0,所以我们的解决方法就是更改注册表,使QC认为当前系统使用的BROWSER是IE7.0.


    更改注册表项目的列表:
    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent]
    "Version"="MSIE 6.0"
    "Platform"="Windows NT 5.1"

    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent\Post

    Platform]
    "SV1"=""

    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Version Vector]
    "IE"="6.0000"

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent]
    "Version"="MSIE 6.0"
    "Platform"="Windows NT 5.1"

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent\Post Platform]
    "SV1"=""

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version Vector]
    "IE"="6.0000"

    可以直接在注册表里修改,也可以把以上文件存为IE6.reg文件,然后双击执行,注册表即会自动更改。然后关掉IE重启,再尝试连接QC即可,或者重启电脑(推荐)然后打开IE,尝试连接QC, over!

  • Web测试

    2008-12-01 15:45:53

    基于Web的系统测试在基于Web的系统开发中,如果缺乏严格的过程,我们在开发、发布、实施和维护Web的过程中,可能就会碰到一些严重的问题,失败的可能性很大。而且,随着基于Web的系统变得越来越复杂,一个项目的失败将可能导致很多问题。当这种情况发生时,我们对Web和Internet的信心可能会无法挽救地动摇,从而引起Web危机。并且,Web危机可能会比软件开发人员所面对的软件危机更加严重、更加广泛。

      在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。然而,Internet和Web媒体的不可预见性使测试基于Web的系统变得困难。因此,我们必须为测试和评估复杂的基于Web的系统研究新的方法和技术。 一般软件的发布周期以月或以年计算,而Web应用的发布周期以天计算甚至以小时计算。

      Web测试人员必须处理更短的发布周期,测试人员和测试管理人员面临着从测试传统的C/S结构和框架环境到测试快速改变的Web应用系统的转变。

      一、 功能测试
    Ogl5d ~9qY154414  1、链接测试 链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。 链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。

      2、表单测试 当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。

      3、Cookies测试 Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。 如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。

      4、设计语言测试 Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如Java、Javascrīpt、 ActiveX、VBscrīpt或Perl等也要进行验证。

      5、数据库测试 在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。 在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。

      二、 性能测试

      1、连接速度测试

      用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。 另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。

      2、负载测试

      负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?

      3、压力测试

      负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。 进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。 压力测试的区域包括表单、登陆和其他信息传输页面等。

      三、 可用性测试

      1、导航测试 导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助? 在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。 导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。 Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。 
    \3uxtY$Qfxj3L154414
    /z5jj$W;W-~154414    2、图形测试 在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。

      图形测试的内容有:
    ?Z`c)f9qv;I154414  (1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。 51Testing软件测试网#E,FEh U'LB
      (2)验证所有页面字体的风格是否一致。 51Testing软件测试网"LVS^LXLu^
      (3)背景颜色应该与字体颜色和前景颜色相搭配。
    oW$?4lh7w154414  (4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。

      3、内容测试

      内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。 信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word的"拼音与语法检查"功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓"相关文章列表"。

      4、整体界面测试

      整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致? 对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。 对所有的可用性测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。

      四、 客户端兼容性测试

      1、平台测试

      市场上有很多不同的操作系统类型,最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。 因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。

      2、浏览器测试

      浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、Javascrīpt、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,Javascrīpt是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。 测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。

      五、 安全性测试

      Web应用系统的安全性测试区域主要有:

      (1)现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等。

      (2)Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。

      (3)为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。

      (4)当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性。

      (5)服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。

      六、总结

      本文从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法。 基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战。基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测 .

  • Java线程总结(转载)

    2008-10-23 18:10:51

    在论坛上面常常看到初学者对线程的无可奈何,所以总结出了下面一篇文章,希望对一些正在学习使用java线程的初学者有所帮助。
    %N3q2[E|wR@n184841
    FrAt,`9M#Z,r184841
    首先要理解线程首先需要了解一些基本的东西,我们现在所使用的大多数操作系统都属于多任务,分时操作系统。正是由于这种操作系统的出现才有了多线程这个概念。我们使用的windows,linux就属于此列。什么是分时操作系统呢,通俗一点与就是可以同一时间执行多个程序的操作系统,在自己的电脑上面,你是不是一边听歌,一边聊天还一边看网页呢?但实际上,并不上cpu在同时执行这些程序,cpu只是将时间切割为时间片,然后将时间片分配给这些程序,获得时间片的程序开始执行,不等执行完毕,下个程序又获得时间片开始执行,这样多个程序轮流执行一段时间,由于现在cpu的高速计算能力,给人的感觉就像是多个程序在同时执行一样。51Testing软件测试网]1Hs h QC
    一般可以在同一时间内执行多个程序的操作系统都有进程的概念.一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间,一组系统资源.在进程概念中,每一个进程的内部数据和状态都是完全独立的.因此可以想像创建并执行一个进程的系统开像是比较大的,所以线程出现了。在java中,程序通过流控制来执行程序流,程序中单个顺序的流控制称为线程,多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务.多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行.(你可以将前面一句话的程序换成进程,进程是程序的一次执行过程,是系统运行程序的基本单位)
    )`A s\*Y-hIg184841
    0A*H2[2z-d5N184841
    线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制;但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈.所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程也被称为轻负荷进程(light-weight process).一个进程中可以包含多个线程.
    0L7m4z5|-Ngf#P18484151Testing软件测试网y1un)Jh
    多任务是指在一个系统中可以同时运行多个程序,即有多个独立运行的任务,每个任务对应一个进程,同进程一样,一个线程也有从创建,运行到消亡的过程,称为线程的生命周期.用线程的状态(state)表明线程处在生命周期的哪个阶段.线程有创建,可运行,运行中,阻塞,死亡五中状态.通过线程的控制与调度可使线程在这几种状态间转化每个程序至少自动拥有一个线程,称为主线程.当程序加载到内存时,启动主线程.51Testing软件测试网B \x`6Q

    u:R-v!nF&h O184841[
    线程的运行机制以及调度模型]
    java中多线程就是一个类或一个程序执行或管理多个线程执行任务的能力,每个线程可以独立于其他线程而独立运行,当然也可以和其他线程协同运行,一个类控制着它的所有线程,可以决定哪个线程得到优先级,哪个线程可以访问其他类的资源,哪个线程开始执行,哪个保持休眠状态。
    The image “http://java.chinaitlab.com/UploadFiles_8734/200604/20060404144316962.jpg” cannot be displayed, because it contains errors.The image “http://java.chinaitlab.com/UploadFiles_8734/200604/20060404144316962.jpg” cannot be displayed, because it contains errors.
    线程的状态表示线程正在进行的活动以及在此时间段内所能完成的任务.线程有创建,可运行,运行中,阻塞,死亡五中状态.一个具有生命的线程,总是处于这五种状态之一:
    sR'CqJ Q6K1848411.
    创建状态
    c O1Nh\X!r0e184841
    使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread)
    n)m%fT2k0h A;n9U1848412.
    可运行状态
    iS `M+FC?1d184841
    使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable)51Testing软件测试网Cw wNk(f p&]4\
    3.
    运行中状态51Testing软件测试网R Uty&E%U9K_*Xs
    Java
    运行系统通过调度选中一个Runnable的线程,使其占有CPU并转为运行中状态(Running).此时,系统真正执行线程的run()方法.51Testing软件测试网-s0I EA})e.SH
    4.
    阻塞状态51Testing软件测试网T}XJ0w AgG+q
    一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态(Blocked)
    H1dCpa ^G1848415.
    死亡状态51Testing软件测试网vU-B%P&?K
    线程结束后是死亡状态(Dead)
    S V O!] X!U7[18484151Testing软件测试网9nk q:AVJ'z
    同一时刻如果有多个线程处于可运行状态,则他们需要排队等待CPU资源.此时每个线程自动获得一个线程的优先级(priority),优先级的高低反映线程的重要或紧急程度.可运行状态的线程按优先级排队,线程调度依据优先级基础上的"先到先服务"原则.
    *x4D+IA8i7U;s184841
    线程调度管理器负责线程排队和CPU在线程间的分配,并由线程调度算法进行调度.当线程调度管理器选种某个线程时,该线程获得CPU资源而进入运行状态.
    ~ _-K9A-w(h h#dG18484151Testing软件测试网^8x.UA&X9R2Y q
    线程调度是先占式调度,即如果在当前线程执行过程中一个更高优先级的线程进入可运行状态,则这个线程立即被调度执行.先占式调度分为:独占式和分时方式.51Testing软件测试网;^.c,x/Oq5M/jH
    独占方式下,当前执行线程将一直执行下去,直 到执行完毕或由于某种原因主动放弃CPU,CPU被一个更高优先级的线程抢占
    7HL ^'p'\K]2h184841
    分时方式下,当前运行线程获得一个时间片,时间到时,即使没有执行完也要让出CPU,进入可运行状态,等待下一个时间片的调度.系统选中其他可运行状态的线程执行51Testing软件测试网,e0Xv9@$cF;or
    分时方式的系统使每个线程工作若干步,实现多线程同时运行
    2XqN A$_B184841
    l&O,L$A-Hee184841
    另外请注意下面的线程调度规则(如果有不理解,不急,往下看):
    如果两个或是两个以上的线程都修改一个对象,那么把执行修改的方法定义为被同步的(Synchronized,如果对象更新影响到只读方法,那么只度方法也应该定义为同步的
    7\ n-D])Wd/rP184841
    如果一个线程必须等待一个对象状态发生变化,那么它应该在对象内部等待,而不是在外部等待,它可以调用一个被同步的方法,并让这个方法调用wait()51Testing软件测试网3p2b%v'n%[!GCGM
    每当一个方法改变某个对象的状态的时候,它应该调用notifyAll()方法,这给等待队列的线程提供机会来看一看执行环境是否已发生改变51Testing软件测试网K&dg6U o6d3YN&x
    记住wait(),notify(),notifyAll()方法属于Object类,而不是Thread类,仔细检查看是否每次执行wait()方法都有相应的notify()notifyAll()方法,且它们作用与相同的对象 在java中每个类都有一个主线程,要执行一个程序,那么这个类当中一定要有main方法,这个man方法也就是java class中的主线程。你可以自己创建线程,有两种方法,一是继承Thread类,或是实现Runnable接口。一般情况下,最好避免继承,因为java中是单根继承,如果你选用继承,那么你的类就失去了弹性,当然也不能全然否定继承Thread,该方法编写简单,可以直接操作线程,适用于单重继承情况。至于选用那一种,具体情况具体分析。
    如果两个或是两个以上的线程都修改一个对象,那么把执行修改的方法定义为被同步的(Synchronized,如果对象更新影响到只读方法,那么只度方法也应该定义为同步的
    7\ n-D])Wd/rP184841
    如果一个线程必须等待一个对象状态发生变化,那么它应该在对象内部等待,而不是在外部等待,它可以调用一个被同步的方法,并让这个方法调用wait()51Testing软件测试网3p2b%v'n%[!GCGM
    每当一个方法改变某个对象的状态的时候,它应该调用notifyAll()方法,这给等待队列的线程提供机会来看一看执行环境是否已发生改变51Testing软件测试网K&dg6U o6d3YN&x
    记住wait(),notify(),notifyAll()方法属于Object类,而不是Thread类,仔细检查看是否每次执行wait()方法都有相应的notify()notifyAll()方法,且它们作用与相同的对象 在java中每个类都有一个主线程,要执行一个程序,那么这个类当中一定要有main方法,这个man方法也就是java class中的主线程。你可以自己创建线程,有两种方法,一是继承Thread类,或是实现Runnable接口。一般情况下,最好避免继承,因为java中是单根继承,如果你选用继承,那么你的类就失去了弹性,当然也不能全然否定继承Thread,该方法编写简单,可以直接操作线程,适用于单重继承情况。至于选用那一种,具体情况具体分析。
    eg.继承Thread
    8EPo'WBq L.D18484151Testing软件测试网/t-L7?#y"l-jepublic class MyThread_1 extends Thread
    h
    {
    {m{.oAx }184841public void run()
    C VD,U!e.`m5V184841{51Testing软件测试网9g(E2O4{(s
    //some code 51Testing软件测试网qEg'GU
    }51Testing软件测试网 n/g1i}/c6BAB7L
    }
    eg.实现Runnable接口
    public class MyThread_2 implements Runnable
    51Testing软件测试网;u dA;V
    51Testing软件测试网;u dA;Vpublic class MyThread_2 implements Runnable51Testing软件测试网;u dA;V51Testing软件测试网;u dA;V{
    d#F|E)qk9NP184841public void run()51Testing软件测试网ZN7t k ~Dp\'R'l)i
    {51Testing软件测试网:BlJ6^^5m4y3K
    //some code 51Testing软件测试网F9ltM.p#M
    }51Testing软件测试网 P'i+ga1NKr*l s
    }
    当使用继承创建线程,这样启动线程:
    new MyThread_1().start()
    当使用实现接口创建线程,这样启动线程:
    new Thread(new MyThread_2()).start()
    注意,其实是创建一个线程实例,并以实现了Runnable接口的类为参数传入这个实例,当执行这个线程的时候,MyThread_2run里面的代码将被执行。51Testing软件测试网J2E b)x,Ls\/T
    下面是完成的例子:

    public class MyThread implements Runnable51Testing软件测试网s(p,{3I+f%_eu3b
    {

    L!i.}P


    Qt
    k r~184841
    Is.L'B*t$Z#k2@W184841public void run()
    'l[n5B:G184841{
    v2Z,]v|T,i
    oz184841
    System.out.println("My Name is "+Thread.currentThread().getName());

    H"T"APQ[1]RW5S­D184841
    } 51Testing软件测试网*N'f4y6M"z
    o

    public static void main(String[] args)
    ?o5]­op[1]Z184841{
    ­fT y
    ~
    g184841
    new Thread(new MyThread()).start(); 51Testing
    软件测试网1L-Js%h9[&F0A
    }51Testing
    软件测试网R[0y
    G
    ]8}$cH,k
    G`

    }

    执行后将打印出:51Testing软件测试网Y YC,Q&\
    My Name is Thread-0
    你也可以创建多个线程,像下面这样
    `9?&Sj,ht~4T O18484151Testing软件测试网c6ZK?n2g

    new Thread(new MyThread()).start();51Testing软件测试网'E4?y/{7vtK RzT
    new Thread(new MyThread()).start();

    new Thread(new MyThread()).start();

    那么会打印出:
    k m5_$Ra?x4S184841My Name is Thread-0
    Ft [e.DWm`M184841My Name is Thread-151Testing软件测试网/{1W4mb/[L\2? uy
    My Name is Thread-2

    看了上面的结果,你可能会认为线程的执行顺序是依次执行的,但是那只是一般情况,千万不要用以为是线程的执行机制;影响线程执行顺序的因素有几点:首先看看前面提到的优先级别

    public class MyThread implements Runnable51Testing软件测试网4`_$Tph pZ;h6X5_
    { 51Testing软件测试网SlH{vx[

    ;?|`w9] Zbdpe184841public void run()51Testing软件测试网 vRVp*L-~
    { 51Testing软件测试网6Gh)Y.wW(X,aJ6T?W(o
    System.out.println("My Name is "+Thread.currentThread().getName());
    nn3E-Mqq.u+B jP5J184841} 51Testing软件测试网a(A0e }pQ+m;C6g
    public static void main(String[] args)51Testing软件测试网um6X$OP9u*m'y
    {
    {*E:ljT Z184841Thread t1=new Thread(new MyThread());

    Thread t2=new Thread(new MyThread());51Testing软件测试网x,W(\(R{zLn
    Thread t3=new Thread(new MyThread());51Testing软件测试网4vTt&s"N
    t2.setPriority(Thread.MAX_PRIORITY);//
    赋予最高优先级

    t1.start();51Testing软件测试网kx8|EK
    t2.start();
    .z;v|\7G/L184841t3.start();51Testing软件测试网xhYL5Gy
    }
    0bx-G ~6GK9q184841}
    再看看结果:51Testing软件测试网~:R @J)w~/ey'k$L
    My Name is Thread-151Testing软件测试网9D Q.U(]m
    My Name is Thread-0
    n"w%S G\j:r\|It184841My Name is Thread-2
    线程的优先级分为10级,分别用110的整数代表,默认情况是5。上面的t2.setPriority(Thread.MAX_PRIORITY)等价与t2.setPriority(1051Testing软件测试网!Z!_4`7lS
    然后是线程程序本身的设计,比如使用sleep,yield,joinwait等方法(详情请看JDKDocument)

    public class MyThread implements Runnable
    #zI7`@.P%y184841{ 51Testing软件测试网D.R9L7k M%T/{4N*u MJ+\i)M
    public void run()
    0u J3hnm;m[q e9N3o C184841{ 51Testing软件测试网Ew GP$u6I.{
    try51Testing软件测试网:KE u+h(V O4l
    {
    +o-\UC S1HJy6o184841int sleepTime=(int)(Math.random()*100);//
    产生随机数字,51Testing软件测试网2uZ0}"Q@2n:Yw/^[u
    Thread.currentThread().sleep(sleepTime);//
    让其休眠一定时间,时间又上面sleepTime决定
    //public static void sleep(long millis)throw InterruptedException API
    N jRA6aD6O184841System.out.println(Thread.currentThread().getName()+"
    睡了 "+sleepTime);
    ^X'B2]I3o$Q.|]184841}catch(InterruptedException ie)//
    由于线程在休眠可能被中断,所以调用sleep方法的时候需要捕捉异常
    B%d#WW;lD"{184841{51Testing软件测试网 Kf{Ct6|~in'|
    ie.printStackTrace();51Testing软件测试网5joR7}g;f+u.iB$d
    }
    Y*`.| w:Q-Eh `Y-BM184841}
    public static void main(String[] args)
    `E
    {
    Thread t1=new Thread(new MyThread());
    2m
    Thread t2=new Thread(new MyThread());51Testing软件测试网 {+PtH@:S
    Thread t3=new Thread(new MyThread());
    t1.start();
    #rGK8M"^ MEPQ184841t2.start();
    )u8m,z6n3w184841t3.start();
    }
    3EWECJ9gJ184841}

    执行后观察其输出:51Testing软件测试网]-em!YC1O
    51Testing软件测试网wL4^8]-E;fqZ _M
    Thread-0
    睡了 11
    -P8\#f%VJ-m7@&D7E.J184841Thread-2
    睡了 48
    D,pL?B l184841Thread-1
    睡了 69

    上面的执行结果是随机的,再执行很可能出现不同的结果。由于上面我在run中添加了休眠语句,当线程休眠的时候就会让出cpucpu将会选择执行处于runnable状态中的其他线程,当然也可能出现这种情况,休眠的Thread立即进入了runnable状态,cpu再次执行它。
    :H#O0_%U"N\q n`184841[
    线程组概念]51Testing软件测试网9S@$M(l'CWr{
    线程是可以被组织的,java中存在线程组的概念,每个线程都是一个线程组的成员,线程组把多个线程集成为一个对象,通过线程组可以同时对其中的多个线程进行操作,如启动一个线程组的所有线程等.Java的线程组由java.lang包中的Thread——Group类实现.51Testing软件测试网tl+~b-nK5l
    ThreadGroup
    类用来管理一组线程,包括:线程的数目,线程间的关系,线程正在执行的操作,以及线程将要启动或终止时间等.线程组还可以包含线程组.Java的应用程序中,最高层的线程组是名位main的线程组,main中还可以加入线程或线程组,mian的子线程组中也可以加入线程和线程组,形成线程组和线程之间的树状继承关系。像上面创建的线程都是属于main这个线程组的。
    q1PL;BQyE'u J:a'z184841
    借用上面的例子,main里面可以这样写:
    public static void main(String[] args)
    +P]CD6o6Sl184841{51Testing软件测试网)O0oQ-ck CT_C9v
    /***************************************51Testing软件测试网5GM"l&|v
    ThreadGroup(String name) 51Testing软件测试网1e Y6Wo;S"f
    ThreadGroup(ThreadGroup parent, String name)
    ***********************************/51Testing软件测试网`8G,`:o9Xxz'u\
    ThreadGroup group1=new ThreadGroup("group1");
    0d NH*r&KP184841ThreadGroup group2=new ThreadGroup(group1,"group2");51Testing软件测试网 Lt;FTg$a&R"i1B8U
    Thread t1=new Thread(group2,new MyThread());51Testing软件测试网qI8dO ]'u5R,? y
    Thread t2=new Thread(group2,new MyThread());
    )t*Q{7sWfiba dD+u184841Thread t3=new Thread(group2,new MyThread());51Testing软件测试网H:wg*e6d3]
    ***********************************/51Testing软件测试网`8G,`:o9Xxz'u\
    ThreadGroup group1=new ThreadGroup("group1");
    0d NH*r&KP184841ThreadGroup group2=new ThreadGroup(group1,"group2");51Testing软件测试网 Lt;FTg$a&R"i1B8U
    Thread t1=new Thread(group2,new MyThread());51Testing软件测试网qI8dO ]'u5R,? y
    Thread t2=new Thread(group2,new MyThread());
    )t*Q{7sWfiba dD+u184841Thread t3=new Thread(group2,new MyThread());
    t1.start();
    ?;Q]5xR184841t2.start();51Testing软件测试网z JLc7uY
    t3.start();51Testing软件测试网2W T} E(d,e Z*e)F
    }

    线程组的嵌套,t1,t2,t3被加入group2,group2加入group151Testing软件测试网K*c![2B[H~:U
    另外一个比较多就是关于线程同步方面的,试想这样一种情况,你有一笔存款在银行,你在一家银行为你的账户存款,而你的妻子在另一家银行从这个账户提款,现在你有1000块在你的账户里面。你存入了1000,但是由于另一方也在对这笔存款进行操作,人家开始执行的时候只看到账户里面原来的1000元,当你的妻子提款1000元后,你妻子所在的银行就认为你的账户里面没有钱了,而你所在的银行却认为你还有2000元。51Testing软件测试网,q Fc1V0V
    看看下面的例子:
    class BlankSaving //储蓄账户51Testing软件测试网1[LY;ep+d R'x
    {
    W8e"i%]f184841private static int money=10000;51Testing软件测试网4IcXE m*z$Gn#_
    public void add(int i)
    Q|C8v?X Pd184841{
    money=money+i;51Testing软件测试网$`W$Cg.p,`
    System.out.println("Husband
    向银行存入了 ["+i+"]");51Testing软件测试网8gC1s+s-{B*E u
    }
    money=money+i;51Testing软件测试网$`W$Cg.p,`
    System.out.println("Husband
    向银行存入了 ["+i+"]");51Testing软件测试网8gC1s+s-{B*E u
    }
    public void get(int i)
    2P;dx1te!z$]i184841{
    money=money-i;
    System.out.println("Wife 向银行取走了 ["+i+"]");51Testing软件测试网5Ct3P7](Y
    if(money<0)51Testing软件测试网;},U:BNO0@AL?HG
    System.out.println("
    余额不足!");
    System.out.println("Wife 向银行取走了 ["+i+"]");51Testing软件测试网5Ct3P7](Y
    if(money<0)51Testing软件测试网;},U:BNO0@AL?HG
    System.out.println("
    余额不足!");
    }
    public int showMoney()
    QaLiS[184841{
    t5dR8e%?9D^8k184841return money;51Testing软件测试网 Exkx)N;pr
    }
    oZ(xF;J3P184841}

    class Operater implements Runnable51Testing软件测试网0npx"kmQ-c"Uo(y
    {51Testing软件测试网+~G;\+j~#i$~k$x9y&W
    String name;
    NG$D
    BlankSaving bs;51Testing软件测试网-Z?6v SGK*d
    public Operater(BlankSaving b,String s)
    @%\Dd;O:Iv;G184841{51Testing软件测试网/}"^K4O P a(V:x
    name=s;
    $am5B4Epp184841bs=b;
    }
    /K ]w+e;^!x%q184841public static void oper(String name,BlankSaving bs)
    ,O*OYZs Q\3e MZ184841{51Testing软件测试网$Lu}$c_:u)|l.Qt

    if(name.equals("husband"))51Testing软件测试网[-y Is9nB!^(Y
    {51Testing软件测试网3o/P}&b-Fy6^@
    try
    {
    for(int i=0;i<10;i++)
    #_0vr(U lj r!M|j184841{
    Thread.currentThread().sleep((int)(Math.random()*300));
    :ug%k8x/xO184841bs.add(1000);
    h5F,Fz5g(N~K184841}
    }catch(InterruptedException e){}
    }L(K.XlHo184841}else
    {51Testing软件测试网1p b,ZhC
    try51Testing软件测试网`g I6aA5Z)xS's
    {
    for(int i=0;i<10;i++)51Testing软件测试网E'spU)R5]w Z
    {51Testing软件测试网"yyT){ G@XQ
    Thread.currentThread().sleep((int)(Math.random()*300));
    bs.get(1000);51Testing软件测试网;fr:QhMM!t7K
    }
    }catch(InterruptedException e){}51Testing软件测试网 R;G!Y@ E
    }51Testing软件测试网`^6b Z I6{G$a$A
    }
    public void run()51Testing软件测试网5Rjs-Uq*a X~hz'H
    {51Testing软件测试网6T d$|Kq3E.w
    oper(name,bs);51Testing软件测试网.O}I e]m m)Z$g
    } 51Testing软件测试网/R3Y,H|7y2zN4_amK7e
    }
    public class BankTest 51Testing软件测试网K BF} ?$U^#e U
    {
    public static void main(String[] args)throws InterruptedException
    Z%?o7`4Q~!gJ+n2\.ir184841{
    w+QY Kk+X7nJ4q184841BlankSaving bs=new BlankSaving();
    mC dN-p.J1O184841Operater o1=new Operater(bs,"husband");
    m8u,K;mI\184841Operater o2=new Operater(bs,"wife");51Testing软件测试网(u H)rSN
    Thread t1=new Thread(o1);
    lanp2@)w6}184841Thread t2=new Thread(o2);
    4EVUW9E7{]&S184841t1.start();
    t2.start();51Testing软件测试网6E3|M`&f?
    Thread.currentThread().sleep(500);51Testing软件测试网+\.W#BNx0aA
    }
    t2.start();51Testing软件测试网6E3|M`&f?
    Thread.currentThread().sleep(500);51Testing软件测试网+\.W#BNx0aA
    }
    }
    下面是其中一次的执行结果:51Testing软件测试网*g'ww1?X cwy,N

    2]{Y\m9pd*c184841
    J%o#YQ:J~8T18484151Testing软件测试网3` ?-|\*JF[
    ---------first--------------51Testing软件测试网{Ls/YzZ,s1@
    Husband
    向银行存入了 [1000]51Testing软件测试网i P5ic8muQksh
    Wife
    向银行取走了 [1000]51Testing软件测试网 yc$fK(fe1c0j
    Wife
    向银行取走了 [1000]51Testing软件测试网8p4z:q[Q/{
    Husband
    向银行存入了 [1000]
    qw8D$y(i
    Wife 向银行取走了 [1000]
    8jE*z)mX184841Husband
    向银行存入了 [1000]51Testing软件测试网0C;^c T+t0n7{.|
    Wife
    向银行取走了 [1000]51Testing软件测试网 wBCK'|DG
    Husband
    向银行存入了 [1000]51Testing软件测试网!t s_n'SC2NA&x r)V
    Wife
    向银行取走了 [1000]
    S1^;l$xu"QtS+t z184841Husband
    向银行存入了 [1000]51Testing软件测试网9Rkk4oL%c#E&u
    Husband
    向银行存入了 [1000]
    :E#R1t(i7p
    Wife 向银行取走了 [1000]
    51Testing软件测试网2hHusband 向银行存入了 [1000]
    Husband 向银行存入了 [1000]
    Wife 向银行取走了 [1000]
    w9z"WH)H8~?!F&}184841Wife
    向银行取走了 [1000]

    public static void main(String[] args)throws InterruptedException
    Z%?o7`4Q~!gJ+n2\.ir184841{
    w+QY Kk+X7nJ4q184841BlankSaving bs=new BlankSaving();
    mC dN-p.J1O184841Operater o1=new Operater(bs,"husband");
    m8u,K;mI\184841Operater o2=new Operater(bs,"wife");51Testing软件测试网(u H)rSN
    Thread t1=new Thread(o1);
    lanp2@)w6}184841Thread t2=new Thread(o2);
    4EVUW9E7{]&S184841t1.start();51Testing软件测试网 S&T^+
    Husband 向银行存入了 [1000]51Testing软件测试网Bd,A/B|*@Z"h,v
    Wife
    向银行取走了 [1000]51Testing软件测试网)y.x$J+`u
    Wife
    向银行取走了 [1000]
    vN0sag yedba
    Husband 向银行存入了 [1000]

    看到了吗,这可不是正确的需求,在husband还没有结束操作的时候,wife就插了进来,这样很可能导致意外的结果。解决办法很简单,就是将对数据进行操作方法声明为synchronized,当方法被该关键字声明后,也就意味着,如果这个数据被加锁,只有一个对象得到这个数据的锁的时候该对象才能对这个数据进行操作。也就是当你存款的时候,这笔账户在其他地方是不能进行操作的,只有你存款完毕,银行管理人员将账户解锁,其他人才能对这个账户进行操作。
    s:MQ;M0UN184841
    修改public static void oper(String name,BlankSaving bs)public static void oper(String name,BlankSaving bs),再看看结果:
    Husband 向银行存入了 [1000]
    [$e3k,U~184841Husband
    向银行存入了 [1000]
    Z di:ad,Q184841Husband
    向银行存入了 [1000]
    &{8d \7]$]O |._184841Husband
    向银行存入了 [1000]
    yg3r-vyCe184841Husband
    向银行存入了 [1000]51Testing软件测试网.r#b8]9v4J2J8m
    Husband
    向银行存入了 [1000]51Testing软件测试网 O x0j x$[y4]c
    Husband
    向银行存入了 [1000]
    Sg9SZ e5Fk'LAh184841Husband
    向银行存入了 [1000]
    MS@QUmIp|yT.n184841Husband
    向银行存入了 [1000]
    (R$WHQkS$]184841Husband
    向银行存入了 [1000]51Testing软件测试网VoD)t9X7f~
    Wife
    向银行取走了 [1000]51Testing软件测试网$GIw9wI{\
    Wife
    向银行取走了 [1000]
    &BR0T ]}184841Wife
    向银行取走了 [1000]
    ?.p&lq+k*Np6Q S184841Wife
    向银行取走了 [1000]
    g$W6s{4@}W yA;h$G E184841Wife
    向银行取走了 [1000]
    6Bd OB/G+e:Xh184841Wife
    向银行取走了 [1000]
    {!j{0BO.\BS"A184841Wife
    向银行取走了 [1000]51Testing软件测试网1Eko.ie S)g
    Wife
    向银行取走了 [1000]
    I$iH k"j}J184841Wife
    向银行取走了 [1000]51Testing软件测试网4? i T#@:P$uI6R
    Wife
    向银行取走了 [1000]

    当丈夫完成操作后,妻子才开始执行操作,这样的话,对共享对象的操作就不会有问题了。51Testing软件测试网InN%rI.o C5e(@
    [wait and notify]
    6F\#hc"v1^184841
    你可以利用这两个方法很好的控制线程的执行流程,当线程调用wait方法后,线程将被挂起,直到被另一线程唤醒(notify)或则是如果wait方法指定有时间得话,在没有被唤醒的情况下,指定时间时间过后也将自动被唤醒。但是要注意一定,被唤醒并不是指马上执行,而是从组塞状态变为可运行状态,其是否运行还要看cpu的调度。
    示例代码:
    class MyThread_1 extends Thread
    Iy,EvN}184841{51Testing软件测试网mTkd.Gq/W+`8K
    Object lock;
    sR7^;i)M#K
    class MyThread_1 extends Thread
    Iy,EvN}184841{51Testing软件测试网mTkd.Gq/W+`8K
    Object lock;
    public MyThread_1(Object o)
    6r ovZ(s"KS3k2S184841
    {
    51Testing软件测试网/I
    {51Testing软件测试网/lock=o;
    }
    public void run()
    'R*qI
    {51Testing软件测试网 s0X&r"h,X'A"C4E3VEl#]
    try
    CHhj.xx*z-F184841{
    synchronized(lock)51Testing软件测试网&@ R5x0@3|%\Q4y2a
    {
    System.out.println("Enter Thread_1 and wait");51Testing软件测试网]Ifqe.ecP9x+w
    lock.wait();
    +Cn,Y+wGl9la184841System.out.println("be notified");
    }
    4tt"I'c{] i$T184841}catch(InterruptedException e){}
    "~9h u;[ nKp184841}
    va$Xjv;s184841}51Testing软件测试网4Igd.hM4_+e#f1U
    class MyThread_2 extends Thread
    @ F;MNT&L-[xb184841{
    Object lock;
    F0r5{J0~184841public MyThread_2(Object o)
    {
    #Fc3P8M9RA1_/{184841lock=o;
    vu:p.R.h/F184841}
    public void run()
    )GJ8o2AM+L184841{
    5M1J yJP,u184841synchronized(lock)51Testing软件测试网+sFFzm} GL
    {
    System.out.println("Enter Thread_2 and notify");51Testing软件测试网1C T/lh*gQ5w
    lock.notify();51Testing软件测试网$z"i4NA+x}7D#{5s`
    }51Testing软件测试网X(As It!x
    }
    }
    public class MyThread51Testing软件测试网s a%|,m~2U(t
    {
    j'@8l&Yfl Z&Q1Oi184841public static void main(String[] args)51Testing软件测试网0[8zfal L,}
    {
    c sx csO%cE w184841int[] in=new int[0];//notice51Testing软件测试网l,} Jq'l nd
    MyThread_1 t1=new MyThread_1(in);
    51Testing软件测试网
    MyThread_2 t2=new MyThread_2(in);51Testing软件测试网:],_sT0H K
    t1.start();
    0l d9g)uBw;~Q184841t2.start();
    }
    }

    执行结果如下:
    ~:\\O1E"YVU184841Enter Thread_1 and wait51Testing软件测试网

    Enter Thread_2 and notify
    i+N0x,Zr184841Thread_1 be notified

    可能你注意到了在使用wait and notify方法得时候我使用了synchronized块来包装这两个方法,这是由于调用这两个方法的时候线程必须获得锁,也就是上面代码中的lock[],如果你不用synchronized包装这两个方法的得话,又或则锁不一是同一把,比如在MyThread_2synchronized(lock)改为synchronized(this),那么执行这个程序的时候将会抛出java.lang.IllegalMonitorStateException执行期异常。另外wait and notify方法是Object中的,并不在Thread这个类中。最后你可能注意到了这点:int[] in=new int[0];为什么不是创建new Object而是一个0长度的数组,那是因为在java中创建一个0长度的数组来充当锁更加高效。

    Thread作为java中一重要组成部分,当然还有很多地方需要更深刻的认识,上面只是对Thread的一些常识和易错问题做了一个简要的总结,若要真正的掌握java的线程,还需要自己多做总结。




















    51Testing软件测试网H:wg*e6d3]
















    public static void main(String[] args)
    `E


    h


  • 测试工具大全(转载)

    2008-10-23 11:08:36

    1、 从测试功能上分
    (1)单元测试
    针对不同语言,如JUNIT
    (2)功级测试
    E—Test:功能强大,由于不是采用POST URL的方式回放脚本,所以可以支持多内码的测试数据(当然要程序支持),基本上可以应付大部分的WEB SITE。
    MI公司的WINRUNNER
    COMPUWARE的QARUN
    RATIONAL的SQA ROBOT
    (3)压力测试
    MI公司的WINLOAD
    COMPUWARE的QALOAD
    RATIONAL的SQA LOAD
    (4)负载测试
    LOADRUNNER
    RATIONAL VISUAL QUANTIFY
    (5)WEB测试工具
    MI公司的ASTRA系列
    RSW公司的E—TEST SUITE等
    (6)WEB系统测试工具
    WORKBENCH
    WEB APPLICATION STRESS TOOL(WAS)
    (7)数据库测试工具
    TESTBYTES
    (8)回归测试工具
    RATIONAL TEAM TEST
    WINRUNNER
    (9)嵌入式测试工具
    ATTOLTESTWARE。是ATTOLTESTWARE公司的自动生成测试代码的软件测试工具,特别适用于嵌入式实时应用软件单元和通信系统测试。
    CODETEST是AppliedMicrosystemsCorp.公司的产品,是广泛应用的嵌入式软件在线测试工具。
    GammaRay。GammaRay系列产品主要包括软件逻辑分析仪GammaProfiler、可靠性评测工具GammaRET等。
    LogiScope是TeleLogic公司的工具套件,用于代码分析、软件测试、覆盖测试。
    LynxInsure++是LynxREAL-TIMESYSTEMS公司的产品,基于LynxOS的应用代码检测与分析测试工具。
    MessageMaster是ElviorLtd.公司的产品,测试嵌入式软件系统工具,向环境提供基于消息的接口。
    VectorCast是VectorSoftware.Inc公司的产品。由6个集成的部件组成,自动生成测试代码,为主机和嵌入式环境构造可执行的测试架构。
    (10)系统性能测试工具
    Rational Performance
    (11)页面链接测试
    Link Sleuth
    (12)测试流程管理工具
    Test Plan Control
    (13)测试管理工具
    TestDirector
    Rational公司的Test Manager
    Compuware公司的QADirector
    TestExpert:是Silicon Valley Networks公司产品的测试管理工具,能管理整个测试过程,从测试计划、测试例程、测试执行到测试报告。
    (14)缺陷跟踪工具
    TrackRecord等
    (15)其他测试工具包
    TestVectorGenerationSystem是T—VECTechnologies公司的产品。提供自动模型分析、测试生成、测试覆盖分析和测试执行的完整工具包,具有方便的用户接口和完备的文档支持。
    TestQuestPro是TestQuest公司的非插入码式的自动操纵测试工具,提供一种高效的自动检测目标系统,获取其输出性能的测试方法。
    TestWorks是SoftwareResearch.Inc公司的一整套软件测试工具,既可单独使用,也可捆绑销售使用。
    2、 从测试的方法上分:
    白盒测试工主要有:Numega、PuRe、软件纠错工具(Rational Purify)。
    内存资源泄漏检查:
    Numega中的BounceChecher
    Rational的 Purify等
    代码覆盖率检查:
    Numega的TrueCoverage
    Rational的PureCoverage
    TeleLogic公司的LogiScope
    Macabe公司的Macabe
    代码性能检查:
    Numega的TrueTime
    Rational的Quantify等
    代码静态度量分析度量检查工具:LogiScope和Macabe等
    黑盒测试工具主要有:QACenter、SQATeamTest、Rational Visual Visual Test。
    QACenter: QACenter帮助所有测试人员创建一个快速、可重用的测试过程。这些测试工具自动帮助管理测试过程、快速分析和调试程序,包括针对回归、强度、单元、 并发、集成、移植,容量和负载建立测试用例,自动执行测试和产生文档结果。QACenter主要包括以下几个模块:
     QARun:应用的功能测试工具。
     QALoad:强负载下应用的性能测试工具。
     QADirector:测试的组织设计和创建以及管理工具。
     TrackRecord:集成的缺陷跟踪管理工具。
     EcoTools:高层次的性能监测工具。
    3、部分具体测试工具的介绍
    (1)、性能优化工具EcoScope
        EcoScope 是一套定位于应用(即服务提供者本身)及其所依赖的所有网络计算资源的解决方案。    EcoScope可以提供应用视图,并标出应用是如何与基础架构相关联的。这种视图是其他网络管理工具所不能提供的。EcoScope能解决在大型企业复 杂环境下分析与测量应用性能的难题。通过提供应用的性能级别及其支撑架构的信息,EcoScope能帮助IT部门就如何提高应用性能提出多方面的决策方 案。
    EcoScope的应用主要表现在以下几个方面:
     确保成功部署新应用
     维护性能的服务水平
     加速问题检测与纠正的高级功能
     定制视图有助于高效地分析数据
    (2)、数据库测试数据自动生成工具——TestBytes
        在数据库开发的过程中,为了测试应用程序对数据库的访问,应当在数据库中生成测试用例数据,我们可能会发现当数据库中只有少量数据时,程序可能没有问题, 但是当真正投入到运用中产生了大量数据时就出现问题了,这往往是因为程序的编写没有达到,所以一定及早地通过在数据库中生成大量数据来帮助开发人员完善这 部分功能和性能。
        TestBytes是一个用于自动生成测试数据的强大易用的工具,通过简单的点击式操作,就可以确定需要生成的数据类型(包括特殊字符的定制),并通过与 数据库的连接来自动生成数百万行正确的测试数据,可以极大地提高数据库开发人员、QA测试人员、数据仓库开发人员、应用开发人员的工作效率。
    (3)、PC—LINT
        PC—LINT 主要进行更严格的语法检查功能,还完成相当程度的语义检查功能。可以这样认为:PC—LINT是一个更加智能、更加严格的编译器。PC—LINT在实现语 法和某些语义规则检查时,是通过参数配置完成的,它的选项就有数百个之多,因此,在使用PC—LINT过程中,了解选项的含义也很重要。
    (4)、TCL
        TCL是Tool Command Language的缩写,它是一种很流行的脚本解释器,尤其在测试领域,它的最大特点是可移植性好,接口简单,方便,可以很容易地嵌入到软件中,作为自己的解释器使用。
        TCL提供两种接口:编程接口和用户接口。编程接口是通过LIB或DLL形式提供的,提供了一些函数(命令)供调用,包括:分配一个解释器指针(对象);初始化解释器(指针);注册扩展函数等。用户接口很简单,即编写的脚本,脚本里面包含对扩展命令的调用。
    (5)VB测试工具:VB Watch
    (6)Java 程序的测试工具
    1)Bean—Test
    2)EJBQuickTest
    3)JStyle
    4)JTest
    5)HttpUnit
    6)JUnit
    (7)、覆盖测试
    C—Cover
    C—Cover是一个测试工具软件,用来找出没有被测到的代码,并报告测试的覆盖率。C—Cover
    只支持C/C++的代码覆盖率分析,其它语言不支持。但不受OS的限制。
    单元测试方面:(对开发人员比较有用) J-Unit工具。
    功能测试方面:E-test是个不错的选择,功能很强大,由于不是采用Post URL的方式回放脚本,所以可以支持多内码的测试数据(当然要程序支持)。基本上可以应付大部分的Web Site。
        如果只是利用脚本回放代替手工劳动,或者做对页面响应数的性能测试,Microsoft Web Application Stress Tool是个不错的选择。
        另外,在性能测试方面,PureLoad也是一个不错的工具,完全用Java写成,可以测试各种C/S程序,如SMTP Server等。这两个工具都是使用Post URL的方法测试Web Application的。对大量使用Javascrīpt的页面不太适合。当然,如果程序在Unix,linux下面运行的话,可以直接编写Shell 脚本程序,更加方便。
        另外,还有很多专门的工具,比如说Linkbot是专门作页面链接测试的。
        另外,测试流程管理工具也有不少,个人用过也一直在用的是Test Plan Control,短小精悍,不错。至于WinRunner和LoadRunner之类,因为没有License,所以都没怎么用过,惭愧。不过我看过一篇 英国人评价英国测试市场上最流行的五个软件的文章。WinRunner得分最高。
    测试工具从测试的方法上可以分为两种:白盒测试和黑盒测试
    白盒测试工具主要有:
    内存资源泄漏检查:Numega中的bouncechecker,Rational的Purify等
    代码覆盖率检查:Numega中的truecoverage,Rational的Purecoverage,Telelogic公司的 logiscope, Macabe公司的Macabe等
    代码性能检查:Numega中的truetime,Rational的Quantify等
    代码静态度量分析质量检查工具:logiscope和Macabe等
    黑盒测试工具主要有:客户端功能测试:MI公司的winrunner,compuware的qarun,Rational的SQA robot等等
    服务器端压力性能测试: MI公司的winload,compuware的qaload,Rational的SQA load等等
    Web测试工具:MI公司的Astra系列,rsw公司的e-test suite等等
    测试管理工具:rational的test manager,compuware的qadirector等等,此外还有缺陷跟踪工具 trackrecord等。
    数据库测试工具:TestBytes
    黑盒测试工具:QACenter、SQATeamTest,Rational Viaual Test。
    回归测试工具:Rational TeamTest,WinRunner(MI公司)
    WEB系统测试工具:TEST,Workberch,Web Appication Stress Tool(WAS)
    白盒测试工具:Numega 、PuRe、软件纠错工具(Rational Purity)。
    嵌入式测试工具:Logiscope(静态测试工具)、CodeTest。
    系统负荷测试工具:RationalPerformance
    涵盖测试工具范围评估工具
    软件性能测试工具:LoadRunner(MI产品)、Rational Visual Qantify
    测试管理工具:TestDirector(MI产品支持整个生命周期中测试流程管理)
  • 排序算法之四(快速排序)

    2008-10-23 09:56:20


    public class QuickSort {
        public void quickSort(int[] array,int low,int high){
            if(low < high)
            {
                QuickSort qs = new QuickSort();
                int mid = qs.partion(array,low,high);
                qs.quickSort(array,low, mid-1);
                qs.quickSort(array, mid+1, high);
            }
        }
        
        public int partion(int[] array,int low,int high){
            int pivotKey = array[low];
            while(low<high){
                while(array[high]>pivotKey){
                    high--;
                }
                array[low]=array[high];
                array[high]=pivotKey;
                while(array[low]<pivotKey){
                    low++;
                }
                array[high]=array[low];
                array[low]=pivotKey;
                new QuickSort().print(array);
        }
            return low;
    }
       
        public void print(int[] array){
            for(int i=0;i<array.length;i++){
                if(i<array.length-1){
                System.out.print(array[i]+",");
                }
                else
                    System.out.print(array[i]);
            }
            System.out.println();
        }
       
        public static void main(String[] args){
            int[] array = {10,9,8,7,6,5,4,3,2,1};
            QuickSort qs = new QuickSort();
            qs.print(array);
            qs.quickSort(array,0,array.length-1);
            qs.print(array);
        }
    }
     
  • 排序算法之三(选择排序)

    2008-10-23 09:55:12


    public class SelectSort {
        public void SelectSort(int[] array){
            for(int i = 0;i<array.length;i++){
                int temp = array[i];
                int min = i;
                for(int j=i;j<array.length;j++){
                    if(array[min]>array[j]){
                        min = j;
                    }
                }
                array[i] = array[min];
                array[min] = temp;
            }
        }
        
        public void print(int[] array){
            for(int i=0;i<array.length;i++){
                if(i<array.length-1){
                System.out.print(array[i]+",");
                }
                else
                    System.out.print(array[i]);
            }
            System.out.println();
        }
       
        public static void main(String[] args){
            int[] array = {10,9,8,7,6,5,4,3,2,1};
            SelectSort seleSort = new SelectSort();
            seleSort.print(array);
            seleSort.SelectSort(array);
            seleSort.print(array);
        }
    }
     
  • 排序算法之二(直接插入排序)

    2008-10-23 09:43:55

    昨天晚上熬夜到1点多调了以下三个排序算法,呵呵,供大家参考吧。
    public class InsertSort {
     public void insertSort(int[] array){
      for(int i=1;i<array.length;i++){
       int tmp = array[i];
       int j = i - 1;
       for(;j>=0&&tmp<array[j];j--){
         array[j+1] = array[j];
       }  
       array[j + 1] = tmp;
      }
     }
     
     public void print(int[] array){
      for(int i=0;i<array.length;i++){
       if(i<array.length-1){
       System.out.print(array[i]+",");
       }
       else
        System.out.print(array[i]);
      }
      System.out.println();
     }
     
     public static void main(String args[]){
      int[] array = {10,9,8,7,6,5,4,3,2,1};
      InsertSort insert = new InsertSort();
      insert.print(array);
      insert.insertSort(array);
      insert.print(array);
     }
    }
  • 排序算法之一(冒泡排序)

    2008-10-22 13:23:58

    终于决定靠实力找工作,不再把自己的活动范围仅仅限制为现在的实习单位。复习的范围先从最基础的数据结构算法开始吧,今天先用JAVA小写了下冒泡排序,时间复杂度和空间复杂度应该不是最优的,仅供大家参考啦。


    public class BubbleSort {
      public void bubbleSort(int[] array){
       int n = array.length;
       for(int i=n;i>1;i--){
        for(int j=0;j<i-1;++j){
         if(array[j+1]<array[j]){
         int temp = array[j+1];
         array[j+1] = array[j];
         array[j]=temp;
         }
        }
       }
    }
      public static void main(String args[]){
       int[] array = {10,9,8,7,6,5,4,3,2,1};
       for(int i=0;i<array.length;i++){
        if(i<array.length-1){
        System.out.print(array[i]+",");
        }
        else
         System.out.print(array[i]);
       }
       System.out.println();
       new BubbleSort().bubbleSort(array);
       for(int i=0;i<array.length;i++){
        if(i<array.length-1){
        System.out.print(array[i]+",");
        }
        else
         System.out.print(array[i]);
       }
       System.out.println();
      }
    }

Open Toolbar