测试之道、

发布新日志

  • 软件测试管理和测试流程

    2008-09-16 11:07:18

    软件测试管理和测试流程

    软件测试管理
    正确的方式对公司的测试工作进行管理。而“正确的方式”就是在工作中不断摸索和改进后的管理方式,探索并发现这些方式也是测试管理工作的重要任务之一。
    软件测试管理还要评估风险、规划资源、不断地提高团队能力,最终形成一个高效的团队来完成对质量的管理。
    测试管理的目标是在进度、成本、质量三者之间做出平衡,使产品能够符合客户需求。
    软件测试流程
    第一步:对要执行测试的产品/项目进行分析,确定测试策略,制定测试计划。该计划被审核批准后转向第二步。测试工作启动前一定要确定正确的测试策略和指导方针,这些是后期开展工作的基础。只有将本次的测试目标和要求分析清楚,才能决定测试资源的投入。
    第二步:设计测试用例。设计测试用例要根据测试需求和测试策略来进行,进度压力不大时,应该设计的详细,如果进度、成本压力较大,则应该保证测试用例覆盖到关键性的测试需求。该用例被批准后转向第三步。
    第三步:如果满足“启动准则”(EntryCriteria),那么执行测试。执行测试主要是搭建测试环境,执行测试用例。执行测试时要进行进度控制、项目协调等工作。
    第四步:提交缺陷。这里要进行缺陷审核和验证等工作。
    第五步:消除软件缺陷。通常情况下,开发经理需要审核缺陷,并进行缺陷分配。程序员修改自己负责的缺陷。在程序员修改完成后,进入到回归测试阶段。如果满足“完成准则”(ExitCriteria),那么正常结束测试。
    第六步:撰写测试报告。对测试进行分析,总结本次的经验教训,在下一次的工作中改。

  • Bug管理流程

    2008-09-16 11:02:21

    软件测试的重要环节:Bug管理流程


    软件测试的主要目的在于发现软件存在的错误(Bug),对于如何处理测试中发现的错误,

    将直接影响到测试的效果。只有正确、迅速、准确地处理这些错误,才能消除软件错误,保证
    要发布的软件符合需求设计的目标。在实际软件测试过程中,对于每个Bug都要经过测试、确
    认、修复、验证等的管理过程,这是软件测试的重要环节。
    错误跟踪管理系统
    为了正确跟踪每个软件错误的处理过程,通常将软件测试发现的每个错误作为一条条记录
    输入制定的错误跟踪管理系统。
    目前已有的缺陷跟踪管理软件包括Compuware公司的TrackRecord软件(商业软件)、
    Mozilla公司的Buzilla软件(免费软件),以及国内的微创公司的BMS软件,这些软件在功能
    上各有特点,可以根据实际情况选用。当然,也可以自己开发缺陷跟踪软件,例如基于Notes
    或是ClearQuese开发缺陷跟踪管理软件。
    作为一个缺陷跟踪管理系统,需要正确设计每个错误的包含信息的字段内容和记录错误的
    处理信息的全部内容。字段内容可能包括测试软件名称,测试版本号,测试人名称,测试事
    件,测试软件和硬件配置环境,发现软件错误的类型,错误的严重等级,详细步骤,必要的附
    图,测试注释。处理信息包括处理者姓名,处理时间,处理步骤,错误记录的当前状态。
    正确的数据库权限管理是错误跟踪管理系统的重要考虑要素,一般要保证对于添加的错误
    不能从数据库中删除。
    软件错误的状态
    新信息(New):测试中新报告的软件缺陷
    打开 (Open):被确认并分配给相关开发人员处理;
    修正(Fixed):开发人员已完成修正,等待测试人员验证;
    拒绝(Declined):拒绝修改缺陷;
    延期(Deferred): 不在当前版本修复的错误,下一版修复
    关闭(Closed):错误已被修复;
    Bug管理的一般流程
      测试人员提交新的Bug入库,错误状态为New。
      高级测试人员验证错误,如果确认是错误,分配给相应的开发人员,设置状态为Open。如
    果不是错误,则拒绝,设置为Declined状态。
    开发人员查询状态为Open的Bug,如果不是错误,则置状态为Declined;如果是Bug则修复
    并置状态为Fixed。不能解决的Bug,要留下文字说明及保持Bug为Open状态。
    对于不能解决和延期解决的Bug,不能由开发人员自己决定,一般要通过某种会议(评审
    会)通过才能认可。
    测试人员查询状态为Fixed的Bug,然后验证Bug是否已解决,如解决置Bug的状态为
    Closed,如没有解决置状态为Reopen。
    软件错误流程管理要点
    为了保证错误的正确性,需要有丰富测试经验的测试人员验证发现的错误是否是真正的错
    误,书写的测试步骤是否准确,可以重复。
    每次对错误的处理都要保留处理信息,包括处理姓名,时间,处理方法,处理意见,Bug
    状态。
    拒绝或延期错误不能由程序员单方面决定,应该由项目经理,测试经理和设计经理共同决
    定。
    错误修复后必须由报告错误的测试人员验证后,确认已经修复,才能关闭错误。
    加强测试人员与程序员的交流,对于某些不能重复的错误,可以请测试人员补充详细的测
    试步骤和方法,以及必要的测试用例。  
  • 软件测试及测试工具比较

    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、结束语

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

    2008-09-16 10:28:18

       测试设计中需要考虑的22种测试类型


         黑盒测试:不基于内部设计和代码的任何知识,而是基于需求和功能性。

       白盒测试:基于一个应用代码的内部逻辑知识,测试是基于覆盖全部代码、分支、路径、条件。

       单元测试:最微小规模的测试;以测试某个功能或代码块。典型地由程序员而非测试员来做,因为它需要知道内部程序设计和编码的细节知识。这个工作不容易作好,除非应用系统有一个设计很好的体系结构; 还可能需要开发测试驱动器模块或测试套具。

       累积综合测试:当一个新功能增加后,对应用系统所做的连续测试。它要求应用系统的不同形态的功能能够足够独立以可以在全部系统完成前能分别工作,或当需要时那些测试驱动器已被开发出来; 这种测试可由程序员或测试员来做。

       集成测试:一个应用系统的各个部件的联合测试,以决定他们能否在一起共同工作。部件可以是代码块、独立的应用、网络上的客户端或服务器端程序。这种类型的测试尤其与客户服务器和分布式系统有关。

       功能测试:用于测试应用系统的功能需求的黑盒测试方法。这类测试应由测试员做,这并不意味着程序员在发布前不必检查他们的代码能否工作(自然他能用于测试的各个阶段)。

       系统测试:基于系统整体需求说明书的黑盒类测试;应覆盖系统所有联合的部件。

       端到端测试:类似于系统测试;测试级的“宏大”的端点;涉及整个应用系统环境在一个现实世界使用时的模拟情形的所有测试。例如与数据库对话,用网络通讯,或与外部硬件、应用系统或适当的系统对话。

       健全测试:典型地是指一个初始化的测试工作,以决定一个新的软件版本测试是否足以执行下一步大的测试努力。例如,如果一个新版软件每5分钟与系统冲突,使系统陷于泥潭,说明该软件不够“健全”,目前不具备进一步测试的条件。

       衰竭测试:软件或环境的修复或更正后的“再测试”。可能很难确定需要多少遍再次测试。尤其在接近开发周期结束时。自动测试工具对这类测试尤其有用。

       接受测试:基于客户或最终用户的规格书的最终测试,或基于用户一段时间的使用后,看软件是否满足客户要求。

       负载测试:测试一个应用在重负荷下的表现,例如测试一个 Web 站点在大量的负荷下,何时系统的响应会退化或失败。

       强迫测试:在交替进行负荷和性能测试时常用的术语。也用于描述象在异乎寻常的重载下的系统功能测试之类的测试,如某个动作或输入大量的重复,大量数据的输入,对一个数据库系统大量的复杂查询等。

       性能测试:在交替进行负荷和强迫测试时常用的术语。理想的“性能测试”(和其他类型的测试)应在需求文档或质量保证、测试计划中定义。

       可用性测试:对“用户友好性”的测试。显然这是主观的,且将取决于目标最终用户或客户。用户面谈、调查、用户对话的录象和其他一些技术都可使用。程序员和测试员通常都不宜作可用性测试员。

       安装/卸载测试:对软件的全部、部分或升级安装/卸载处理过程的测试。

       恢复测试:测试一个系统从如下灾难中能否很好地恢复,如遇到系统崩溃、硬件损坏或其他灾难性问题。

        安全测试:测试系统在防止非授权的内部或外部用户的访问或故意破坏等情况时怎么样。这可能需要复杂的测试技术。

       兼容测试:测试软件在一个特定的硬件/软件/操作系统/网络等环境下的性能如何。

       比较测试:与竞争伙伴的产品的比较测试,如软件的弱点、优点或实力。

       Alpha 测试:在系统开发接近完成时对应用系统的测试;测试后,仍然会有少量的设计变更。这种测试一般由最终用户或其他人员员完成,不能由程序员或测试员完成。

       Beta 测试:当开发和测试根本完成时所做的测试,而最终的错误和问题需要在最终发行前找到。这种测试一般由最终用户或其他人员员完成,不能由程序员或测试员完成
  • 软件测试之系统测试设计的层次分析

    2008-09-16 10:24:04

       软件测试之系统测试设计的层次分析


       随着国内软件行业的不断发展,国内软件公司也越来越注重于软件的质量,越来越关注软件的可靠性,因此,做为质量保证的重要手段,软件测试过程的实施与管理成为一个热点,其中系统测试是整个测试活动的一个重要的阶段,系统测试的设计也就成为了关注点之一。以下是本人从事系统测试工作中的一些体会。

      1、系统测试的定义:

      系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不相符合或与之矛盾的地方。

      2、系统测试的对象:

      系统测试的对象不仅仅包括需要测试的产品系统的软件,还要包含软件所依赖的硬件、外设甚至包括某些数据、某些支持软件及其接口等。因此,必须将系统中的软件与各种依赖的资源结合起来,在系统实际运行环境下来进行测试。

      3、系统测试的设计

      系统测试过程包含了测试计划、测试设计、测试实施、测试执行、测试评估这几个阶段,而整个测试过程中的测试依据主要是产品系统的需求规格说明书、各种规范、标准和协议等。在整个测试过程中,首先需要对需求规格进行充分的分析,分解出各种类型的需求(功能性需求、性能要求、其他需求等),在此基础之上才可以开始测试设计工作,而测试设计又是整个测试过程中非常重要的一个环节,测试设计的输出结果是测试执行活动依赖的执行标准,测试设计的充分性决定了整个系统过程的测试质量。因此,为了保证系统测试质量,必须在测试设计阶段就对系统进行严密的测试设计。这就需要我们在测试设计中,从多方面来综合考虑系统规格的实现情况。通常需要从以下几个层次来进行设计:用户层、应用层、功能层、子系统层、协议层

      3.1、用户层:

      主要是面向产品最终的使用操作者的测试。这里重点突出的是在操作者角度上,测试系统对用户支持的情况,用户界面的规范性、友好性、可操作性,以及数据的安全性。主要包括:

    3.1.1、用户支持测试

      用户手册、使用帮助、支持客户的其他产品技术手册是否正确、是否易于理解、是否人性化。

      3.1.2、用户界面测试

      在确保用户界面能够通过测试对象控件或入口得到相应访问的情况下,测试用户界面的风格是否满足用户要求,例如:界面是否美观、界面是否直观、操作是否友好、是否人性化、易操作性是否较好。

      3.1.3、可维护性测试

      可维护性是系统软、硬件实施和维护功能的方便性。目的是降低维护功能对系统正常运行带来的影响。例如:对支持远程维护系统的功能或工具的测试。

      3.1.4、安全性测试

      这里的安全性主要包括了两部分:数据的安全性和操作的安全性。核实只有规格规定的数据才可以访问系统,其他不符合规格的数据不能够访问系统;核实只有规格规定的操作权限才可以访问系统,其他不符合规格的操作权限不能够访问系统;

      3.2、应用层:

      针对产品工程应用或行业应用的测试。重点站在系统应用的角度,模拟实际应用环境,对系统的兼容性、可靠性、性能等进行的测试。

      3.2.1、系统性能测试

      针对整个系统的测试,包含并发性能测试、负载测试、压力测试、强度测试、破坏性测试。并发性能测试是评估系统交易或业务在渐增式并发情况下处理瓶颈以及能够接收业务的性能过程;强度测试是在资源情况低的情况下,找出因资源不足或资源争用而导致的错误;破坏性测试重点关注超出系统正常负荷N倍情况下,错误出现状态和出现比率以及错误的恢复能力。

      3.2.2、系统可靠性、稳定性测试

      一定负荷的长期使用环境下,系统可靠性、稳定性。

      3.2.3、系统兼容性测试

      系统中软件与各种硬件设备兼容性,与操作系统兼容性、与支撑软件的兼容性。

      3.2.4、系统组网测试

      组网环境下,系统软件对接入设备的支持情况。包括功能实现及群集性能。

      3.2.5、系统安装升级测试

      安装测试的目的是确保该软件在正常和异常的不同情况下进行安装时都能按预期目标来处理。例如,正常情况下,第一次安装或升级、完整的或自定义的安装都能进行安装。异常情况包括磁盘空间不足、缺少目录创建权限等。还有一个目的是核实软件在安装后可立即正常运行。另外对安装手册、安装脚本等也需要关注。

      3.3、功能层

      针对产品具体功能实现的测试。

      3.3.1、业务功能的覆盖

      关注需求规格定义的功能系统是否都已实现。

      3.3.2、业务功能的分解

      通过对系统进行黑盒分析,分解测试项及每个测试项关注的测试类型。

      3.3.3、业务功能的组合

      主要关注相关联的功能项的组合功能的实现情况。

      3.3.4、业务功能的冲突

      业务功能间存在的功能冲突情况。比如:共享资源访问等。

      3.4、子系统层

      针对产品内部结构性能的测试。关注子系统内部的性能,模块间接口的瓶颈。

      3.4.1、单个子系统的性能

      应用层关注的是整个系统各种软、硬件、接口配合情况下的整体性能,这里关注单个系统。

      3.4.2、子系统间的接口瓶颈

    例如:子系统间通讯请求包的并发瓶颈。

      3.4.3、子系统间的相互影响

      子系统的工作状态变化对其他子系统的影响。

      3.5、协议/指标层

      针对系统支持的协议、指标的测试。

      3.5.1、协议一致性测试

      3.5.2、协议互通测试

  • 软件度量中应避免的十个陷阱

    2008-09-16 10:22:05

    软件度量中应避免的十个陷阱

    作者: Michael 来源: 网络转载

    看了这样一篇论文《Software Metrics: Ten Traps To Avoid》,文中说明了十个在作软件度量时应该注意的问题,而这些问题也是实际工作中大家容易掉入的陷阱。

    1.度量缺乏管理者的支持和承诺,没有管理者的支持和承诺,度量工作很难进行。

    2.度量指标太多,度量太快。这样的度量计划往往让人望而却步,很难成功。

    3.度量指标太少,度量介入太迟。度量指标太少很难说明问题,度量介入太迟很难跟踪到项目的整体实际情况。

    4.度量了错误数据,如果度量的数据不是度量目标所需要的数据,那么只能是浪费时间,白费辛苦。

    5.不准确的度量指标定义。不准确的度量指标定义会导致收集错误的数据,得到错误的结论。

    6.利用度量数据来考核员工绩效。这是一种很不明智的做法,只能使度量数据不真实。

    7.利用度量数据来激发而不是理解项目的真实情况。度量数据是用来评价理解项目的实际进展情况,为过程改进提供依据的,而不是用这些数据来激发行动的。

    8.收集无用的数据。度量中收集的数据应进行分析,为下一步行动提供依据,而不是放在数据库中的无人理会的无用数据。

    9.缺乏沟通和培训。

    10.对度量数据进行错误解释。不能从一个度量指标得出武断的结论,应从各方面度量指标综合进行分析。
  • b/s 与 c/s

    2008-09-10 21:27:50

    什么是C/S和B/S结构?  
       
              C/S又称Client/Server或客户/服务器模式。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或   SQL   Server。客户端需要安装专用的客户端软件。  
       
              B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape   Navigator或Internet   Explorer,服务器安装Oracle、Sybase、Informix或   SQL   Server等数据库。浏览器通过Web   Server   同数据库进行数据交互。  
       
              C/S的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。缺点主要有以下几个:  
       
              只适用于局域网。而随着互联网的飞速发展,移动办公和分布式办公越来越普及,这需要我们的系统具有扩展性。这种方式远程访问需要专门的技术,同时要对系统进行专门的设计来处理分布式的数据。  
       
              客户端需要安装专用的客户端软件。首先涉及到安装的工作量,其次任何一台电脑出问题,如病毒、硬件损坏,都需要进行安装或维护。特别是有很多分部或专卖店的情况,不是工作量的问题,而是路程的问题。还有,系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高。  
       
              对客户端的操作系统一般也会有限制。可能适应于Win98,   但不能用于Win2000或Windows   XP。或者不适用于微软新的操作系统等等,更不用说Linux、Unix等。  
       
              B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。只要有一台能上网的电脑就能使用,客户端零维护。系统的扩展非常容易,只要能上网,再由系统管理员分配一个用户名和密码,就可以使用了。甚至可以在线申请,通过公司内部的安全认证(如CA证书)后,不需要人的参与,系统可以自动分配给用户一个账号进入系统。

  • VPN是什么?

    2008-09-08 20:39:28

       VPN(Virtual Private Network):虚拟专用网络,是一门网络新技术,为我们提供了一种通过公用网络安全地对企业内部专用网络进行远程访问的连接方式。我们知道一个网络连接通常由三个部分组成:客户机、传输介质和服务器。

        VPN同样也由这三部分组成,不同的是VPN连接使用隧道作为传输通道,这个隧道是建立在公共网络或专用网络基础之上的,如:Internet或Intranet。要实现VPN连接,企业内部网络中必须配置有一台基于Windows NT或Windows2000 Server的VPN服务器,VPN服务器一方面连接企业内部专用网络,另一方面要连接到Internet,也就是说VPN服务器必须拥有一个公用的IP地址。

        当客户机通过VPN连接与专用网络中的计算机进行通信时,先由ISP(Internet服务提供商)将所有的数据传送到VPN服务器,然后再由VPN服务器负责将所有的数据传送到目标计算机。VPN使用三个方面的技术保证了通信的安全性:隧道协议、身份验证和数据加密。

        客户机向VPN服务器发出请求,VPN服务器响应请求并向客户机发出身份质询,客户机将加密的响应信息发送到VPN服务器,VPN服务器根据用户数据库检查该响应,如果账户有效,VPN服务器将检查该用户是否具有远程访问权限,如果该用户拥有远程访问的权限,VPN服务器接受此连接。在身份验证过程中产生的客户机和服务器公有密钥将用来对数据进行加密。

    VPN产主的背景及其优势

    产生背景

        ●近年来,全球企业并购重组之风愈演愈烈,而企业本身也向跨地区、跨国化发展,这就导致企业的各分支机构遍布全球各地,它们之间的网络基础设施之间互不兼容的问题也变得更为普遍、突出。
        ●企业间的合作、企业与客户间的联系愈来愈广泛、紧密,这也需要更方便、经济的网络支持。
        ●经过这次全球金融风暴的无情洗礼后,许多企业受到不同程度的冲击,能够继续生存的无不费尽心机想提高其竞争力。
        ●Internet的使用日益广泛,其触角几乎已伸到世界的每一个角落,已成为世界上最大的广域网。越来越多的在外办公的员工拥有了侣卦售机。VPN就是在这样的环境下异军突起的,成为服务提供商获得更大利润、企业节约开支的手段。

    VPN具有的优势

        ●降低企业成本。当用VPN进行远程访问时,只需付市内电话费,节约了昂贵的长途电话费;可以大大节约链路租用费、设备购置费以及网络维护费,减少企业的运营成本。除此之外,更能将Internet、企业内部网络(Intranet)、企业外部网络(Extranet)及远程接人功能(Remote Access)整合于同一条对外线路中,不需要像以前那样,同时管理Internet专线,长途数据专线等多.

  • 让你的Win XP“死机”也玩个性

    2008-09-07 20:27:33

       Windows XP系统的朋友电脑死机的几率比以前大大减少,但是由于种种原因,电脑有时会长时间没有响应,形同死机。其实,电脑并非真正死机,而是处于一种假死的状态罢了。检验方法是:按下数字区的Num Lock键,如果指示灯有反应,就说明是假死机。

       这时,我们可以按下“Ctrl+Alt+Del”组合键,在“Windows任务管理器”里执行“结束任务”。不过有时候这招也不是很灵,虽然出现了“正在关闭……”的提示框,系统还是会很长时间没有反应。能不能给系统来点个性化设置,让“死机”变得聪明、快速呢?随我来。

    在“开始→运行”中输入“regedit”打开“注册表编辑器“,对注册表做如下修改:

    1.设定程序出错时的等待时间

    打开“HKEY_CURRENT_USERControl Paneldesktop”,在右边的窗口中找到“HungAppTimeout”,将该键值修改为2000,单位是毫秒。

    2.加速关闭应用程序

    打开“HKEY_CURRENT_USERControl PanelDesktop”,在右边的窗口找到“WaitToKillAppTimeout”,将该键值修改为10000,单位是毫秒。

    3.允许强行关机

    打开“HEKY_USERS.DEFAULTControl Paneldesktop”,在右边的窗口找到“AutoEndTasks”,将该键值修改为1。

    4.系统死机时自动重启

    打开“HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlCrashControl”,在右边的窗口中找到“AutoReboot”,将该键值修改为1。

    经过以上的修改,你会发现系统在“死机”时变得聪明了许多。

  • 防范入侵WindowsXP系统最常用七种方法

    2008-09-07 20:25:12

       第一招:屏幕保护

      在Windows中启用了屏幕保护之后,只要我们离开计算机(或者不操作计算机)的时间达到预设的时间,系统就会自动启动屏幕保护程序,而当用户移动鼠标或敲击键盘想返回正常工作状态时,系统就会打开一个密码确认框,只有输入正确的密码之后才能返回系统,不知道密码的用户将无法进入工作状态,从而保护了数据的安全。

      小提示:部分设计不完善的屏幕保护程序没有屏蔽“Ctrl+Alt+Del”组合键,因此需要设置完成之后测试一下程序是否存在这个重大Bug。

      不过,屏幕保护最快只能在用户离开1分钟之后自动启动,难道我们必须坐在计算机旁等待N分钟看到屏幕保护激活之后才能再离开吗?其实我们只要打开Windows安装目录里面的system子目录,然后找到相应的屏幕保护程序(扩展名是SCR),按住鼠标右键将它们拖曳到桌面上,选择弹出菜单中的“在当前位置创建快捷方式”命令,在桌面上为这些屏幕保护程序建立一个快捷方式。

      此后,我们在离开计算机时双击这个快捷方式即可快速启动屏幕保护。

      

      第二招:巧妙隐藏硬盘

      在“按Web页”查看方式下,进入Windows目录时都会弹出一句警告信息,告诉你这是系统文件夹如果“修改该文件夹的内容可能导致程序运行不正常,要查看该文件夹的内容,请单击显示文件”,这时单击“显示文件”就可以进入该目录了。

      原因是在Windows根目录下有desktop.ini和folder.htt两个文件作祟。将这两个文件拷贝到某个驱动器的根目录下(由于这两个文件是隐藏文件,之前必须在文件夹选项中单击“查看”标签,选择“显示所有文件”,这样就可以看见这两个文件了)。再按“F5”键刷新一下,看看发生了什么,是不是和进入Windows目录时一样。

      接下来我们用“记事本”打开folder.htt,这是用HTML语言编写的一个文件,发挥你的想像力尽情地修改吧。

      如果你不懂HTML语言也没关系,先找到“显示文件”将其删除,找到“修改该文件夹的内可能导致程序运行不正常,要查看该文件夹的内容,请单击显示文件”,将其改为自己喜欢的文字,例如“安全重地,闲杂人等请速离开”。

      将“要查看该文件夹的内容,请单击”改为“否则,后果自负!”,接着向下拖动滑块到倒数第9行,找到“(file://%TEMPLATEDIR%\wvlogo.gif)”这是显示警告信息时窗口右下角齿轮图片的路径,将其改为自己图片的路径,例如用“d:\tupian\tupian1.jpg”替换“//”后面的内容,记住这里必须将图片的后缀名打出,否则将显示不出图片。

      当然,你还可以用像Dreamweaver、FrontPage这样的网页工具做出更好的效果,然后只要将原文件拷贝到下面这段文字的后面,覆盖掉原文件中“~”之间的内容就可以了。

      *ThisfilewasautomaticallygeneratedbyMicrosoftInternetEXPlorer5.0

      *usingthefile%THISDIRPATH%\folder.htt.

      保存并退出,按“F5”键刷新一下,是不是很有个性?接下来要作的就是用“超级兔子”将你所要的驱动器隐藏起来,不用重新启动就可以欣赏自己的作品了。最后告诉大家一招更绝的,就是干脆将folder.htt原文件中“~”之间的内容全部删除,这样就会给打开你的驱动器的人造成一种这是一个空驱动器的假象,使其中的文件更安全。

     

        第三招:禁用“开始”菜单命令

      在Windows2000/XP中都集成了组策略的功能,通过组策略可以组策略设置各种软件、计算机和用户策略在某种方面增强系统的安全性。运行“开始→运行”命令,在“运行”对话框的“打开”栏中输入“gpedit.msc”,然后单击“确定”按钮即可启动WindowsXP组策略编辑器。

      在“本地计算机策略”中,逐级展开“用户配置→管理模板→任务栏和开始菜单”分支,在右侧窗口中提供了“任务栏”和“开始菜单”的有关策略。

      在禁用“开始”菜单命令的时候,在右侧窗口中,提供了删除“开始”菜单中的公用程序组、“我的文档”图标、“文档”菜单、“网上邻居”图标等策略。清理“开始”菜单的时候只要将不需要的菜单项所对应的策略启用即可,比如以删除“我的文档”图标为例,具体操作步骤为:

      1.在策略列表窗口中用鼠标双击“从开始菜单中删除我的文档图标”选项。

      2.在弹出窗口的“设置”标签中,选择“已启用”单选按钮,然后单击“确定”即可。

      第四招:桌面相关选项的禁用

      WindowsXP的桌面就像你的办公桌一样,有时需要进行整理和清洁。有了组策略编辑器之后,这项工作将变得易如反掌,只要在“本地计算机策略”中展开“用户配置→管理模板→桌面”分支,即可在右侧窗口中显示相应的策略选项。

      1.隐藏桌面的系统图标

      倘若隐藏桌面上的系统图标,传统的方法是通过采用修改注册表的方式来实现,这势必造成一定的风险性,采用组策略编辑器,即可方便快捷地达到此目的。

      若要隐藏桌面上的“网上邻居”和“InternetEXPlorer”图标,只要在右侧窗口中将“隐藏桌面上网上邻居图标”和“隐藏桌面上的InternetEXPlorer图标”两个策略选项启用即可。如果隐藏桌面上的所有图标,只要将“隐藏和禁用桌面上的所有项目”启用即可。

      当启用了“删除桌面上的我的文档图标”和“删除桌面上的我的电脑图标”两个选项以后,“我的电脑”和“我的文档”图标将从你的电脑桌面上消失了。如果在桌面上你不再喜欢“回收站”这个图标,那么也可以把它给删除,具体方法是将“从桌面删除回收站”策略项启用。

      2.禁止对桌面的某些更改

      如果你不希望别人随意改变计算机桌面的设置,请在右侧窗口中将“退出时不保存设置”这个策略选项启用。当你启用这个了设置以后,其他用户可以对桌面做某些更改,但有些更改,诸如图标和打开窗口的位置、任务栏的位置及大小在用户注销后都无法保存。

     

        第五招:禁止访问“控制面板”

      如果你不希望其他用户访问计算机的控制面板,你只要运行组策略编辑器,并在左侧窗口中展开“本地计算机策略→用户配置→管理模板→控制面板”分支,然后将右侧窗口的“禁止访问控制面板”策略启用即可。

      此项设置可以防止控制面板程序文件的启动,其结果是他人将无法启动控制面板或运行任何控制面板项目。另外,这个设置将从“开始”菜单中删除控制面板,同时这个设置还从Windows资源管理器中删除控制面板文件夹。

      小提示:如果你想从上下文菜单的属性项目中选择一个“控制面板”项目,会出现一个消息,说明该设置防止这个操作。

      第六招、设置用户权限

      当多人共用一台计算机时,在WindowsXP中设置用户权限,可以按照以下步骤进行:

      1)运行组策略编辑器程序。

      2)在编辑器窗口的左侧窗口中逐级展开“计算机配置→Windows设置→安全设置→本地策略→用户权限指派”分支。

      3)双击需要改变的用户权限,单击“添加用户或组”按钮,然后双击想指派给权限的用户账号,最后单击“确定”按钮退出。

      第七招:文件夹设置审核

      WindowsXP可以使用审核跟踪用于访问文件或其他对象的用户账户、登录尝试、系统关闭或重新启动以及类似的事件,而审核文件和NTFS分区下的文件夹可以保证文件和文件夹的安全。为文件和文件夹设置审核的步骤如下:

      1.在组策略窗口中,逐级展开右侧窗口中的“计算机配置→Windows设置→安全设置→本地策略”分支,然后在该分支下选择“审核策略”选项。

      2.在右侧窗口中用鼠标双击“审核对象访问”选项。

      3.用鼠标右键单击想要审核的文件或文件夹,选择弹出菜单的“属性”命令,接着在弹出的窗口中选择“安全”标签。

      4.单击“高级”按钮,然后选择“审核”标签。

      5.根据具体情况选择你的操作:

      倘若对一个新组或用户设置审核,可以单击“添加”按钮,并且在“名称”框中键入新用户名,然后单击“确定”按钮打开“审核项目”对话框。

      要查看或更改原有的组或用户审核,可以选择用户名,然后单击“查看/编辑”按钮。

      要删除原有的组或用户审核,可以选择用户名,然后单击“删除”按钮即可。

      6.如有必要的话,在“审核项目”对话框中的“应用到”列表中选取你希望审核的地方。

      7.如果想禁止目录树中的文件和子文件夹继承这些审核项目,选择“仅对此容器内的对象和/或容器应用这些审核项”复选框。

      注意:必须是管理员组成员或在组策略中被授权有“管理审核和安全日志”权限的用户可以审核文件或文件夹。在WindowsXP审核文件、文件夹之前,你必须启用组策略中“审核策略”的“审核对象访问”。否则,当你设置完文件、文件夹审核时会返回一个错误消息,并且文件、文件夹都没有被审核。

  • Why testing???

    2008-09-07 15:26:10

        与国际先进软件企业相比,中国软件企业差在哪里?一个重要而又明显的差距就是软件测试和软件测试人才。主要存在以下三个方面的问题:
      (1)认识问题:重开发、轻测试,将测试置于从属地位;没有认识到软件项目的如期完成不仅取决于开发人员,更取决于测试人员。
      (2)管理问题:随意化、简单化,未建立有效的、规范的测试管理体系。
      (3)工具问题:缺少自动化工具的支持,一般未采用软件测试管理系统。

      对国际著名IT企业的统计数据表明,软件测试在整个软件项目中所占的比例为 40% 以上,占整个项目费用的 50% 以上,软件测试人员与开发人员的人数比例大于1:2。国内软件企业在软件测试上的投入一般在 5% 以下,测试人员所占比例很小,经常处于从属地位。中国软件工业要健康发展,必须正视和努力缩小这个差距。
      对美国大量软件项目的观察结果表明,软件项目的成功在很大程度上依赖于软件测试的成功,软件测试做得好的项目不光质量好,而且可以提前或按时完成,其成本也相对较低;抓软件测试和软件质量,并不意味着增加项目成本,反而可以降低项目成本。此外,软件质量越高,软件发布后维护费用越低。

  • HP-UX系统安装和配置

    2008-09-05 22:21:13

       1 HP-UX系统安装

      HP-UX操作系统是预装的,由HP工程师进行配置。配置包括如下参数:
      主机名: CRCT1(上)
      CRCT2(下)
      此主机名可通过hostname或uname –a 命令查看。

      
      2 创建用户帐号

      使用sam创建用户帐号halt、test、jzx、train和informix。并分别用passwd命令给各用户设置口令。

      3配置磁盘

      3.1 配置镜像磁盘

      Mirror Disk是HP-UX的一套软件包,当系统中安装有两个系统盘时,可以利用该软件的功能来做操作系统的镜像备份,以下是做镜像磁盘的步骤。

      1、 执行lvlnboot -v命令检查系统中的启动设备
      #lvlnboot -v
      Boot
      Boot
      Swap
      Dump

      2、 创建第二块系统盘
      #pvcreate -B /dev/rdsk/c2t6d0

      3、 扩展vg00,添加第二块硬盘
      #vgextend /dev/vg00 /dev/dsk/c2t6d0

      4、 为第二块磁盘创建boot引导信息
      #mkboot /dev/dsk/c2t6d0

      5、 扩展vg00中各逻辑卷,添加镜像磁盘
      lvextend -m /dev/vg00/lvol2 /dev/dsk/c2t6d0
      lvextend -m /dev/vg00/lvol3 /dev/dsk/c2t6d0
      lvextend -m /dev/vg00/lvol4 /dev/dsk/c2t6d0
      lvextend -m /dev/vg00/lvol5 /dev/dsk/c2t6d0
      lvextend -m /dev/vg00/lvol6 /dev/dsk/c2t6d0
      lvextend -m /dev/vg00/lvol7 /dev/dsk/c2t6d0
      lvextend -m /dev/vg00/lvol8 /dev/dsk/c2t6d0
      lvextend -m /dev/vg00/lvol9 /dev/dsk/c2t6d0
      lvextend -m /dev/vg00/lvol10 /dev/dsk/c2t6d0

      6、 为第二块磁盘创建boot引导信息
      #mkboot -a "hpux(;0)/stand/vmunix" /dev/dsk/c2t6d0

      7、 执行如下操作后重新启动系统
      #lvlnboot -b /dev/vg00/lvol1
      #lvlnboot -b /dev/vg00/lvol2
      #lvlnboot -b /dev/vg00/lvol3
      #lvlnboot -d /dev/vg00 /dev/dsk/c2t6d0
      #lvlnboot -R
      #shutdown -h -y 0

      8、 在启动Main Menu出现时,从第二块磁盘启动
      Main Menu:>sea
      P0 0/0/2/0.6 intscsia.6 Random access medias
      P1 0/0/2/6 intscsia.6 Random access medias
      P0 0/4/0/0.0 Random access medias
      P3 0/10/0/0.1 Random access medias
      P4 1/10/0/0.5 Sequene access medias
      Main Menu:>bo p1

      9、 系统启动以后执行如下操作
      #lvlnboot -v

      3.2添加磁盘阵列

      使用sam命令添加物理磁盘:
      sam ?;Disks and File Systems(CRCT1)
      选定某个磁盘,在该磁盘上执行:
      ?;Disk Devices
      ?;Actions ?;Disk Array Maitainece?;bind
      出现的菜单可对选定的物理磁盘添加一个新的PV,共添加四个PV,其中两个64G,两个1GB。

      3.3添加VG02、VG03

      sam ?;Disks and File Systems(CRCT1)
      ?;Volumes Groups
      ?;Actions ?;Create
      ?;Modify
      ?;delete
      出现菜单以后对上一步创建的两个64GB的PV配置为新的VG02,共128GB。将其中的一个1GB的PV配置为VG03。

      4配置磁带

      4.1 配置磁带机
      1、 添加磁带机驱动程序tape
      2、 连接核心并重新启动系统
      3、 使用磁带机设备
      tar cvf /dev/rmt/0m /etc/*

      4.2 配置磁带库
      1、 添加磁带库驱动程序shrgr
      2、 连接核心并重新启动系统
      3、 查看磁带库设备
      ll /dev/ac/*

      5配置网络

      5.1使用sam配置网卡
      sam?;Network Configration?;IP Address on network devices
      选择该选项之后会出现网络设备的列表,可以选择在某个设备上配置网络地址或禁止该设备(disable)。

      5.2 手工配置网卡
      编辑/etc/rc.config.d/netconf文件,更改其中的网卡的IP地址。
      Lan0
      IP=192.168.10
      SUBNET=255.255.255.0

      5.3 添加启动静态路由
      1、 生成文件/sbin/init.d/route
      #more /sbin/init.d/route
      route add default 192.168.3.1
      2、 生成连接文件
      ln -s /sbin/init.d/route /sbin/rc2.d/S750route
      3、 查看路由信息
      netstat -r

      5.4 配置bootp远程启动协议
      1、 搜索系统中的网卡
      #/usr/bin/lanscan
      #ifconfig lan0
      2、 备份原始文件
      #cp /etc/bootptab /etc/bootptab.bak
      3、 编辑/etc/bootptab文件
      #/usr/bin/vi /etc/bootptab
      add a similar entry for each system to be served by this bootp serverr
      CRCT2:\
      Ht=ether:\
      Vm=rfc1048:\
      Ha=080009000000:\
      Ip=192.168.11
      Hn:\
      Bf=lif202bin:\
      4、 当CRCT1启动时按空格键中断其启动过程
      进入Main Menu状态,键入bo lan.192.168.10
      interact with IPL (Y,N,or Cancel)?N
      接下来就是远程启动的过程。

  • What do?

    2008-09-03 20:48:18

       技术支持做什么

       技术支持工程师是一个跨行业的职位,如果细分的话,可以分成企业对内技术支持,和企业对外技术支持,在对外技术支持中又可以分为售前与售后两大类。

    售前与售后

      调查发现,在外企售前技术工程师年薪数要高于售后技术工程师,两者大约会相差 20%。前程无忧咨询部的W女士认为:一方面,有些公司的售前技术工程师除了基本工资以外,还会有一部分销售奖励提成;另一方面,售前技术工程师这一职位 除了对相关行业技术要求外,还十分看重求职者的个人综合成能力,其中包括与客户的沟通力,表达演讲能力以及为客户解决方案的能力。他必须基于产品功能,针 对不同客户不同要求,给出不同的方案。一个好的售前技术支持工程师将会在满足客户要求的前提下,以公司的最小成本获得最大的收益。

       业内资深人士先生指出,售前技术支持的薪资和其在该产品和项目中扮演的角色有关。那些能够挖掘出客户潜在需求,从而为客户解决问题的售前技术支持将会 有高的回报。换而言之,这里有一个主动与被动的问题,被动的等客户上门寻找服务与主动上门为客户提供服务是有很大的区别的,主动者付出的劳动自然要多一 些,公司也乐意招聘这样的售前支持,相应的报酬高也就理所当然了。另外,如果同样都是处于买方市场的话,产品或是项目的技术含量高低也会影响到售前的薪 资。

      相对而言,售后技术支持工程师更是一个资深的技术专家,他必须掌握产品从开发到设计以及最后实施的全过程。有些公司还要求售 后技术支持工程师能够在实施过程中进一步挖掘出客户的需求,对于阶段性或是更新型的项目,售后工程师将有责任做进一步的跟踪服务。专家杨先生认为,售后技 术支持是一个更纯粹的工程师角色,技术要求比较高,薪资也将会比较稳定。


    明天的面包在哪里?

      相对于售前而言,售后技术支持工程师的入职门坎比较低。现为项目经理的某公 司何先生认为:一般有个一年相关技术工作经验,熟练掌握相关技术,大专以上学历者都可以胜任。目前绝大多数入行者都会选择售后作为切入点,认真工作几年之 后,再往售前转。目前在做售后的W先生就是这样规划的。他认为,做售后能够有机会把相关产品的技术做透,做深,同时通过对产品的全方位全细节的了解,能在 客户反映的第一时间内判断出问题的根源,及相应必须采取措施。这种经验对于自己今后的发展大有帮助。

      对于售前技术支持的招聘,业 内资深人士先生认为:本科毕业,懂技术是基础,同时还要考虑应聘者个人的综合能力、工作经验和社会关系。当然有专业销售经验将会成为重要的砝码。现为售 前技术支持的先生表示:优秀的售前技术支持人员应当有主动精神和全局观念,勤于思考,及时总结日常工作中遇到的各种问题,系统地整理出针对市场顾客、内 部销售部门的行之有效的工作方法。例如建立针对性强的销售资料工具库、主动帮助销售提高业务知识、汇总各方面的信息,向技术部门提供合理化建议、甚至为整 体产品的策划与销售政策的制定提供有力的决策支持。这些能力锻炼,都是为将来成为行业专家,团队管理领导者打下基础。

      个人魅力很重要!从事售前的先生深有体会。当你无法明确而清晰地向客户表达解决方案时,当你无法良好的协调各环节,使之高效运作时,你会清楚地意识到此时缺乏的不再是纯粹的技术问题。学会如何规划,注意组织能力的培养,都是向高一级职位发展的必修课。

       售前技术支持工程师基于个人的个性、能力和兴趣,发展方向可以很多,比如销售总监,比如项目经理或是产品经理,还有部门的领导者。资深猎头女士认为, 要想向高一级目标职位发展,45年的技术支持经验是必不可少的。除专业技术外,管理能力、组织规划能力的培养将成为关键。

      无论如何,在以买方市场为主导下的市场舞台中,抛开技术和厂商的差别,项目的成功与否基于企业售前所能够提供的完善服务,技术支持工程师这一职位将会有更多的机会,也会面临更大的挑战。

     

  • Oracle 9i 在Linux 下的安装

    2008-09-02 14:51:17

       Oracle 9i 在Linux 下的安装

       Oracle9i 2000 年 10 月在 Oracle Open World 上发布,为 Oracle 数据库、应用服务器和开发工具引进了许多新功能。Oracle9i是业界第一个完整、简单的用于互联网的新一代智能化的、协作各种应用的软件基础架构。Oracle9i 实际上是指 Oracle9i Database, Oracle9i Application Server 和Oracle9i Developer Suite的完整集成。随着软件逐渐开始转变为一种托管服务( hosted services),具有internet上的高伸缩性能的、智能化的、和可靠的Oracle9i 将成为高质量的电子商务服务实现的关键软件。
    本文将介绍OracleDatabase 9i在Linux下的安装过程,如果你是有过安装Oracle的经验本安装过程可以权当快速安装手册;如果你以前从未在Linux下安装过Oracle数据库,那我们就从这篇文章开始熟悉oracle的安装过程。

    系统要求:
    以下的系统要求适用于典型的Oracle安装和创建简单数据库的方式。

    内存:
    安装Oralce 9i软件至少需要512M内存,用以下命令可以查看机子的内存大小:
    grep MemTotal /proc/meminfo
    MemTotal: 900252 kB
    900252kB就是你系统的内存大小。

    交换区:
    交换区的大小一般要求是内存的两倍,至少要求达到400M以上,当然是越大越好,用以下的命令可以查看系统交换区的大小:
    /sbin/swapon -s
    Filename Type Size Used Priority
    /dev/sda6 partition 105221 686976 -1

    其中105221就是系统交换区的大小。

    光驱:
    如果你使用光盘安装Oracle9i则你的机子上需要8速以上的CDROM,如果你是下载了oracle9i的包文件,则不需要使用的CDROM。

    硬盘空间:
    安装Oracle9i数据库至少要有2.5GB以上的剩余空间。

    临时硬盘空间:
    Oracle安装程序在安装过程中需要400M以上的临时硬盘空间,建议使用/tmp文件夹作为零时文件夹,如果/tmp文件没有足够的硬盘,可以新创建一个文件夹作为安装的临时目录,之后设置环境变量TEMP和TMPDIR指向相应的位置,例如:
    使用bash
    mkdir /home/temp
    TEMP=/home/temp ; export TEMP
    TMPDIR=/home/temp ; export TMPDIR

    使用csh
    mkdir /home/temp
    setenv TEMP /home/temp
    setenv TMPDIR /home/temp

    操作系统:
    Oracle公司官方公布的资料指出Oracle 9i只在安装SuSuSe 7.1, 内核 2.4.4 和glibc2.2的系统上测试通过,经过本人的测试,Oracle在Linux Mandrake release 8.0,内核2.4.3-20和glibc-2.2.2的版本上也可以顺利安装,本文将以Linux Mandrake8.0为例介绍Oracle9i的安装过程。

    虚拟x-windows软件:
    这个软件不是必要的!所谓虚拟x-windows软件指的是可在远程终端允许服务器x-windows的虚拟软件,现在流行的x-windows软件有exceed、x-win32等软件,如果你嫌在控制台安装oracle系统麻烦,可以使用虚拟x-windows软件在远程终端在图形界面下安装oralce9i,本文将以x-win32 5.0为例介绍用虚拟x-windows安装oracle9i的过程。
    JDK
    如果你要安装Oracle HTTP Server还需要用到blackdown的JDK1.3.1,请到以下地址下载ftp://ftp.progsoc.uts.edu.au/pub/Linux/java/JDK-1.3.0/i386/rc1/j2sdk-1.3.0-RC1-linux-i386.tar.bz2

    配置内核参数
    oracle9i使用Linux的共享内存、交换区等资源进行工作,如果你的内核参数设置不能满足oracle的要求,那在安装oracel9i或使用过程就会频频出现问题,因此配置系统内核的参数就显得尤为重要和关键了。

    内核参数的配置一般在/proc文件夹下配置:
    1. 以root用户允许以下命令;
    2. 进入目录/proc/sys/kernel;
    3. 用cat命令或more命令查看semaphore当前参数的值:
    cat sem
    命令运行后将会出现如下的结果:
    250 32000 32 128
    其中, 250 是参数SEMMSL的值,32000是参数SEMMNS的值, 32是参数SEMOPM的值,而128则是参数SEMMNI的值。
    4. 用以下的命令可以对上述参数进行修改
    echo SEMMSL_value SEMMNS_value SEMOPM_value SEMMNI_value > sem
    其中SEMMSL_value、SEMMNS_value、SEMOPM_value、SEMMNI_value分别用相应的值进行替换,并且这些值的顺序不能调换

    5. 设置共享内存大小,共享内存大小一般设为物理内存的一半,在这里我们假设物理内存为512M则共享内存的值4294967295以此类推,如果你的物理内存是1G则这里的值则是8589934590:
    echo 4294967295 > shmmax
    添加用户
    Oracle在安装和使用中需要用特定用户(非root用户),按照oracle的标准说明是需要添加三个专门用户和用户组,为了简便大家的安装和使用我们把oracle的安装和使用归到一个特定用户来完成。
    首先创建oracle用户组,我们架设这个用户组命名为dba:
    以root用户登陆系统;
    运行groupadd dba命令添加dba用户组;

    添加oracle用户:
    以root用户登陆系统;
    运行useradd –g dba –p password –d /oracle –s /bin/bash oracle
    运行后系统创建了一个属于dba用户组的用户oracle,密码为password,主目录为/oracle使用bash

    这个用户将作为系统的安装和使用指定用户,因此要妥善保存好!
    创建安装点(mount point)
    oracle9i的典型安装需要至少两个安装点:一个安装基本的运行程序,要求至少要有850M的硬盘空间;一个为存放数据库,至少要求有450M的硬盘空间。为了简化安装我们可以把运行程序和数据库装在同一个安装点下。
    在你的文件系统上找到有足够空间的分区,在分区下创建文件夹,我们假设这个文件夹为/oracle。
    配置系统环境变量
    很多网友安装oracle失败都是因为环境变量没有配置正确,环境变量的配置直接影响到以后oracle9i的安装和配置,在配置的时候要尤为小心!
    配置x-windows变量
    确认oracle9i在安装过程中是否使用本地x-windows安装还是远程虚拟x-windows安装,如果需要远程x-windows安装,则需要配置DISPLAY变量,这个变量用于告诉系统屏幕的图形将输出到什么位置,默认情况下是本机,如果你使用虚拟x-windows进行安装,则在这里指明远程终端的显示情况,比如你远程终端的IP地址是xxx.xxx.xxx.xxx则DISPLAY的变量应设为“xxx.xxx.xxx.xxx:0”后面的“:0”表示该终端的第一个显示器。
    确定安装临时目录
    前面我们提到过oracle9i的安装需要一个临时的可写空间,我们在这里把/tmp作为临时的可写目录。如果你不是使用/tmp作为临时可写目录则需要配置相应的值TMPDIR=/path。
    配置oracle的环境变量

    下面提供一个例子可以供大家参照使用
    export DISPLAY="192.9.200.24:0.0"
    export BASH_ENV=$HOME/.bashrc
    ORACLE_HOME=/oracle/product/9.0.1; export ORACLE_HOME
    ORACLE_SID=oracle; export ORACLE_SID
    ORACLE_TERM=xterm; export ORACLE_TERM
    TNS_ADMIN=/home/oracle/config/9.0.1; export TNS_ADMIN
    NLS_LANG=american_america.ZHS16GBK; export NLS_LANG
    ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data; export ORA_NLS33
    LD_LIBRARY_PATH=$ORACLE_HOME/lib;export LD_LIBRARY_PATH
    PATH=$PATH:/bin:/usr/bin:/usr/sbin:/etc:/opt/bin:
    /usr/ccs/bin:/usr/openwin
    PATH=$PATH:/opt/local/bin:/opt/NSCPnav/bin:$ORACLE_HOME/bin
    PATH=$PATH:/usr/local/samba/bin:/usr/ucb:
    export PATH
    CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:
    $ORACLE_HOME/rdbms/jlib
    CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
    TMPDIR=/tmp;export TMPDIR
    umask 022

    其中:
    ORACLE_HOME为系统软件的安装目录;
    ORACLE_SID 为数据库的SID,这里可以自行设置;
    NLS_LANG 为数据库的字符集,为了保证数据库能够输出输入数据库,我们需要在这里把字符集设为american_america.ZHS16GBK,其中american_america英文字符集,ZHS16GBK为中文字符集。

    以oracle用户登陆系统,
    vi $HOME/.bash_profile
    把以上环境变量的设置粘贴到文件中,确认相应的内容并修改,存盘退出。
    重新登陆oracle用户
    使用set|more命令查看oracle用户的环境变量是否生效
    CLASSPATH=/oracle/product/9.0.1/JRE:/oracle/product/9.0.1/jlib:
    /oracle/product/9.0.1/rdbms/jlib:
    /oracle/product/9.0.1/network/jlib
    DISPLAY=192.9.200.24:0.0
    LD_LIBRARY_PATH=/oracle/product/9.0.1/lib:/lib:/usr/lib:
    NLS_LANG=american_america.ZHS16GBK
    ORACLE_HOME=/oracle/product/9.0.1
    ORACLE_SID=oracle
    ORACLE_TERM=xterm
    ORA_NLS33=/oracle/product/9.0.1/ocommon/nls/admin/data
    OSTYPE=linux-gnu
    PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/games:
    /bin:/usr/bin:/usr/sbin:/etc:/opt/bin:/usr/ccs/bin:/usr/openwin:
    /opt/local/bin:/opt/NSCPnav/bin:
    /oracle/product/9.0.1/bin:/usr/local/samba/bin:/usr/ucb:
    TNS_ADMIN=/home/oracle/config/9.0.1
    仔细检查一下以上的几项,确保都设置正确了。
    安装Oralce9i
    安装JDK1.3.1
    把下载的j2sdk-1.3.0-RC1-linux-i386.tar.bz2文件上传到服务器的/usr/local/目录下,以root用户登陆,用bzip –d j2sdk-1.3.0-RC1-linux-i386.tar.bz2命令先把文件解成tar格式,再使用tar xvf j2sdk-1.3.0-RC1-linux-i386.tar.bz2解压出来,为了便于操作可以把文件夹名改成jdk.。
    配置x-windows
    oracle9i的安装几乎支持所有的x-windows,也支持远程的虚拟x-windows安装,如果你要在本机安装在控制台上以我们先前创建的oracle用户登陆(注意要先设置好环境变量,并把DISPLAY的值设为空export DISPLAY=””)运行startx命令进入x-windows。
    如果需要在远程终端使用虚拟x-windows进行安装,需要在客户端先安装x-win32软件,x-win32的安装过程我们就不多介绍了,安装完成后运行x-win32命令在你的任务栏会出现一个x的标致。使用neterm等终端攻击以oracle用户登陆系统确认环境变量都已经生效并且DISPLAY变量的值为你终端机的IP地址,运行startkde命令启动x-windows,运行完毕后系统会出现一大堆的出错信息,忽略不管,过了几秒后在你的远程终端上会出现Linux的kde界面。
    下载Oracle安装软件
    Oracle网站(http://otn.oracle.com)现在提供Oracle9i for Linux软件下载,在下载前请仔细阅读他的Licence,这样在今后的使用中才不会有版权问题。在下载前你需要一个otn的账户,申请是免费的,只要简单回答几个问题就可以,oracle9i的安装程序共有三个文件包分别是:
    Linux9i_Disk1.cpio.gz (412,092kb)
    Linux9i_Disk2.cpio.gz (638,547kb)
    Linux9i_Disk3.cpio.gz (82,956kb)
    下载完这三个文件后,把这三个文件上传到服务器/oracle目录下,并保证这三个文件的属主是oracle用户。如果你有Oracle9i的安装CD那就可以省下大把下载时间了
    安装Oracle 9i 数据库
    以oracle用户登陆系统,启动本地x-windows或虚拟x-windows,打开一个控制台窗口,进入到刚才存放oracle文件的目录下,分别使用
    gunzip Linux9i_Disk1.cpio.gz
    cpio -idmv
    gunzip Linux9i_Disk2.cpio.gz
    cpio -idmv
    gunzip Linux9i_Disk3.cpio.gz
    cpio -idmv
    命令解包,把三个文件包解压缩成三个安装文件夹分别为Disk1、Disk2、Disk3。
    进入Disk1目录
    cd Disk1
    在控制台窗口敲入
    ./runInstaller &
    运行后会出现一个OUI的图形界面,

    中间绿色的窗口就是oracle的安装图形界面了。
    下面我们来进行oracle9i最基本的安装,在进入安装界面后点Next进入下一步:

    Source指的是包含Oracle产品信息的文件,一般情况下他会自动识别到,如果找不到可以用Browse按钮来手工指定路径。
    Destination指的是9i将要安装的路径这里就是我们在环境变量里设的$ORACLE_HOME,如果这一栏里是空白的则要重新检查环境变量中各值的设定是否有误。确认正确后按Next进行下一步:

    这一步有三个安装选项供选择:
    Oracle9i Database 9.0.1.0.0,安装oracle9i的数据库服务器版本、管理工具、网络服务以及基本的客户端软件;
    Oracle9i Client 9.0.1.0.0 ,企业版的客户端软件,网络服务以及开发工具等。
    Oracle9i Mangement and Integration 9.0.1.0.0,安装Management Server,管理工具Oracle的网络目录、综合服务、网络服务以及基本的客户端软件。
    我们选第一项安装Oracle9i数据库服务其,接着安Next按钮;

    这一步是选择Oracle安装的类型,有三个类型供选择Enterprise Edition,企业版,Standstard Edition标致版,Custom自定义安装,我们选择企业版的安装,如果你对Oracle这一系列的产品比较熟悉的化可以选择Custom自定义安装,按自己的需求选择组件进行安装,确认后安Next进入到下一步;


    这里可以选择一种适合你的数据库模版,一般我们选第一种通用的数据库模版,如果你需要使用数据仓库,则可以使用选择数据仓库的模版进行安装。确认后按Next进入下一步;

    这一步是确认Oracle9i的SID和全局数据库的名字,SID的值我们在环境变量中已经设好了,所以这里就自动显示了,全局数据库名(Global Database Name)我们可以也指定成和SID的值相同,确认后按Next进入下一步;

    前面我们提到了,数据库的字符类型在数据库超作中是很关键的,这一步就是设置数据库的字符集,前面我们设置的是NLS_LANG=american_america.ZHS16GBK,所以我们选择Simplifiled Chinese ZHS16GBK,按Next进入下一步;

    因为我们在前面选择了Enterprise的版本进行安装,系统会安装Oracle Web Server,安装Oracle Web Server需要使用JDK,我们使用Browse按钮把前面安装JDK的目录指定好以便系统能在安装过程中找到需要的应用程序,确认按Next进入下一步;

    进行完所有选择后,系统会给出一个安装概要,这里列举了你选择安装的组件,确认你要安装的东西都在列表内后,安Install钮进行安装,如果不需要安装其它的程序,则按Exit退出安装界面。

    Oracle的安装速度视服务器的性能一般来说需要装30分钟的时间,在安装过程中可能会有对话框弹出,对话框内会有一些需要root运行的命令要求你执行,这时候另外开一个控制台窗口,su成root并运行提示框内的命令,运行完毕后按确定继续安装;

    安装完数据库后系统会运行配置工具对系统进行网络和数据库的配置。配置完成后,系统会自动启动数据库,并开启Oracle Web Server。所有配置完后,按Next完成安装。

    如果一切正常,OUI会出现The Installation Of Oracle9i Database Was successful.的字样,这表明你的Oracle9i数据库安装正常了,如果需要安装其它的内容按Next Install钮进行其它内容的安装,否则按Exit退出安装。
    使用Oracle 9i 数据库
    安装完毕后Oracle数据库会自动启动,下面我们用实际超作来说明一下Oracle 9i数据库的启动和关闭。
    以oracle用户登陆数据库,开个控制台窗口;
    关闭Oracle 9i 数据库
    [oracle@wing /oracle]$ sqlplus " / as sysdba" //以sysdba用户登陆数据库

    SQL*Plus: Release 9.0.1.0.0 - Production on Wed Jul 11 15:35:31 2001

    (c) Copyright 2001 Oracle Corporation. All rights reserved.
    Connected to:
    Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
    With the Partitioning option
    JServer Release 9.0.1.0.0 - Production
    运行shudown命令关闭数据库
    SQL> shutdown
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL>
    启动Oracle 9i 数据库
    [oracle@wing bin]$ sqlplus " / as sysdba"

    SQL*Plus: Release 9.0.1.0.0 - Production on Wed Jul 11 16:00:59 2001

    (c) Copyright 2001 Oracle Corporation. All rights reserved.

    Connected to an idle instance.

    SQL> startup
    ORACLE instance started.

    Total System Global Area 336356520 bytes
    Fixed Size 279720 bytes
    Variable Size 268435456 bytes
    Database Buffers 67108864 bytes
    Redo Buffers 532480 bytes
    Database mounted.
    Database opened.
    SQL>


    启动Oracle 9i监听程序
    Oracle的监听程序主要是为客户端的连接提供接口
    [oracle@wing bin]$ lsnrctl

    LSNRCTL for Linux: Version 9.0.1.0.0 - Production on 11-JUL-2001 16:12:17

    Copyright (c) 1991, 2001, Oracle Corporation. All rights reserved.

    Welcome to LSNRCTL, type "help" for information.

    LSNRCTL> start
    Starting /oracle/product/9.0.1/bin/tnslsnr: please wait...

    TNSLSNR for Linux: Version 9.0.1.0.0 - Production
    System parameter file is /oracle/product/9.0.1/network/admin/listener.ora
    Log messages written to /oracle/product/9.0.1/network/log/listener.log
    Listening on: (DEscrīptION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
    Listening on: (DEscrīptION=(ADDRESS=(PROTOCOL=tcp)(HOST=wing)(PORT=1521)))

    Connecting to (DEscrīptION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
    STATUS of the LISTENER
    ------------------------
    Alias LISTENER
    Version TNSLSNR for Linux: Version 9.0.1.0.0 - Production
    Start Date 11-JUL-2001 16:12:58
    Uptime 0 days 0 hr. 0 min. 0 sec
    Trace Level off
    Security OFF
    SNMP OFF
    Listener Parameter File /oracle/product/9.0.1/network/admin/listener.ora
    Listener Log File /oracle/product/9.0.1/network/log/listener.log
    Listening Endpoints Summary...
    (DEscrīptION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
    (DEscrīptION=(ADDRESS=(PROTOCOL=tcp)(HOST=wing)(PORT=1521)))
    Services Summary...
    Service "PLSExtProc" has 1 instance(s).
    Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
    Service "oracle" has 1 instance(s).
    Instance "oracle", status UNKNOWN, has 1 handler(s) for this service...
    The command completed successfully
    LSNRCTL>
    关闭Oracle 9i监听程序
    [oracle@wing bin]$ lsnrctl

    LSNRCTL for Linux: Version 9.0.1.0.0 - Production on 11-JUL-2001 16:12:17

    Copyright (c) 1991, 2001, Oracle Corporation. All rights reserved.

    Welcome to LSNRCTL, type "help" for information.
    LSNRCTL> stop
    Connecting to (DEscrīptION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
    The command completed successfully
    LSNRCTL>

    关闭Oracle Web Server
    cd $ORACLE_HOME/Apache/Apache/bin
    ./stopJServ.sh
    /oracle/product/9.0.1/Apache/Apache/bin/apachectl stop: httpd stopped

    启动Oracle Web Server
    cd $ORACLE_HOME/Apache/Apache/bin[oracle@wing bin]$ ./startJServ.sh
    /oracle/product/9.0.1/Apache/Apache/bin/apachectl start: httpd started
    启动Oracle Web Server后默认的端口号是7777
    在客户端浏览器地址栏输入http://xxx.xx.xxx.xxx:7777/
    如果浏览器出现界面表示Oracle Web Server运行正常。

  • Delphi:开发工具史上的奇迹

    2008-09-01 22:07:26

        提起Delphi就不能不提到Borland公司,它曾经轰动全世界,成就了vb 杀手的美名。Philippe Kahn以2000美元在硅谷创建的这家公司在开发人员眼中简直就是一个奇迹,数次跌到再数次依靠明星级开发工具爬起来,至今仍与微软相持不下,在它的众多明星级开发工具中,Delphi无疑是最璀璨的明珠。

      Borland赖以起家的Pascal在Borland Pascal 7.x以后,Pascal语言似乎已发展到极至,程序语言的焦点已从Pascal转向C++,Borland必须考虑如何让Pascal重新焕发青春,这时候他们从Visul Basic获得了启发。

      在borland的开发人员看来Visual Basic只是一个初级开发工具,还没有开发真正的应用系统的能力,因此,需要开发一个真正的开发工具,这个开发工具必须超越Visual Basic,能够快速编译应用程序、具有面向对象的功能、能够进行可视化开发,同时它还应该拥有新的Windows Framework组件架构,这个构架要完整的封装Windows对象。这是一个宏大的构想,borland选择了Object Pascal作为实现这个构想的基础语言,但Object Pascal是不完善的,必须对它做出做出改进,使之成为一种新语言,borland为这种新语言命名为:Delphi。

      两年以后奇迹诞生了,Delphi横空出世,整个世界都拜倒在它的脚下,一时之间“洛阳纸贵”,引发了疯狂的购买,其受欢迎的热烈程度连Borland也没有料到, Delphi全球缺货,在IT的历史上再没有其他任何开发工具能引起入如此的轰动。Delphi挽救了处于破产边缘的Borland,使Borland浴火重生。

      Delphi年谱

      Delphi发展至今,从Delphi1、Delphi2到现在的Delphi9,不断添加和改进各种特性,功能越来越强大。

     

     

    Delphi 1.0

      1995年一个开发工具中的超级明星在Borland诞生了,这就是 Delphi 1.0。在Delphi1.0中Borland放弃了OWL,取而带之的是全新的Visual Component Library,从此开始了组件(Component)技术的时代,其意义深远;Delphi1.0是完全面向对象的。它是Delphi的最早版本。

      Delphi 2.0

      Delphi2.0完成了16位到32位的跨越,提供了32位操作系统的完整支持,只能在Windows 95以上的操作系统中使用,它如同Delphi 1.0一样大获成功。

      在Delphi2.0中Borland为他增加了可视的Form的继承,并且面向对象更彻底。这大大方便了类似数据输入界面的管理,比如收款录入和付款录入界面,很多动作相同,于是可以先构造一个Form作为基类,继承下去两个甚至多个界面,相同动作写于基类中,不同的编写于子类中。由于所有函数支持"虚函数"特性,对程序编写和维护非常方便,大量类似的报表也采用了此技术。

      Delphi 2.0中,增加了Data Modules的概念,可以将数据包装在一个模块中,在系统启动时或空闲时 将它打开,这样,所有使用这些Table的模块都可以公用它,避免重复打开和关闭。并且,由于所有数据Table位于一个模块中,非常便于管理维护和迁移升级。

      Delphi 3.0

      在微软COM/DCOM技术日益成熟的情况和企业对分布式应用程序开发工具的需求下,Borland的开发人员巧妙的平衡了二者的关系,使Delphi3.0成为Windows平台的第一款提供分布式开发的开发工具。

      Delphi 4.0

      由于决策的错误,Delphi 4.0时一个不成熟的产品,其中有大量的bug,尽管Borland如也不停的发补丁,但不稳定的恶名很快在delphi用户传开, delphi4.0给delphi蒙上了阴影,也使Visual Basic有了喘息之机。

      Delphi 5.0

      在失败的Delphi4以后,Borland小心的推出了Delphi5.0,重新建立delphi的声望,delphi受到delphi开发人员一致推崇。在这个版本中Delphi对IDE(集成开发环境)进行了很多改进,扩展了对数据库的支持(ADO和InterBase数据库),带有Internet支持的MIDAS改进版,TeamSouse版本控制工具,转换功能,框架概念以及很多的新组件与新特性。

      Delphi 6.0

      Delphi 6添加了对如下特性的支持:对CLX(Component Library for Cross-Platform CLX)跨平台开发的支持,扩展的运行库(run-time library),dbExpress数据库引擎,Web 服务和杰出的XML支持,一个强大的Web开发框架,IDE的更多增强,大量的组件和类,delphi开始为向.net过渡做准备。

      Delphi 7.0

      Delphi 7是Delphi向.net过渡的产品,在照顾老的使用者的同时,Borland在其中加入了对.net 的支持,所以Delphi7可以同时编写原windows下和.net下的应用程序。2002年11月,borland为delphi7提供了修改后的vcl.net,使vcl组件可以在.net环境下使用。

      Delphi 8.0

      Delphi 8 for .NET集成开发环境提供了许多工具和特性以帮助你快速创建强大的.NET应用程序。它是为了与微软的visual studio. Net竟争而设计的。Delphi 8 for .NET已经拥有C#的能力,同时仍然保留Delphi的易用性可以,但它只是一个测试版,一个过渡版。还不太完善。

      Delphi 9.0

      Delphi9集成了starteam,caliberrm,Unit testing及Together部份的功能. 加入了inline及for in loop等功能。 它把Win32的开发工具全部整合到Delphi9中。如果Delphi9把Borland Delphi .Net、Borland Delphi Win32、Borland C#。Borland Delphi .Net For WinCE Edition集成成一个开发工具,那么,微软和Borland交锋将更加让人试目以待了。而且WinCE是未来的趋势,可以说, 微软和Borland交锋了这么多年微软的巨轮对Borland来说,一点也不可怕。而且微软要更加小心。

      结束语

      Delphi是个奇迹,它不仅挽救了Borland,而且它对对软件技术的发展也产生了深刻的影响,它开启Windows平台主从架构的改变,同时对组件技术的发展做出了巨大的贡献,直到现在它的组件技术还深刻地影响了JavaBean和.net的组件技术。总之,无论是Delphi的支持者还是微软的支持者,都不得不承认Delphi是软件开发技术发展历程中的里程碑式的产品。 

  • Web 应用系统性能测试

    2008-08-31 16:08:50

       性能测试是 Web 应用系统的一项重要质量保证措施。在现实中,很多 Web 性能测试项目由于性能测试需求定义不合理或不明确,导致性能测试项目不能达到预期目标或进度超期。本文针对 Web 应用系统的技术架构和系统使用特点,探讨如何有效实施性能测试过程,并重点介绍如何分析获得合理的性能测试需求,最终对 Web 应用系统性能进行科学、准确的评估。
     

    1、 引言
    基于Web服务器的应用系统由于提供浏览器界面而无须安装,大大降低了系统部署和升级成本,得以普遍应用。目前,很多企业的核心业务系统均是Web应用,但当Web应用的数据量和访问用户量日益增加,系统不得不面临性能和可靠性方面的挑战。因此,无论是Web应用系统的开发商或最终用户,都要求在上线前对系统进行性能,科学评价系统的性能,从而降低系统上线后的性能风险。
    在很多性能测试项目中,由于不能合理定义系统的性能测试需求,不能建立和真实环境相符的负载模型,不能科学分析性能测试结果,导致性能测试项目持续时间很长或不能真正评价系统性能并提出性能改进措施。
    本文在总结许多Web应用系统性能测试实践经验和教训的基础上,从与性能测试工具无关的角度介绍Web应用系统性能测试的方法和实施过程,以及如何定义合理的性能测试需求。
     

    1.1 术语定义
    性能测试:通过模拟大量浏览器客户端同时访问Web服务器,获得系统的性能数据。
    虚拟用户:模拟浏览器向Web服务器发送请求并接收响应的一个进程或线程。
    响应时间:浏览器向Web服务器提交一个请求到收到响应之间的间隔时间。
    思考时间:浏览器在收到响应后到提交下一个请求之间的间隔时间。
    请求成功率:Web服务器正确处理的请求数量和接收到的请求数量的比。
    吞吐量:单位时间内Web服务器成功处理的HTTP页面或HTTP请求数量。
    在线用户:用户通过浏览器访问登录Web应用系统后,并不退出该应用系统。通常一个Web应用服务器的在线用户对应Web应用服务器的一个Session。
    并发用户数:Web服务器在一段时间内为处理浏览器请求而建立的HTTP连接数或生成的处理线程数。当所有在线用户发送HTTP请求的思考时间为零时,Web服务器的并发用户数等于在线用户数。

    1.2 Web应用系统技术架构
    Web应用系统的前端为浏览器,后台为Web服务器(如Apache,Microsoft Internet Information Server),浏览器和Web服务器之间的交互基于HTTP协议。HTTP协议本身是无连接的,Web服务器通过Session机制来建立一个浏览器所发出的先后连接之间的关联。通过实验证明,当浏览器客户端在首次访问Web服务器后,如果该浏览器客户端不发送后续请求,服务器维持该浏览器客户端的Session变量所消耗的系统资源非常小。

    2、 Web应用系统性能测试过程
    标准的Web应用系统性能测试过程包括确定性能测试需求,开发性能测试脚本,定义性能测试负载模型,执行性能测试和形成性能测试报告。本章将分别介绍上述过程,并通过举例说明如何完成每一环节。
     

    2.1 确定性能测试需求
    科学定义Web应用系统性能测试需求对一个成功的性能测试非常重要。通常,Web应用系统的性能测试需求有如下两种描述方法。

    2.1.1 基于在线用户的性能测试需求
    该需求描述方法主要基于Web应用系统的在线用户和响应时间来度量系统性能。当Web应用系统在上线后所支持的在线用户数以及操作习惯(包括操作和请求之间的延迟)很容易获得,如企业的内部应用系统, 通常采用基于在线用户的方式来描述性能测试需求。以提供网上购物的Web应用系统为例,基于在线用户的性能测试需求可描述为:10个在线用户按正常操作速度访问网上购物系统的下定单功能,下定单交易的成功率是100%,而且90%的下定单请求响应时间不大于8秒;当90%的请求响应时间不大于用户的最大容忍时间20秒时,系统能支持50个在线用户。

    2.1.2 基于吞吐量的性能测试需求
    该需求描述方法主要基于Web应用系统的吞吐量和响应时间来度量系统性能。当Web应用在上线后所支持的在线用户无法确定,如基于Internet的网上购物系统,可通过每天下定单的业务量直接计算其吞吐量,从而采取基于吞吐量的方式来描述性能测试需求。以网上购物系统为例,基于吞吐量的性能测试需求可描述为:网上购物系统在每分钟内需处理10笔下定单操作,交易成功率为100%,而且90%的请求响应时间不大于8秒。

    2.2 开发性能测试脚本
    在确定Web应用系统性能测试需求后,就要根据性能测试需求中确定的功能开发性能测试脚本。比如,针对前面定义的网上购物系统的性能测试需求,将开发下定单功能的性能测试脚本。
    性能测试脚本是描述单个浏览器向Web服务器发送的HTTP请求序列。每个性能测试工具(如IBM Rational Performance Tester, LoadRunner)所提供的测试脚本语法是不同的。测试人员利用性能测试工具可从头手工编写测试脚本,也可以通过录制浏览器和Web服务器之间的网络通信数据而自动形成测试脚本。
    任何性能测试工具都不能保证录制形成的性能测试脚本的正确性,测试人员应通过在单用户下运行性能测试脚本对其正确性进行验证。测试脚本不正确的一个重要原因就是脚本的数据关联不正确,也就是并没完全建立一个测试请求和前面的响应内容之间的关联。测试脚本HTTP请求和响应之间的数据关联是否正确的一个重要标准是单用户运行脚本,脚本能完成期望的功能。
    在完成性能测试脚本的数据关联后,需要对脚本进行参数化,也就是把脚本中的某些请求数据替换成变量,变量的值来于一个独立的数据文件,从而保证在多虚拟用户运行脚本的情况下,每个虚拟用户所提交的数据是不同的。
    此外,为了测试Web应用的可靠性,还需要对请求所收到的响应进行验证(比如验证响应的HTTP返回码或验证响应的内容),便于性能测试完成后统计请求成功率。

    2.3 建立性能测试负载模型
    性能测试负载模型定义了测试工具如何向Web应用系统提交请求,包括向Web应用系统发送请求的虚拟用户数,每个虚拟用户发送请求的速度和频率。针对前面介绍的网上购物系统的性能测试需求,在性能测试工具中定义的性能测试负载模型应包括如下信息:
    虚拟用户数:性能测试不仅仅是执行一次,而且每次执行时虚拟用户数也不固定,因此在性能测试负载模型中定义的虚拟用户数将在测试执行时进行设置。
    虚拟用户发送请求的思考时间和迭代次数:虚拟用户发送请求的思考时间长短是决定Web应用系统负载量的重要因素之一,而迭代次数将决定性能测试的执行持续时间。对基于在线用户的性能测试需求,将基于录制脚本时记录的思考时间,而且由于现实中不同用户访问系统的思考时间不同,可把思考时间设置为在一定范围内的随机值。对于基于吞吐量的性能测试需求,将把思考时间设置为零,此时Web应用系统的在线用户数量将等于并发用户数。同时,为了避免性能测试压力的随机性,将增加请求的迭代次数来增加测试执行持续时间,从而获得系统在稳定压力下的性能数据。
    虚拟用户启动模式:在现实中,Web应用系统的用户不太可能同时做相同的操作,因此为了让Web应用系统所承担的压力随时间均匀分布,建议虚拟用户依次启动,同时也避免大量用户同时登录造成系统阻塞。以10个虚拟用户模拟下定单为例,可设置每个虚拟用户间隔30秒启动,这样10个虚拟用户可在5分钟后完成启动,并保证10个虚拟用户不会在同一时刻下定单,从而更符合实际情况。

    2.4 执行性能测试
    执行性能测试是指通过多次运行性能测试负载模型,获得系统的性能数据。在执行过程中,需利用测试工具、操作系统、系统软件(如Web Server或DB Server)提供的资源监控手段对资源进行监控和分析,帮助发现资源瓶颈,并在系统层面进行优化。同时,还需对应用进行性能分析,帮助定位应用代码中的性能问题,切实解决系统的性能问题。

    2.5 形成性能测试报告
    性能测试项目的最后阶段就是向相关人员提交性能测试报告,汇报性能测试结果。在向相关人员汇报性能测试结果时,并不是性能测试报告越丰富、性能数据越多越好。好的性能测试报告是能准确、简单地传递性能测试结论,而不需太多的技术细节。
    针对基于在线用户数的性能测试需求,可通过下图总结性能测试结论。其中横轴是在线用户数,纵轴是响应时间,如40在线用户访问网上购物系统时,90%的下定单请求响应时间不超过10秒。
    图一:在线用户数和响应时间时间的趋势图
    针对基于吞吐量的性能测试需求,可通过下图的曲线来描述性能测试结果。以网上购物系统为例,下图描述下定单的并发用户、下定单响应时间以及吞吐量(服务器每秒处理定单笔数)之间的关系,从而快速判断系统是否能满足性能测试需求。从下图中可看出,并发用户增加,请求的响应时间也增加。服务器的吞吐量是先随并发用户数增加而增加,当吞吐量到达一定峰值后,再增加并发用户数,吞吐量会减少。原因在于当并发用户数少时,向Web服务器提交的请求量不大,服务器处理能力还有富余,所以吞吐量逐步增大;但当并发用户数超过某一值时,由于向服务器提交的请求太多,造成服务器阻塞,反而导致吞吐量减少。
    图二:响应时间、吞吐量和并发用户数的趋势图
     
     
    3 如何获取合理的性能测试需求
    前一章介绍了Web应用系统的性能测试过程,确定性能测试需求是整个性能测试的起点和成功的重要因素。性能测试需求定义得过高,虽然确保系统上线后能满足性能需求,但可能会造成硬件资源的浪费;性能测试需求定义得过低,系统上线后可能会出现性能问题。如何通过分析系统上线后可能的用户访问行为,来获得合理的性能测试需求指标呢?
    假设现有一个基于Web的办公自动化系统(简称OA系统),该系统提供公文收发和查询功能。在部署该系统前,将对该系统进行性能测试。下面将详细介绍如何分析该OA系统的使用情况,定义合理的性能测试需求。
     

    3.1 如何获得OA系统的在线用户数量
    在线用户数量是指在特定时间区间内,有多少用户访问Web应用系统(对应到Web服务器的Session数),根据系统可能访问用户数以及每个用户访问系统的时间长短来确定。
    对于将要部署的OA系统,通过分析获得该系统有8000个注册用户,基本上所有的用户每天(8小时工作时间)都会访问OA系统,平均在线时间(从登录OA系统到退出OA系统之间的时间间隔,也可以是多次在线时间的合计)为12分钟,那么该OA系统的平均在线数(也就是Web应用Session变量数)为200个(8000 * 0.2 / 8),假设峰值在线用户数是平均在线用户数的3倍(该倍数可根据实际情况调整),则性能测试需求的在线用户数为600。

    3.2 如何确定OA系统的性能测试用例
    由于时间和资源限制,不可能对Web应用系统的所有功能进行性能测试,而是从业务的角度(如某一功能操作的用户多)和技术的角度(如某一功能虽然访问用户不多,但内部处理逻辑复杂或处理数据量大)来选择Web应用系统的特定功能作为性能测试用例。
    以OA系统为例,由于所有用户都经常公文查询功能,因此确定的性能测试用例为公文查询。

    3.3 如何确定OA系统的响应时间
    响应时间的快慢直接影响了系统使用用户的满意度,采用平均响应时间来描述系统系统性能测试需求是不科学的,因为无法直接和客户的满意度挂钩。而且,在做性能测试,如果某一请求的响应时间过长或过短,将导致平均响应时间和实际情况偏离。
    以OA系统为例,定义的响应时间需求为:90%(该百分比和要求的系统用户满意度相关)的查询请求响应时间不超过8秒(该时间可根据实际情况确定)。

    3.4 如何确定OA系统的交易吞吐量
    单位时间内Web应用系统需处理多少笔特定的交易可通过统计获得。以OA系统为例,假设每个用户每天(一天按8小时计算)平均会查询公文4次,那OA应用的Web服务器平均每分钟要能处理8000 * 4 / ( 60 * 8 ) = 66.67笔查询公文交易,考虑到峰值因素,要求每分钟能处理66.7 * 3=200笔查询公文交易。

    3.5 OA系统性能测试需求描述
    通过前面的分析,能明确定义合理的性能测试需求。OA系统性能测试需求定义如下:
    基于在线用户数的性能测试需求:600个在线用户按正常操作速度访问OA系统的查询公文功能,所有查询请求的成功率是100%,而且90%的查询请求响应时间不大于8秒。
    基于吞吐量的性能测试需求:OA系统在每分钟内需处理200笔查询公文操作,交易成功率为100%,而且90%的请求响应时间不大于8秒。
     

    4 总结
    Web应用性能测试项目成功的关键不在于性能测试工具,而在于有效的性能测试分析方法和实践。只有切实掌握性能测试需求分析方法,性能测试实践经验,才能保证一个Web应用性能测试的成功。
  • 数据库的性能优化(Oracle)

    2008-08-28 21:15:42

    一个数据库系统的生命周期可以分成设计、开发和成品三个阶段。在设计阶段进行数据库性能优化的成本最低,收益最大。在成品阶段进行数据库性能优化的成本最高,收益最小。数据库的优化可以通过对网络、硬件、操作系统、数据库参数和应用程序的优化来进行。最常见的优化手段就是对硬件的升级。据统计,对网络、硬件、操作系统、数据库参数进行优化所获得的性能提升,全部加起来只占数据库系统性能提升的40%左右,其余的60%系统性能提升来自对应用程序的优化。许多优化专家认为,对应用程序的优化可以得到80%的系统性能的提升。

    一、数据库性能的优化

    数据库设计是应用程序设计的基础,其性能直接影响应用程序的性能。数据库性能包括存储空间需求量的大小和查询响应时间的长短两个方面。为了优化数据库性能,需要对数据库中的表进行规范化。规范化的范式可分为第一范式、第二范式、第三范式、BCNF范式、第四范式和第五范式。一般来说,逻辑数据库设计会满足规范化的前3级标准,但由于满足第三范式的表结构容易维护且基本满足实际应用的要求。因此,实际应用中一般都按照第三范式的标准进行规范化。但是,规范化也有缺点:由于将一个表拆分成为多个表,在查询时需要多表连接,降低了查询速度。

    由于规范化有可能导致查询速度慢的缺点,考虑到一些应用需要较快的响应速度,在设计表时应同时考虑对某些表进行反规范化。反规范化可以采用以下几种方法:

    1. 分割表

    分割表包括水平分割和垂直分割。

    水平分割是按照行将一个表分割为多个表,这可以提高每个表的查询速度,但查询、更新时要选择不同的表,统计时要汇总多个表,因此应用程序会更复杂。

    垂直分割是对于一个列很多的表,若某些列的访问频率远远高于其它列,就可以将主键和这些列作为一个表,将主键和其它列作为另外一个表。通过减少列的宽度,增加了每个数据页的行数,一次I/O就可以扫描更多的行,从而提高了访问每一个表的速度。但是由于造成了多表连接,所以应该在同时查询或更新不同分割表中的列的情况比较少的情况下使用。

    2. 保留冗余列

    当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的列,以避免表之间的连接过于频繁。由于对冗余列的更新操作必须对多个表同步进行,所以一般在冗余列的数据不经常变动的情况下使用。

    3. 增加派生列

    派生列是由表中的其它多个列计算所得,增加派生列可以减少统计运算,在数据汇总时可以大大缩短运算时间。

    二、应用程序性能的优化

    应用程序的优化通常可分为两个方面:源代码和SQL语句。由于涉及到对程序逻辑的改变,源代码的优化在时间成本和风险上代价很高,而对数据库系统性能的提升收效有限,因此应用程序的优化应着重在SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就行,而是要写出高质量的SQL语句,提高系统的可用性。

    下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。

    1. IS NULL 与 IS NOT NULL

    不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。

    任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。

    2. 联接列

    对于有联接的列,即使最后的联接值为一个静态值,优化器不会使用索引的。例如,假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫乔治•布什(George Bush)的职工。 下面是一个采用联接查询的SQL语句:

    select * from employee where first_name||''||last_name ='George Bush';

    上面这条语句完全可以查询出是否有George Bush这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。

    当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引:

    Select * From employee where first_name ='George' and last_name ='Bush';

    遇到下面这种情况又如何处理呢?如果一个变量(name)中存放着George Bush这个员工的姓名,对于这种情况我们又如何避免全程遍历使用索引呢?可以使用一个函数,将变量name中的姓和名分开就可以了,但是有一点需要注意,这个函数是不能作用在索引列上。下面是SQL查询脚本:

    select * from employee where first_name = SUBSTR('&&name',1,INSTR('&&name',' ')-1)

    and last_name = SUBSTR('&&name',INSTR('&&name’,' ')+1) ;

    3. 带通配符(%)的like语句

    同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工表中查询名字中包含Bush的人。可以采用如下的查询SQL语句:

    select * from employee where last_name like '%Bush%';

    这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。例如,在下面的查询中索引得到了使用:

    select * from employee where last_name like 'c%';

    4. Order by语句

    Order by语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。

    仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。

    5. NOT

    我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:

    ... where not (status ='VALID')

    如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例:

    ... where status <>'INVALID';

    再看下面这个例子:

    select * from employee where salary<>3000;

    对这个查询,可以改写为不使用NOT的语句:

    select * from employee where salary<3000 or salary>3000;

    虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。

    6. IN和EXISTS

    有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询。在where子句中可以使用两种格式的子查询。

    第一种格式是使用IN操作符: ... where column in(select * from ... where ...);

    第二种格式是使用EXIST操作符: ... where exists (select 'X' from ...where ...);

    绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第一种格式的效率高。在Oracle中可以将几乎所有的IN操作符子查询改写为使用EXISTS的子查询。

    第二种格式中,子查询以‘select 'X'’开始。运用EXISTS子句不管子查询从表中抽取什么数据它只查看where子句。这样优化器就不必遍历整个表而仅根据索引就可完成工作(这里假定在where语句中使用的列存在索引)。相对于IN子句来说,EXISTS使用相连子查询,构造起来要比IN子查询困难一些。

    通过使用EXISTS,Oracle系统会首先检查主查询,然后运行子查询直到找到第一个匹配项,这就节省了时间。Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。

    同时应尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(不能使用索引而降低速度),但NOT EXISTS要比NOT IN查询效率更高。

  • 数据库的性能优化(SQLServer)

    2008-08-28 21:08:35

          设计一个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事。在开发工具、数据库设计、应用程序的结构、查询设计、接口选择等方面有多种选择,这取决于特定的应用需求以及开发队伍的技能。本文以SQL Server为例,从后台数据库的角度讨论应用程序性能优化技巧,并且给出了一些有益的建议。

    1 数据库设计

    要在良好的SQL Server方案中实现最优的性能,最关键的是要有1个很好的数据库设计方案。在实际工作中,许多SQL Server方案往往是由于数据库设计得不好导致性能很差。所以,要实现良好的数据库设计就必须考虑这些问题。

    1.1 逻辑库规范化问题

    一般来说,逻辑数据库设计会满足规范化的前3级标准:

    1.第1规范:没有重复的组或多值的列。

    2.第2规范:每个非关键字段必须依赖于主关键字,不能依赖于1个组合式主关键字的某些组成部分。

    3.第3规范:1个非关键字段不能依赖于另1个非关键字段。

    遵守这些规则的设计会产生较少的列和更多的表,因而也就减少了数据冗余,也减少了用于存储数据的页。但表关系也许需要通过复杂的合并来处理,这样会降低系统的性能。某种程度上的非规范化可以改善系统的性能,非规范化过程可以根据性能方面不同的考虑用多种不同的方法进行,但以下方法经实践验证往往能提高性能。

    1.如果规范化设计产生了许多4路或更多路合并关系,就可以考虑在数据库实体(表)中加入重复属性(列)。

    2.常用的计算字段(如总计、最大值等)可以考虑存储到数据库实体中。

    比如某一个项目的计划管理系统中有计划表,其字段为:项目编号、年初计划、二次计划、调整计划、补列计划…,而计划总数(年初计划+二次计划+调整计划+补列计划)是用户经常需要在查询和报表中用到的,在表的记录量很大时,有必要把计划总数作为1个独立的字段加入到表中。这里可以采用触发器以在客户端保持数据的一致性。

    3.重新定义实体以减少外部属性数据或行数据的开支。相应的非规范化类型是:

    (1)把1个实体(表)分割成2个表(把所有的属性分成2组)。这样就把频繁被访问的数据同较少被访问的数据分开了。这种方法要求在每个表中复制首要关键字。这样产生的设计有利于并行处理,并将产生列数较少的表。

    (2)把1个实体(表)分割成2个表(把所有的行分成2组)。这种方法适用于那些将包含大量数据的实体(表)。在应用中常要保留历史记录,但是历史记录很少用到。因此可以把频繁被访问的数据同较少被访问的历史数据分开。而且如果数据行是作为子集被逻辑工作组(部门、销售分区、地理区域等)访问的,那么这种方法也是很有好处的。

    1.2 生成物理数据库

    要想正确选择基本物理实现策略,必须懂得数据库访问格式和硬件资源的操作特点,主要是内存和磁盘子系统I/O。这是一个范围广泛的话题,但以下的准则可能会有所帮助。

    1.与每个表列相关的数据型应该反映数据所需的最小存储空间,特别是对于被索引的列更是如此。比如能使用smallint类型就不要用integer类型,这样索引字段可以被更快地读取,而且可以在1个数据页上放置更多的数据行,因而也就减少了I/O操作。

    2.把1个表放在某个物理设备上,再通过SQL Server段把它的不分簇索引放在1个不同的物理设备上,这样能提高性能。尤其是系统采用了多个智能型磁盘控制器和数据分离技术的情况下,这样做的好处更加明显。

    3.用SQL Server段把一个频繁使用的大表分割开,并放在2个单独的智能型磁盘控制器的数据库设备上,这样也可以提高性能。因为有多个磁头在查找,所以数据分离也能提高性能。

    4.用SQL Server段把文本或图像列的数据存放在1个单独的物理设备上可以提高性能。1个专用的智能型的控制器能进一步提高性能。

    2 与SQL Server相关的硬件系统

    与SQL Server有关的硬件设计包括系统处理器、内存、磁盘子系统和网络,这4个部分基本上构成了硬件平台,Windows NT和SQL Server运行于其上。

    2.1 系统处理器(CPU)

    根据自己的具体需要确定CPU结构的过程就是估计在硬件平台上占用CPU的工作量的过程。从以往的经验看,CPU配置最少应是1个80586/100处理器。如果只有2~3个用户,这就足够了,但如果打算支持更多的用户和关键应用,推荐采用Pentium Pro或PⅡ级CPU。

    2.2 内存(RAM)

    为SQL Server方案确定合适的内存设置对于实现良好的性能是至关重要的。SQL Server用内存做过程缓存、数据和索引项缓存、静态服务器开支和设置开支。SQL Server最多能利用2GB虚拟内存,这也是最大的设置值。还有一点必须考虑的是Windows NT和它的所有相关的服务也要占用内存。

    Windows NT为每个WIN32应用程序提供了4GB的虚拟地址空间。这个虚拟地址空间由Windows NT虚拟内存管理器(VMM)映射到物理内存上,在某些硬件平台上可以达到4GB。SQL Server应用程序只知道虚拟地址,所以不能直接访问物理内存,这个访问是由VMM控制的。Windows NT允许产生超出可用的物理内存的虚拟地址空间,这样当给SQL Server分配的虚拟内存多于可用的物理内存时,会降低SQL Server的性能。

    这些地址空间是专门为SQL Server系统设置的,所以如果在同一硬件平台上还有其它软件(如文件和打印共享,应用程序服务等)在运行,那么应该考虑到它们也占用一部分内存。一般来说硬件平台至少要配置32MB的内存,其中,Windows NT至少要占用16MB。1个简单的法则是,给每一个并发的用户增加100KB的内存。例如,如果有100个并发的用户,则至少需要32MB+100用户*100KB=42MB内存,实际的使用数量还需要根据运行的实际情况调整。可以说,提高内存是提高系统性能的最经济的途径。

    2.3 磁盘子系统

    设计1个好的磁盘I/O系统是实现良好的SQL Server方案的一个很重要的方面。这里讨论的磁盘子系统至少有1个磁盘控制设备和1个或多个硬盘单元,还有对磁盘设置和文件系统的考虑。智能型SCSI-2磁盘控制器或磁盘组控制器是不错的选择,其特点如下:

    (1)控制器高速缓存。

    (2)总线主板上有处理器,可以减少对系统CPU的中断。

    (3)异步读写支持。

    (4)32位RAID支持。

    (5)快速SCSI—2驱动。

    (6)超前读高速缓存(至少1个磁道)。

    3 检索策略

    在精心选择了硬件平台,又实现了1个良好的数据库方案,并且具备了用户需求和应用方面的知识后,现在应该设计查询和索引了。有2个方面对于在SQL Server上取得良好的查询和索引性能是十分重要的,第1是根据SQL Server优化器方面的知识生成查询和索引;第2是利用SQL Server的性能特点,加强数据访问操作。

    3.1 SQL Server优化器

    MicrOSoft SQL Server数据库内核用1个基于费用的查询优化器自动优化向SQL提交的数据查询操作。数据操作查询是指支持SQL关键字WHERE或HAVING的查询,如SELECT、DELETE和UPDATE。基于费用的查询优化器根据统计信息产生子句的费用估算。

    了解优化器数据处理过程的简单方法是检测SHOWPLAN命令的输出结果。如果用基于字符的工具(例如isql),可以通过键入SHOW SHOWPLAN ON来得到SHOWPLAN命令的输出。如果使用图形化查询,比如SQL Enterprise Manager中的查询工具或isql/w,可以设定配置选项来提供这一信息。

    SQL Server的优化通过3个阶段完成:查询分析、索引选择、合并选择。

    1.查询分析

    在查询分析阶段,SQL Server优化器查看每一个由正规查询树代表的子句,并判断它是否能被优化。SQL Server一般会尽量优化那些限制扫描的子句。例如,搜索和/或合并子句。但是不是所有合法的SQL语法都可以分成可优化的子句,如含有SQL不等关系符“<>”的子句。因为“<>”是1个排斥性的操作符,而不是1个包括性的操作符,所在扫描整个表之前无法确定子句的选择范围会有多大。当1个关系型查询中含有不可优化的子句时,执行计划用表扫描来访问查询的这个部分,对于查询树中可优化的SQL Server子句,则由优化器执行索引选择。

    2.索引选择

    对于每个可优化的子句,优化器都查看数据库系统表,以确定是否有相关的索引能用于访问数据。只有当索引中的列的1个前缀与查询子句中的列完全匹配时,这个索引才被认为是有用的。因为索引是根据列的顺序构造的,所以要求匹配是精确的匹配。对于分簇索引,原来的数据也是根据索引列顺序排序的。想用索引的次要列访问数据,就像想在电话本中查找所有姓为某个姓氏的条目一样,排序基本上没有什么用,因为你还是得查看每一行以确定它是否符合条件。如果1个子句有可用的索引,那么优化器就会为它确定选择性。

    所以在设计过程中,要根据查询设计准则仔细检查所有的查询,以查询的优化特点为基础设计索引。

    (1)比较窄的索引具有比较高的效率。对于比较窄的索引来说,每页上能存放较多的索引行,而且索引的级别也较少。所以,缓存中能放置更多的索引页,这样也减少了I/O操作。

    (2)SQL Server优化器能分析大量的索引和合并可能性。所以与较少的宽索引相比,较多的窄索引能向优化器提供更多的选择。但是不要保留不必要的索引,因为它们将增加存储和维护的开支。对于复合索引、组合索引或多列索引,SQL Server优化器只保留最重要的列的分布统计信息,这样,索引的第1列应该有很大的选择性。

    (3)表上的索引过多会影响UPDATE、INSERT和DELETE的性能,因为所有的索引都必须做相应的调整。另外,所有的分页操作都被记录在日志中,这也会增加I/O操作。

    (4)对1个经常被更新的列建立索引,会严重影响性能。

    (5)由于存储开支和I/O操作方面的原因,较小的自组索引比较大的索引性能更好一些。但它的缺点是要维护自组的列。

    (6)尽量分析出每一个重要查询的使用频度,这样可以找出使用最多的索引,然后可以先对这些索引进行适当的优化。

    (7)查询中的WHERE子句中的任何列都很可能是个索引列,因为优化器重点处理这个子句。

    (8)对小于1个范围的小型表进行索引是不划算的,因为对于小表来说表扫描往往更快而且费用低。

    (9)与“ORDER BY”或“GROUP BY”一起使用的列一般适于做分族索引。如果“ORDER BY”命令中用到的列上有分簇索引,那么就不会再生成1个工作表了,因为行已经排序了。“GROUP BY”命令则一定产生1个工作表。

    (10)分簇索引不应该构造在经常变化的列上,因为这会引起整行的移动。在实现大型交易处理系统时,尤其要注意这一点,因为这些系统中数据往往是频繁变化的。

    3.合并选择

    当索引选择结束,并且所有的子句都有了一个基于它们的访问计划的处理费用时,优化器开始执行合并选择。合并选择被用来找出一个用于合并子句访问计划的有效顺序。为了做到这一点,优化器比较子句的不同排序,然后选出从物理磁盘I/O的角度看处理费用最低的合并计划。因为子句组合的数量会随着查询的复杂度极快地增长,SQL Server查询优化器使用树剪枝技术来尽量减少这些比较所带来的开支。当这个合并选择阶段结束时,SQL Server查询优化器已经生成了1个基于费用的查询执行计划,这个计划充分利用了可用的索引,并以最小的系统开支和良好的执行性能访问原来的数据。

    3.2 高效的查询选择

    从以上查询优化的3个阶段不难看出,设计出物理I/O和逻辑I/O最少的方案并掌握好处理器时间和I/O时间的平衡,是高效查询设计的主要目标。也就是说,希望设计出这样的查询:充分利用索引、磁盘读写最少、最高效地利用了内存和CPU资源。

    以下建议是从SQL Server优化器的优化策略中总结出来的,对于设计高效的查询是很有帮助的。

    1.如果有独特的索引,那么带有“=”操作符的WHERE子句性能最好,其次是封闭的区间(范围),再其次是开放的区间。

    2.从数据库访问的角度看,含有不连续连接词(OR和IN)的WHERE子句一般来说性能不会太好。所以,优化器可能会采用R策略,这种策略会生成1个工作表,其中含有每个可能匹配的执行的标识符,优化器把这些行标志符(页号和行号)看做是指向1个表中匹配的行的“动态索引”。优化器只需扫描工作表,取出每一个行标志符,再从数据表中取得相应的行,所以R策略的代价是生成工作表。

    3.包含NOT、<>、或! =的WHERE子句对于优化器的索引选择来说没有什么用处。因为这样的子句是排斥性的,而不是包括性的,所以在扫描整个原来数据表之前无法确定子句的选择性。

    4.限制数据转换和串操作,优化器一般不会根据WHERE子句中的表达式和数据转换式生成索引选择。例如:

    paycheck * 12>36000 or subSTring(lAStname,1,1)=“L”

    如果该表建立了针对paycheck和lastname的索引,就不能利用索引进行优化,可以改写上面的条件表达式为:

    paycheck<36000/12 or lastname like “L%”

    5.WHERE子句中的本地变量被认为是不被优化器知道和考虑的,例外的情况是定义为储备过程输入参数的变量。

    6.如果没有包含合并子句的索引,那么优化器构造1个工作表以存放合并中最小的表中的行。然后再在这个表上构造1个分簇索引以完成一个高效的合并。这种作法的代价是工作表的生成和随后的分族索引的生成,这个过程叫REFORMATTING。  所以应该注意RAM中或磁盘上的数据库tempDB的大小(除了SELECT INTO语句)。另外,如果这些类型的操作是很常见的,那么把tempdb放在RAM中对于提高性能是很有好处的。

    4 性能优化的其他考虑

    上面列出了影响SQL Server的一些主要因素,实际上远不止这些。操作系统的影响也很大,在Windows NT下,文件系统的选择、网络协议、开启的服务、SQL Server的优先级等选项也不同程度上影响了SQL Server的性能。

    影响性能的因素是如此的多,而应用又各不相同,找出1个通用的优化方案是不现实的,在系统开发和维护的过程中必须针对运行的情况,不断加以调整。事实上,绝大部分的优化和调整工作是在与客户端独立的服务器上进行的,因此也是现实可行的。

722/4<1234>
Open Toolbar