发布新日志

  • 操作系统概论(总结)

    2007-06-14 11:45:35

    在本篇笔记中,关于操作系统的很多术语目前不需要太了解,只要对操作系统的概念和认识有个总体把握就可以了,在笔记的结尾以Windows2000个人计算机操作系统为例,使之对操作系统的功能、结构有进一步的认识。

    操作系统的概念


            让我们先从计算机系统开始,接着引入操作系统。

            计算机系统是一种可以按用户的要求接收和存储信息、自动进行数据处理并输出结果信息的系统. 计算机系统包括硬件子系统和软件子系统。硬件系统是计算机赖以工作的实体,它包括中央处理器(CPU)、主存储器、外存储器以及各种类型的输入输出设备;软件系统则保证了计算机系统按用户指定的要求协调地工作,它包括各种程序和数据;这两个部分又构成了计算机系统的资源,各个程序及各用户对计算机资源的要求和使用是不同的,适当的控制和协调计算机资源的分配是必要的。
            由此,我们引入了操作系统:在计算机系统中,集中了资源管理功能和控制程序执行功能的一种软件,称为操作系统。

    操作系统的特点

    1.  并发性:计算机系统中存在若干个运行的程序,从宏观上看,这些程序在同时向前推进。注意并行性和并发性这两个概念的区别:并行性是指两个或多个事件在同一时刻发生(微观概念),而并发性是指两个或多个事件在同一时间的间隔内发生(宏观概念)。
    2.  共享性:操作系统程序与多个用户程序共用系统中的各种资源:中央处理器,内外存储器,外部设备等。共享的两种形式:互斥共享和同时共享。
    3.  随机性:操作系统的运行是在随机的环境下运行的。这种随机环境的含义是:操作系统不可能对所运行的程序的行为以及硬件设备的情况作出任何事先的假定。


    对操作系统本质的不同观点


          由于对操作系统本质的不同观点,将会影响操作系统的设计思想。对操作系统的几种观点如下: 

    1.  软件的观点,将操作系统以软件的形式来学习和研究,但要注意的是它又具有一般应用软件不具备的特殊结构。


    2.  资源管理的观点,操作系统就是要负责用户和系统程序更有效的使用和协调计算机系统的各个资源(硬件和软件资源)。


    3.  进程的观点,可以简单的认为进程是运行中的程序,每个进程都完成某一特定的任务,可以是系统任务,也可以来自用户提交的作业任务。依据这种观点,主要侧重于分析系统各部分的并行工作,并处理和管理任务相互之间的关系。


    4.  虚拟器的观点,在操作系统的支持下将原来的计算机(裸机)扩充为功能强的计算机系统,我们把这种计算机系统称为虚拟计算机。操作系统的全部功能,包括系统调用/命令/作业控制语言等,统称为操作系统虚拟器。可以将操作系统再分解为若干层次,每个层次完成特定的功能,从而构成一个虚机器,并为上层提供支持。通过逐个层次扩充并最终完成整个操作系统虚拟器的构造。


    5.  服务提供者的观点,操作系统提供了一系列的功能和便利的工作环境为用户服务,所以可以把操作系统看作是服务提供者。在严格时间范围内,对外部请求做出反应,系统具有高度可靠性。


      操作系统的分类

      批处理操作系统
      基本工作方式:用户将作业交给系统操作员,系统操作员收到作业后,并不立即将作业输入计算机,而是在收到一定数量的用户作业后,组成一批作业,再把这批作业输入到计算机中进行批处理。
       早期的批处理监控程序不具备并发功能,为了提高硬件资源利用率,主要通过假脱机(SPOOLing)技术实现了真正并发机制的多道批处理系统:即在内存中同时保持多个作业,主机可以以交替的方式同时处理多个作业。
        分时系统
            为弥补批处理方式不能提供交互式快速服务的缺点而发展起来的。
            基本工作方式:一台计算机主机连接了若干个终端,每个终端可由一个用户使用,用户通过终端交互式地向系统提出命令请求,系统接受 用户命令后,采用时间片轮转的方式处理服务请求,并通过交互方式在终端上向用户显示结果。用户根据系统送回的处理结果发出下一道交互命令。
    分时操作系统具有多路性、交互性、独占性和及时性的特点。
            典型的UNIX操作系统结合了分时系统和批处理系统的特点。
            在通用操作系统中,对于分时与批处理的处理原则是:分时优先,批处理在后。并且一般把系统的分时和批处理运行状态称称为前台和后台,前台作业主要处理来自终端用户的、交互式的、比较小的且需要及时处理的作业;后台作业主要处理运行时间较长、要调用其他外部设备的、大型的无需终端用户干预的,且不需要立即处理的作业。

            实时操作系统主要有两大类:硬实时系统和软实时系统。硬实时系统在事件处理时对时间有极严格要求,而软实时系统在事件处理中仅是一定时间范围的要求。

      个人计算机操作系统(Personal Computer Operating System)
            主要供个人使用,在某一时间内为单个用户服务,采用图形界面人机交互方式,界面友好,使用方便,用户无需专门知识,也能熟练地操纵系统。


      网络操作系统
            基于计算机网络的、在各种计算机操作系统之上按网络体系结构协议标准设计开发的软件,它包括网管理、通全、安全、资源共享和各种网络应用。


      分布式操作系统
            将大量的计算机通过网络连结在一起,以获得极高的运算能力及广泛的数据共享。
            与网络操作系统一样,同样基于计算机网络,但与网络操作系统不同在于:连结在网络上的各计算机采用统一的操作系统,且分布式操作系统淡化了所访问资源的位置,即网络的概念在应用层被淡化了,而网络操作系统对资源的访问就必须显示的指明资源的位置和类型。


    学习体会
            让我们看一下windows2000个人计算机操作系统(兼有分布式操作系统的功能),它对资源管理、进程调度、虚拟器分层做得可是一点不差。
            进一步考察windows2000操作系统的分层,划分一下:用户界面,应用程序,作业管理,文件管理,输入输出(I/O)管理,进程通信,存储管理,处理器管理,到最后对各硬件设备的操作。
            Windows2000操作系统在与用户程序交互的同时,比如你打开一个word处理程序,你是否想过系统作了些什么呢?开始时系统需要为word处理程序进行存储资源的分配,然后就是进程的管理,还有要将你处理完成的结果输出到各种各样的外部设备,要知道我们的word处理程序随时可能会崩溃,系统还需要有极强的容错性和稳定性,能够避免由于应用程序的不稳定,而影响整个应用程序的不稳定,Windows2000操作系统对上述问题都提供了相应的解决方案。

  • 基本排序的几种算法总结

    2007-06-14 11:42:31

    基本排序的几种算法总结

    字体:        | 上一篇 下一篇 | 打印

    #include <stdio.h>
    #include <time.h>
    #include<stdlib.h>
    #include<dos.h>
    #define n 10000
    typedef int keytype;
    typedef struct{
        keytype key;
      }rectype;//待排序的文件的记录类型
    typedef rectype seqlist[n+1];
    seqlist r;
    int m;
    main()//主程序
      {
      int i,j;

      //选择一种数据输入形式
      printf("1---random data\n");
      printf("2---inscre data\n");
      printf("3---descre data\n");
      printf("4---input data\n");
      scanf("%d",&j);
      if (j==1) randoming();//产生一组随机数据

      if (j==2)//产生一组递增序列
       for (m=1;m<=n;m++)
        r[m].key=m;

      if (j==3)//产生一组递减序列
       for(m=1;m<=n;m++)
        r[m].key=n-m+1;

      if (j==4){//由用户自己输入数据序列,设这组数据中不含0,以0作为结束
        printf("please input the sort data:(end of 0)\n");
        r[0].key=1;
        m=0;
        while((m<=n)&&(r[m].key)){
          m++;
          scanf("%d",&(r[m].key));
         }//end of while
        m--;
       }//end of if

      printf("1-----insertsort\n");
      printf("2-----bubblesort\n");
      printf("3-----selectsort\n");
      printf("4-----quicksort\n");
      printf("5-----heapsort\n");
      scanf("%d",&j);

      //输出排序前的序列
      printf("the source data:\n");
      for(i=1;i<=m;i++)
       printf("%d ",r[i].key);
      printf("\n");

      //选择一种方法进行排序
      if (j==1) insertsort(m);//直接插入排序
      if (j==2) bubblesort(m);//冒泡排序
      if (j==3) selectsort(m);//直接选择排序
      if (j==4) quicksort(1,m);//快速排序
      //if (j==5) heapsort(m);//堆排序

      //以下输出排序结果
      printf("the answer data:\n");
      for(i=1;i<=m;i++)
        printf("%d ",r[i].key);
     }//end of main


     insertsort(int m)
      {//直接插入排序
       int i,j;
       for(i=2;i<=m;i++)
        if (r[i].key<r[i-1].key){
          r[0].key=r[i].key;j=i-1;
          do{
             r[j+1].key=r[j].key;
             j--;
           }while (r[0].key<r[j].key);
          r[j+1].key=r[0].key;
         }//end of if
      }//end of insertsort

     bubblesort(int m){
       //冒泡排序
       int i,j;
       int exchange;
       for(i=1;i<m;i++){
         exchange=0;//设置未交换过标记
         for(j=m-1;j>=1;j--)
          if(r[j+1].key<r[j].key){//若逆序
            r[0].key=r[j+1].key;//以r[0]为辅助空间交换
            r[j+1].key=r[j].key;
            r[j].key=r[0].key;
            exchange=1;//设置做过交换标志
           }//end of if
         if (!exchange) return;
        }//end of for
      }//end of bubblesort

     selectsort(int m)
       {//直接选择排序
        int i,j,k;
        for(i=1;i<m;i++){
          k=i;
          for(j=i+1;j<=m;j++)//在无序区r[j..m]中查找最小关键字位置k
           if(r[j].key<r[k].key)
             k=j;
          if (k!=i){//若k<>i,则交换,扩大有序区
            r[0].key=r[i].key;
            r[i].key=r[k].key;
            r[k].key=r[0].key;
           }//end of if
         }//end of for
       }//end of selectsort

     quicksort(int low,int high)
      {//对r[low..high]进行快速排序
       int pivotpos;
       if(low<high){
        pivotpos=partition(low,high);//对r[low..high]进行一次快速排序,
                //以pivotpos为划分点,分成两个无序区r[low..pivotpos-1]和r[pivotpos+1..high]
            quicksort(low,pivotpos-1);//对r[low..pivotpos-1]进行快速排序
         quicksort(pivotpos+1,high);//对r[pivotpos+1..high]进行快速排序
        }//end of if
        }//end of quicksort
  • 综合设计测试用例

    2007-06-14 11:41:16

    1.测试方法的综合策略:
            1)  在任何情况下都必须使用边界值分析方法,经验表明用这种方法设计出测试用例发现程序错误的能力最强。
            2)  必要时用等价类划分方法补充一些测试用例
            3)  用错误推测法再追加一些测试用例。
            4)  对照程序逻辑,检查已设计出的测试用例的逻辑覆盖程度,如果没有达到要求的覆盖标准,应当再补充足够的测试用例。
            5)  如果程序的功能说明中含有输入条件的组合情况,则一开始就可选用因果图法。


    2.测试用例的设计步骤
            1)  构造根据设计规格得出的基本功能测试用例;
            2)  边界值测试用例;
            3)  状态转换测试用例;
            4)  错误猜测测试用例;
            5)  异常测试用例;
            6)  性能测试用例;
            7)  压力测试用例。


    3.优化测试用例的方法
            1)  利用设计测试用例的8种方法不断的对测试用例进行分解与合并;
            2)  在测试时利用发散思维构造测试用例。

  • QQ最新版本如何显示输入状态?

    2007-06-14 11:30:03

    QQ2006正式版还有一个大的更新,那就QQ最新版本如何显示输入状态?

    是支持显示输入状态功能,可以看到好友是否正在输入信息,该功能在MSN等聊天工具上早就实现了,现在QQ在广大网友的要求下,终于也把其加入到了QQ2006正式版中。要使用该功能,需打开QQ设置窗口,然后点击“显示状态”标签,在打开的窗口中选中“显示我的输入状态”前的复选框(如图10),点击确定保存。

     

    首发!QQ2006正式版试用 新增输入状态显示
    2006年12月01日 星期五 21:05

    千呼万唤始出来,直到2006年即将过去了,腾讯才发布其QQ2006正式版,这一点与以前几个版本相比起来,速度慢了许多。不过今天QQ2006正式版终于发布了,笔者在第一下时间下载且进行了试用,下面就让笔者带领大家一起来看一下QQ2006正式版具有哪些新功能吧。

      一、下载及安装QQ2006正式版

      现在腾讯还没有正式发布QQ2006正式版,你如果想使用QQ2006正式版,需要首先登录到腾讯体验中心进行申请,待填写完申请表后,就可以得到腾讯QQ2006正式版的下载地址了。

      下载完成后,安装程序为18.2MB,比上个版本的安装程序(20MB)小了一点点,这应该是腾讯第一次高版本安装程序低于低版本吧,看来广大网友的呼声还是起到了不少作用。

      程序的安装过程非常简单,只要使用“下一步”大法即可安装完成,但笔者要提醒大家的,在安装过程时会默认安装“中文搜搜”与“旋风下载”两个软件(如图1),如果你不想安装这两个软件,可以把前面的两个勾选去除。

    图1 默认安装两个软件

      安装完成登录后,打开关于窗口(如图2),可以看到版本为QQ2006正式版(试用)V06.0.200.262,相信待官方正式发布后,才会去除“试用”两个字。

    二、界面的变化

      在登录窗口输入你的QQ号与密码,即可看到熟悉的QQ主界面了,不过新版QQ主界面有一些小小的变动(如图3)。

    图3 左侧为QQ2006正式版,右侧QQ2006 Beta3

      QQ2006正式版好友列表上方有一个“到论坛反馈问题”的链接,这样当你发现新版有什么问题的时候,可以方便的点击,直接到QQ官方论坛反馈。新版QQ安装完成后,左侧默认只是加载了几个常用的标签,而在QQ2006 Beta3版中,加载了多个标签,这样方便了用户,同时减少了系统资源。另外在新版QQ主界面上少了“QQ小秘书”按钮,可见在新版中,腾讯把一些不常用的按钮都给去除了。

      把鼠标移到好友的头像像上,会弹出TIPS窗口,在新版中TIPS窗口中增加了VIP等级显示,另外如果好友同时开通了拍拍与QQ空间两项服务,会在TIPS窗口中用两个标签分别显示,解决了不少空间(如图4)。

    图4 TIPS窗口的变化

      新版QQ2006 正式版的设置主界面也有不小的变化,在个人资料窗口中,增加了会员阶段的显示,同时原来的显示地址位置与正在收听的音乐功能,单独放到了状态显示标签中,取而代之的是否“始终显示个性签名”选项(如图5)

    图5 设置主界面

      评论:新版QQ主界面发生了不小的变化,无论是软件主界面、TIPS窗口还是设置窗口,都变得更加清爽,同时用户更容易查看、设置,对于一些很少用的功能按钮进行了优化,除的软件占用资源减少了很多。三、安全中心更加安全

      面对现在网上越来越多的盗号现像,腾讯在新版QQ2006中对其安全问题进行了全面的改进,首先在菜单中加入了“在线查杀木马”的链接入口,只要占击该链接,马上可以打开腾讯拓线查杀木马页面,对机器进行查杀,保证用户的安全(如图6)。另外还可以通过安全中心菜单,直接打开申请密码保护、举报恶意行为的页面及快速进入安全设置窗口。

    图6 安全中心菜单

      为防止QQ病毒发送恶意网站链接,当好友向你发送一个网址的时候,把鼠标移动到该网址上,就会显示出是打开来源可靠网址的提示(如图7),如果你认为该网址没有问题,只要点击“打开网址”即可使用默认的浏览器打开该地址,如果你认为该网址有问题,只要点击“举报”链接,即可把当前网址向腾讯官方举报。

    图7 网址安全提示

      评论:当前QQ的安全问题越来越严重,经常出现QQ号码被盗或是QQ币被盗的现像,新版QQ2006正式版在木马的查杀及打开网址方面,都做了进一步的加强,同时对QQ登录输入密码也进行了优化,使其更加安全。四、更贴心的功能设置

      使用QQ2006正式版后,在你登录QQ时,无论是会员还是非会员,都会弹出一个登录窗口,在这里用登录地理位置地址取代了原来的IP地址,同时可以显示出你上次登录的时间及本次登录的地址(如图8)。

    图8 登录提示窗口

      另外点击下面的“会员专区”链接,可以打开QQ会同专区窗口,方便会员设置各项服务,点击“号码管理”链接,直接打开腾讯的号码管理页面,在这里可以方便的设置密码保护,修改密码等。点击设置链钮,直接打开QQ设置窗口,方便用户对其登录方式进行设置。

      另外在使用QQ2006正式版的时候,第一次好友向你传送文件时,你如果点击“另存为”链接,则会弹出一个设置窗口,询问是否把当前目录设置为QQ接收文件时的默认保存目录(如图9),这样可以大大方便用户管理接收的文件。

    图9 设置接收文件默认目录

      QQ2006正式版还有一个大的更新,那就是支持显示输入状态功能,可以看到好友是否正在输入信息,该功能在MSN等聊天工具上早就实现了,现在QQ在广大网友的要求下,终于也把其加入到了QQ2006正式版中。要使用该功能,需打开QQ设置窗口,然后点击“显示状态”标签,在打开的窗口中选中“显示我的输入状态”前的复选框(如图10),点击确定保存。

    图10 设置显示输入状态

      当你与好友聊天的时候,可以在聊天窗口状态栏里显示好友正在输入的状态,同时还可以看到头像图标上有一个笔正在写的动画,非常形像(如图11)。通过该功能,就可以知道自己的好友MM是否在与你专心的聊天了。

    图11 好友正在输入状态

      不过要想使用该功能,需双方使用了最新版的QQ2006正式版,且并方设置了显示输入状态后方可。

      评论:QQ2006正式版在功能设置上,还是遁循了方便用户的原则,把一些相关的设置汇总到一个标签项中,使用户更容易操作。五、更小的资源占用

      系统资源占用问题一直是大家讨论的焦点,那么QQ2006正式版占用资源情况怎么样呢?笔者对其进行测试,当登录QQ后,没有打开任何聊天窗口的时候,QQ2006正式版占用了12416KB的内存(如图12),在当前动辙几百MB甚至上GB的内存来说,应该可以非常轻松的运行。

    图12 内存占用

      当打开多个聊天窗口时,占用内存情况如下表所示:

     窗口个数(个)  1 2 3 4 5
     内存占用(KB) 21188 24212 26140 28200 30316

      从上表中可以看出,每增加一个聊天窗口,大约会增加2MB左右的内存占用。

      评论:QQ2006正式版占用内存情况有所改观,改变了过去占用大内存的问题,使得一些低配置的机器也能够轻松运行。

      六、总结

      除了上面介绍的功能外,QQ2006正式版还优化了登录及打开会话窗口的速度及性能,同时对远程协助功能也进行了优化处理,在这里就不再一一介绍了。通过上面各项功能的试用可以看出,QQ2006正式版在各个细节上为用户着想,以人为本,听取了广大网友的想法,增加了网友一直想添加的功能,同时在网友操作方便性上进行了改善,可以说QQ越来越重视网友的呼声。不过笔者在试用中,也感觉到了该版本的不足,如在弹出登录窗口时,软件不能够自动关闭该窗口,需用户手动关闭才行,好友输入状态是在聊天窗口的状态栏里显示,不方便用户查看,如果能够在输入消息窗口上方显示,效果会更好一些。不过现在QQ2006正式版正在试用过程中,希望等QQ2006正式版正式发布时会更加完善。

  • 黑盒测试方法揭密

    2007-06-12 08:55:02

    作者:陈樵 2002年04月08日 本文选自:中国计算机报

    一、黑盒测试在快速应用开发(rad)环境中的重要作用

      软件测试方法一般分为两种:白盒测试与黑盒测试。其中,白盒测试又称为结构测试、逻辑驱动测试或基于程序本身的测试,着重于程序的内部结构及算法,通常不关心功能与性能指标。黑盒测试又被称为功能测试、数据驱动测试或基于规格说明的测试,实际上是站在最终用户的立场上,检验输入输出信息及系统性能指标是否符合规格说明书中有关功能需求及性能需求的规定。

      随着rad环境的发展,软件工程面临新的挑战,其中包括:

      ●应用系统的规模越来越庞大,结构越来越复杂;

      ●开发团队人员越来越多,分工越来越细;

      ●项目投资日益提高,导致投资风险增大。

      在这样一种背景下,软件质量面临着更大的危机,而解决问题的关键正是黑盒测试,可是由于传统的黑盒测试往往局限于手工测试,凭借工程人员的经验自发地进行,缺乏严格的测试管理机制,因而效果并不明显。

      在分发一个应用系统之前,若没有经过科学、周密的黑盒测试,就相当于将大量隐含的缺陷(defect)交付到最终用户手中,这对于开发团队自身、项目投资方及最终用户来说都是不负责任的表现,也将严重损害三方的利益。

      今天,软件的质量要求越来越受到重视,在对软件的质量监督中,黑盒测试起着重要的、不可替代的作用;而随着软件开发平台及软件设计思想的进步和发展,特别是rad技术的发展,对黑盒测试提出了更明确的要求,人们发现,必须遵循一定的测试理论,依赖于优秀的测试工具,才能进行科学、完备的测试。

      二、黑盒测试的操作步骤

      在传统的软件开发生命周期当中,测试工作往往被搁置到整个开发过程的后期进行,也就是说,当应用程序的编码工作已经基本完成,才开始进行测试,这样做的缺点在于:

      a)由于应用程序庞大而复杂,测试工作千头万绪,测试人员难以组织科学、全面的测试用例,从而大幅度提高了测试成本,并严重影响测试的全面性和有效性;

      b)由于缺陷所涉及的模块从开发到测试之间的时间间隔较长,使得程序员的修改和维护工作要付出更大的代价;

      c)由于受到分发日期的限制,测试工作往往是在忙碌中结束的,而将大量的缺陷遗留给最终用户,也就是说,真正的测试工作实际上是由最终用户来完成的。

      因此,为了保证测试工作科学、精确、全面、有序地进行,应该采取一边开发一边测试的策略,使得开发工作与测试工作平行进行,这也就是俗话所说的“越早测试越好”的概念。

      一套完整的测试应该由五个阶段组成:

      1.测试计划

      首先,根据用户需求报告中关于功能要求和性能指标的规格说明书,定义相应的测试需求报告,即制订黑盒测试的最高标准,以后所有的测试工作都将围绕着测试需求来进行,符合测试需求的应用程序即是合格的,反之即是不合格的;同时,还要适当选择测试内容,合理安排测试人员、测试时间及测试资源等。

      2.测试设计

      将测试计划阶段制订的测试需求分解、细化为若干个可执行的测试过程,并为每个测试过程选择适当的测试用例(测试用例选择的好坏将直接影响到测试结果的有效性)。

      3.测试开发

      建立可重复使用的自动测试过程。

      4.测试执行

      执行测试开发阶段建立的自动测试过程,并对所发现的缺陷进行跟踪管理。测试执行一般由单元测试、组合测试、集成测试、系统联调及回归测试等步骤组成,测试人员应本着科学负责的态度,一步一个脚印地进行测试。

      5.测试评估

      结合量化的测试覆盖域及缺陷跟踪报告,对于应用软件的质量和开发团队的工作进度及工作效率进行综合评价。

      显然,黑盒测试只有严格按照步骤进行,才可能对应用程序的质量进行把关。然而,如果没有一种优秀的测试工具的帮助,单纯凭借手工测试,不但将耗费大量的人力、物力和财力,而且有很多测试工作是难以实现甚至是无法实现的。

      三、手工测试与自动测试的比较

      手工测试无法保证黑盒测试的科学性与严密性,这是因为:

      ●测试人员要负责大量文档、报表的制订和整理工作,会变得力不从心;

      ●受软件分发日期、开发成本及人员、资源等诸多方面因素的限制,难以进行全面的测试;

      ●如果修正缺陷所花费的时间相当长,回归测试将变得异常困难;

      ●对测试过程中发现的大量缺陷缺乏科学、有效的管理手段,责任变得含混不清,没有人能向决策层提供精确的数据以度量当前的工作进度及工作效率;

      ●反复测试带来的倦怠情绪及其他人为因素使得测试标准前后不一,测试花费的时间越长,测试的严格性也就越低;

      ●难以对不可视对象或对象的不可视属性进行测试。

      因此,自动测试成为最佳的解决方案。所谓自动测试,实际上是将大量的重复性工作交给计算机去完成,一个优秀的自动测试工具,不但可以满足科学测试的基本要求,而且可以节约大量的时间、成本、人员和资源,并且测试脚本可以被重复利用(包括被不同的项目所利用)。
  • 性能测试之协议分析

    2007-06-09 14:12:08

    最近在论坛上的一些朋友问脚本方面的问题,比如用lr的winsock协议录制的脚本遇回放过程中遇到如下错误

    Action.c(20): Error : callConnect - Can't assign requested address. Error code : 10049.
    Action.c(20): Error : Timeout expired while trying to connect. Error code : 9017.

    这里的10049是udp协议错误,是脚本没有和服务器同步,这说明什么问题呢。下边我用一个协议进行分析,来看看到底是什么问题,
    smtp协议分析:

    1.SMTP工作方式有两种情况:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器.
    2.SMTP是个请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码.
    3.SMTP在TCP协议25号端口监听连接请求
    4.连接和发送过程:

    a.建立TCP连接
    b.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令
    服务器端正希望以OK作为响应,表明准备接收
    c.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行
    服务器端则表示是否愿意为收件人接受邮件
    d.协商结束,发送邮件,用命令DATA发送
    e. 以.表示结束输入内容一起发送出去
    f.结束此次发送,用QUIT命令退出。

    5.另外两个命令:
    VRFY---用于验证给定的用户邮箱是否存在,以及接收关于该用户的详细信息。
    EXPN---用于扩充邮件列表。

    6.邮件路由过程:
    SMTP服务器基于‘域名服务DNS中计划收件人的域名来路由电子邮件。SMTP服务器基于DNS中的MX记录来路由电子邮件,MX记录注册了域名和相关的SMTP中继主机,属于该域的电子邮件都应向该主机发送。

    若SMTP服务器mail.withub.org收到一封信要发到pcl@withub.org

    a.Sendmail请求DNS给出主机withub.org的CNAME记录,如有,假若CNAME到mail.withub.org,则再次请求mail.withub.org的CNAME记录,直到没有为止.
    b.假定被CNAME到mail.withub.org,然后sendmail请求@withub.org域的DNS给出mail.withub.org的MX记录,
    shmail MX 5 mail.withub.org
    10 shmail2.withub.org
    c. Sendmail最后请求DNS给出shmail.withub.org的A记录,即IP地址,若返回值为1.2.3.4
    d. Sendmail与1.2.3.4连接,传送这封给pcl@withub.org的信到1.2.3.4这台服务器的SMTP后台程序

    这里是协议的一个解析过程,我们要看看,利用lr录制脚本后然后回放,录制的过程中mail.withub.org返回客户端服务器上有多少给用户的邮件,lr把这个数字保存下来,最为下次回放的时候对比。当你第二次回放的时候,lr模拟客户端发送请求,这时候服务器上没有了新邮件,返回可能是0,lr把这个返回值和当时录制的脚本保存的返回值进行对比(那个时候可能服务器上有3个新的邮件,服务器返回的值是3),明显这个值是动态变化的。你的脚本如果没有经过修改,肯定是回返不成功的。

    那么上边提到的错误信息,同样的道理,我们要分析一下到底是什么问题,从协议上分析,从系统环境上分析。

    解决方法,动态关联

    1.用同样的用户操作同样的步骤两次,然后用lr工具wdiff进行脚本对比,找出不同的地方!

    2.用lr自动关联

    3.手工关联,找到要替换的动态数据进行替换

  • 系统性能测试方案

    2007-06-09 14:10:35

     
     
     
     
     

    1引言

    1.1编写目的

    编写本方案的目的是用于指导XXXX系统的性能测试,主要从测试环境、测试工具、测试策略、测试具体执行方法、任务与进度表等事先计划和设计。

    1.2适用范围

    XXXX系统性能测试组

    XXXX系统开发组

    XXXX系统性能优化组

    1.3参考资料

    系统性能测试指南

    1.4术语和缩写词

    缩写、术语

    性能测试

    performance testing

    运行这些测试通常要确定程序运行有多快,以便确定是否需要优化

    负载测试

    (load testing)

    通过在面临很多资源要求的系统上运行,攻击被测程序或系统

    可靠性测试

    (reliability testing)

    持续进行的性能测试,目标是发现短序列程序测试遗漏的情况

    ……

     

     

     

     

     

    2系统介绍

    3测试环境

    3.1网络拓扑图

    3.2硬件环境

    3.3软件环境

    4测试范围与主要内容

    测试范围:

    如:XXXX系统各项性能指标,反应时间的性能测试、CPU、Memory的性能测试、负载的性能测试(压力测试)、可靠性测试

    主要检测内容:

    如:

    1. 典型应用的反应时间

    2. 客户端、服务器的CPU、Memory使用情况

    3. 服务器的响应速度

    4. 系统支持的最优负载数量

    5. 网络指标

    6. 系统可靠性测试

    5测试工具和测试方法

    5.1测试工具

    MI(Mercury Interactive)公司的LoadRunner7.5.1创建虚拟用户脚本工具Virtual User Generator

    MI(Mercury Interactive)公司的LoadRunner7.5.1创建、运行实际场景工具Controller

    MI(Mercury Interactive)公司的LoadRunner7.5.1分析测试结果工具Analysis

    性能监视器(MicroSoft Win2000自带)

    5.2测试方法

    5.2.1反应时间的性能测试

    处理点或事件

    期望的反应时间

    实际反映时间平均值(至少3次)

    上次或上版本实际反映时间平均值(至少3次)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    测试结果分析:

    5.2.2CPUMemory的性能测试

    条件:

    1.客户端情况

    2. 应用服务器情况

    3.数据库服务器情况

    测试结果分析:

    5.2.3负载的性能测试(压力测试

    输入/动作

    输出/响应

    能否正常运行

    10个用户操作

     

     

    20个用户操作

     

     

    30个用户操作

     

     

    50个用户操作

     

     

    100个用户操作

     

     

    ……

     

     

    测试结果分析:

    5.2.4可靠性测试

    任务描述

     

    连续运行时间

    建议72小时

    故障发生的时刻

    故障描述

     

     

     

     

    ……

     

    统计分析

    任务A无故障运行的平均时间间隔

    CPU小时)

    任务A无故障运行的最小时间间隔

    CPU小时)

    任务A无故障运行的最大时间间隔

    CPU小时)

    测试结果分析:

    5.2.5网络性能测试

    对网络性能的测试,如网络流量、每秒采样数、网络延迟等。

    6测试完成准则

    系统满足各项性能要求、能满足实际使用情况并提供测试报告

    7任务与进度表

    8提交的文档和报告

    XXXX系统性能测试方案

    XXXX系统性能测试报告

    XXXX系统性能测试脚本

  • 性能测试(并发负载压力)测试分析-简要篇

    2007-06-09 14:09:18

    论坛混了多日,发现越来越多的性能测试工程师基本上都能够掌握利用测试工具来作负载压力测试,但多数人对怎样去分析工具收集到的测试结果感到无从下手,下面我就把个人工作中的体会和收集到的有关资料整理出来,希望能对大家分析测试结果有所帮助。

    分析原则:

    • 具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)

    • 查找瓶颈时按以下顺序,由易到难。

        服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)

        注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。

    • 分段排除法 很有效

    分析的信息来源:

    •1 根据场景运行过程中的错误提示信息

    •2 根据测试结果收集到的监控指标数据

    一.错误提示分析

    分析实例:

    1 •Error: Failed to connect to server “10.10.10.30:8080″: [10060] Connection

    •Error: timed out Error: Server “10.10.10.30″ has shut down the connection prematurely

    分析:

    •A、应用服务死掉。

    (小用户时:程序上的问题。程序上处理数据库的问题)

    •B、应用服务没有死

    (应用服务参数设置问题)

        例:在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25%

    •C、数据库的连接

    (1、在应用服务的性能参数可能太小了 2、数据库启动的最大连接数(跟硬件的内存有关))

    2 Error: Page download timeout (120 seconds) has expired

    分析:可能是以下原因造成

    •A、应用服务参数设置太大导致服务器的瓶颈

    •B、页面中图片太多

    •C、在程序处理表的时候检查字段太大多

    二.监控指标数据分析

    1.最大并发用户数:

    应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。

        在方案运行中,如果出现了大于3个用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。

        如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么OK。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。

    2.业务操作响应时间:

        • 分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用“事务性能摘要”图,可以确定在方案执行期间响应时间过长的事务。

    • 细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?

    • 如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用“网络监视器”图确定导致性能瓶颈的网络问题

    3.服务器资源监控指标:

    内存:

    1 UNIX资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。

    2 Windows资源监控中,如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。

    内存资源成为系统性能的瓶颈的征兆:

    很高的换页率(high pageout rate);

    进程进入不活动状态;

    交换区所有磁盘的活动次数可高;

    可高的全局系统CPU利用率; 

    内存不够出错(out of memory errors)

    处理器:

    1 UNIX资源监控(Windows操作系统同理)中指标CPU占用率(CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL Server,可接受的最大上限是80-85% 

    合理使用的范围在60%至70%。

    2 Windows资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。

    CPU资源成为系统性能的瓶颈的征兆: 

    很慢的响应时间(slow response time) 

    CPU空闲时间为零(zero percent idle CPU) 

    过高的用户占用CPU时间(high percent user CPU) 

    过高的系统占用CPU时间(high percent system CPU) 

    长时间的有很长的运行进程队列(large run queue size sustained over time)

    磁盘I/O:

    1 UNIX资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。

    2 Windows资源监控中,如果 Disk Time和Avg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。

    I/O资源成为系统性能的瓶颈的征兆 :

    过高的磁盘利用率(high disk utilization) 

    太长的磁盘等待队列(large disk queue length) 

    等待磁盘I/O的时间所占的百分率太高(large percentage of time waiting for disk I/O) 

    太高的物理I/O速率:large physical I/O rate(not sufficient in itself) 

    过低的缓存命中率(low buffer cache hit ratio(not sufficient in itself)) 

    太长的运行进程队列,但CPU却空闲(large run queue with idle CPU)

    4.数据库服务器:

    SQL Server数据库:

    1 SQLServer资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。

    2 如果Full Scans/sec(全表扫描/秒)计数器显示的值比1或2高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。 

    3 Number of Deadlocks/sec(死锁的数量/秒):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0。

    4 Lock Requests/sec(锁请求/秒),通过优化查询来减少读取次数,可以减少该计数器的值。

    Oracle数据库:

    1 如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。

    快存(共享SQL区)和数据字典快存的命中率: 

    select(sum(pins-reloads))/sum(pins) from v$librarycache; 

    select(sum(gets-getmisses))/sum(gets) from v$rowcache; 

    自由内存: select * from v$sgastat where name=’free memory’; 

    2 如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。

    缓冲区高速缓存命中率:

    select name,value from v$sysstat where name in (’db block gets’,

    ‘consistent gets’,'physical reads’) ;

    Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))

    3 如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。

    日志缓冲区的申请情况 :

    select name,value from v$sysstat where name = ‘redo log space requests’ ;

    4 如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序 。

    内存排序命中率 :

    select round((100*b.value)/decode((a.value+b.value), 0, 1, (a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name=’sorts (disk)’ and b.name=’sorts (memory)’

    注:上述SQL Server和Oracle数据库分析,只是一些简单、基本的分析,特别是Oracle数据库的分析和优化,是一门专门的技术,进一步的分析可查相关资料。

  • loadRunner资料整理(性能测试)转载

    2007-06-09 14:08:21

    loadRunner资料整理(性能测试)转载

    2007-05-25 14:36:18 / 个人分类:性能测试

    loadRunner资料整理(性能测试
    环境搭建
    1.安装LR8.0版本
    a.到\doc复制安装包到本地,解压后,里面有2个文件:Loadrunner 8.0 (Web Site Load Test Tool - Good).iso和说明.txt(10000并发用户注册码)
    b.用光驱工具(DAEMON Tools)打开iso镜像文件,安装LR
    c.安装过程注意:光驱工具在/doc中的daemon347.exe
                   按默认步骤一步步安装下来
    二.web性能测试计划
    1.性能测试基本概念
       性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。
    负载测试和压力测试都属于性能测试,两者可以结合进行。
    通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。
    压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。
    2.什么时候需要做web性能测试
       一般来说,开发人员或项目经理会提出需求,帮忙测下某个网站或某个功能点的性能如何?所以基本的测试需求和性能标准需要自己来设定。
       首先先了解到测试的范围,如果是整个网站的性能水平,则选择网页流量最多的几个页面,进行页面概率测试,首先判断出该网站流量最大的页面有:首页,下载页,个人管理页,广告页,等等其他页面。页面和页面之间的流量也存在着某种关系。假使用户群的20%会浏览首页,其中20%中的80%会到下载页面,20%会进入个人管理页面,20%会进入广告页面。
       如果是某个功能的测试,可以先进行试探性的测试,可以开始录制基本的脚本。例如测试网站注册功能的性能如何?先得出基本的性能标准。
       这次我要测的是网站的注册性能。首先注册功能的功能测试要全部通过,保证功能上没有问题。然后分析所测对象的模块结构是如何的?注册方式有3种:直接注册,第三方帐号注册,手机注册。其中预期到直接注册和第三帐号的注册量最大,所以测试2种方式下的注册性能如何。那么这次的性能测试范围就是直接注册了。然后在考虑测试环境
       测试工具:LoadRunner工具模拟多用户并发请求注册的客户端请求。那么如何模拟这个压力,如何得出压力过程中网站的是否稳定,事务的失败率是否太大?这些都要在开始压力之前想好。
    3.Web性能测试计划
       5W:“5W”规则指的是“What(做什么)”、“Why(为什么做)”、“When(何时做)”、“Where(在哪里)”、“How(如何做)”
       做什么:也就是测试范围,测试web注册系统性能是否满足用户需求?

       为什么做:在上线之前,或用户快速增长之后,及早的验证系统是否能支持多用户同时注册,以免在线时才发现系统承载不了。
       何时做:也就是测试任务的时间,基本上要1个星期的时间。
       在哪里:需要2台测试机,一台是web服务(注册系统,linux系统),一台是压力测试专用机(安装LR,windows系统)。另外需要准备一个自己的观察机(远程桌面操作并观察压力2台系统的结果)。
       如何做:也就是测试脚本的录制和测试场景的设置了。有几个问题必须先考虑清楚才开始做,LoadRunner能做些什么?
    a.功能是一个什么流程?用户点击页面->下一步到号码页面->用户输入验证码->设置用户密码->后台注册成功(数据库日志)->用户注册成功
    b. LoadRunner 通过使用虚拟用户来代替实际用户来减少人员要求。这些Vuser 模拟实际用户的行为(也就是注册)
    c. LoadRunner 联机监视应用程序的性能,使您可以在测试执行期间对您的系统进行微调。从服务器的性能调试还是代码的性能调试。
    d. LoadRunner 在测试过程中会自动记录应用程序的性能。您可以从众多的图和报告中进行选择以查看性能数据。
    e. LoadRunner 可检查出现性能延迟的地方:网络或客户端延迟、CPU 性能、I/O延迟、数据库锁定和数据库服务器上的其他问题。LoadRunner 将监视网络和服务器资源以帮助改进性能。
    f.性能测试并不是1次2次就能完成的工作,可能需要多轮的场景设置然后观察。
    三.一轮测试的整个过程
    1.规划测试
    也就是刚才所说的性能测试计划,想好第一探测要怎么做,从最表面的性能指标观察(响应时间,定义明确的测试计划确保方案能完成本次测试的目标
    2.创建user脚本
    录制单个用户完成整个功能时所做的动作(用户点击页面->下一步到号码页面->用户输入验证码->设置用户密码->后台注册成功(数据库及日志)->用户注册成功),而且后面的方案需要,可以设置单个用户反复录制该脚本的次数
    3.创建方案(测试场景)
    设置整个压力过程中,客户端请求动作的所有情况,你可以设置用户数量,多个脚本的百分比,而且还可以创建面向目标的方案,在其中定义你希望达到的测试目标,LR将根据你所设置的目标自动为你创建方案。
    4.运行方案(在运行前,先想好需要监视那些数据)
    第一次运行方案时,你可以观察下监视的性能指标图表变化,看是否有太大的异常,因为初次用工具肯定会有些问题,这时候可以查找答案排除问题。
    5.监视方案(LR能满足大部分的性能指标观察,但有些性能指标需要自己写些sh脚本录制)
    你可以观察用户加载数量,事务成功数,系统资源,web资源,WEB服务器资源,web应用程序服务器资源,数据库服务资源,网络吞吐量等。
    6.分析测试结果,得出更有效的下一步测试用例设计
    LR可以记录下不同负载下的性能数据,可以使用图表和报告来分析应用程序的性能,而这一环节也是最难的一步
    四.测试计划
    1.分析应用程序
    分析单用户完成整个功能的过程:用户从客户端机发出请求,网络环境,web服务器响应请求,数据库服务器保存结果
    先不考虑网络环境的瓶颈,在内网中进行性能测试
    2.定义测试目标
    度量最终用户的响应时间:完成一个注册需要多长时间
    定义最优的硬件配置:哪一种硬件配置可以提供最佳性能
    检查可靠性系统:无错误或无故障运行的时间长度或难度
    度量系统容量在没有显著性能下降的前提下,系统能够处理多大的负载:确定瓶颈哪些因素会延长响应时间
    3.计划测试实施方案
    定义用户的活动,一个用户的请求可以定义为一个事务,而且可以在脚本中设置集合点:指示多个用户同一时刻执行。
    4.检测测试目标
     度量最终用户响应时间:从客户端请求到服务器响应完毕所花费的时间
     定义最优的硬件配置(服务器的):检查各项系统配置对性能测试的影响
     检查可靠性:确定系统在高工作长期负载下的稳定性级别
    确定瓶颈(客户端,网络,服务器,数据库服务器,程序)
    五.录制脚本
    虚拟用户模拟实际用户的操作,开始录制(url,action),在页面上操作,完成注册后,停止脚本录制。就可以得出整个虚拟用户注册过程客户端部分的行为录制了。
    录制基本的vuser脚本
    VuGen 通过录制浏览器和 Web 服务器之间的活动来创建 Web Vuser 脚本。VuGen 监控系统的客户端(浏览器),并跟踪所有发送到服务器以及从服务器接收的请求。
    在 VuGen 中或从 LoadRunner Controller 运行录制的 Vuser 脚本时, Vuser 将与服务器直接通信,无需依赖客户端软件。而 Vuser 脚本则通过 API 函数直接执行对 Web 服务器的调用。
    过程:新建脚本->设置录制选项为action->录制浏览网站时执行的操作->终止操作
    增强并编辑脚本
    通过插入事务、集合点、检查和服务步骤来增强 Vuser 脚本。需要的话还可以定义参数(有变量时),vuser_init 和 vuser_end 部分通常用于录制服务器登录和注销过程。
    配置运行时设置
    以独立模式运行vuser脚本
    调试脚本,查看脚本是否有错。
    脚本保存,以便集成到LR方案中
    保存脚本。
    六.设置方案
    1.选择方案类型
    选择下列两个选项之一:
    a.手动方案:如果要生成手动方案,请选择此方法。通过创建组并指定脚本、负载
    生成器和每组中包括的 Vuser 数,可以生成手动方案。
    使用百分比模式在脚本间分配Vuser,如果要通过指定许多要在选定 Vuser 脚
    本间分配的 Vuser 来生成手动方案,请选择此选项。
    b.面向目标的方案:选择此方法可让 LoadRunner 为您生成方案。在面向目标的方
    案中,可以定义通过测试要实现的目标, LoadRunner 将根据这些目标自动生成
    方案。
    2.选择脚本
    选择刚刚保存录制的脚本
    3.设计方案
    a.“方案计划”窗格显示了与计划配置文件有关的信息:名称、计划模式、方案持
    续时间、负载行为和方案中要使用的 Vuser 总数。“负载预览”显示已定义方案
    计划的预览图。
    主要用途是设置虚拟用户的加载数,以及用户随着时间的增长如何加载用户数量(上升虚拟用户数,保持最高用户数,下降讯用户数),而且可以指示 LoadRunner 在一段延迟之后开始执行方
    案。您可以指定让 LoadRunner 自发出Run命令以来等待的分钟数,也可以指定让方案开始的特定时间。
    设置相同的时间加载一定的用户数量,直到全部加载完毕为止,这样设置的目的是为了方便记录用户数量明显增大时,性能指标的变化情况。
    b.“方案脚本”窗格列出了所有启用和禁用的 Vuser 脚本、脚本路径、负载生成器
    计算机以及分配给每个脚本的 Vuser 在总数中所占的百分比。
    4.预设计方案输出窗口,监视vuser状态。需要加进你想要的性能指标图表
    七.执行方案
    开始执行方案,保存执行方案的结果。方案将会持续你所设计的时间限制,也可以在中途手工停止或某些条件下停止。
    八.监视方案
    1.运行时和事务监视
    a.正在运行的用户数,已加载时间,每秒点击次数(表明每个 Vuser 所运行的每一秒钟内对测试的网站有多少次点击(HTTP 请求)),通过的事务数,失败的事务数,错误数(点击后可看到具体的错误日志)。
    b.事务监视图
    事务响应时间
    每秒事务数(通过)
    每秒事务数(失败、停止)
    每秒事务总数(通过)
    2.Web 资源
    每秒点击次数图:每秒点击次数图将点击(HTTP 请求) Web 服务器的次数显示为方案已用时间的函数。可将此图与事务响应时间图进行比较,以查看点击次数对事务性能产生的影响。
    吞吐量图:吞吐量图显示 Web 服务器在 方案运行的每一秒中的吞吐量。吞吐量的度量单位是字节,表示 Vuser 在任何给定的某一秒上从服务器获得的数据量。可将此图与事务响应时间图进行比较,以查看吞吐量对事务性能产生的影响。
    每秒 HTTP 响应数图:每秒=eqqm=响应数图显示方案运行的每一秒(X 轴)中从 Web 服务器返回的HTTP 状态代码数(Y 轴), HTTP 状态代码表示 HTTP 请求的状态,例如“请
    求成功”、“找不到此页”。
    每秒下载页数图:每秒下载页数图显示方案运行的每一秒(X 轴)中从服务器下载的网页数
    (Y 轴)。使用此图可依据下载的页数来计算 Vuser 生成的负载量。
    3.系统资源
    拖进“运行”新图-Unix资源。显示“添加计算机”对话框,该对话框可用于在现有列表中添加要监视的计算机(服务器)。输入要监视的计算机的名称或 IP 地址以及unix平台。但服务器需要配置unix中的rstatd守护程序才能监视。
    a.配置rstatd守护程序
    具体安装说明及安装包在:E:\压力测试\Linux系统资源配置下
    4.Web 服务器资源
    a.配置 Apache 监视器
    将apache图拖进“运行”视图中,单击“添加”输入要监视计算机的服务器名或 IP 地址。选择计算机运行的平台,并单击“添加”选择要监视的资源度量
    了解服务器统计信息 URL:http://192.168.1.22:80/server-status?auto
    5.数据库服务器资源(未使用过)
    6。还可添加新图,观测需要观测的图表数据
    九.分析性能测试数据
    1.Vuser 图
    在方案执行过程中, Vuser 在执行事务时生成数据。使用 Vuser 图可以确定方案执行期间 Vuser 的整体行为。它们显示 Vuser 状态、完成脚本的 Vuser 的数量以及集合统计信息。将这些图与事务图结合使用可以确定 Vuser 的数量对事务响应时间产生的影响。
    a. “正在运行的 Vuser”图显示在测试期间的每一秒内,执行 Vuser 脚本的 Vuser 的数量及它们的状态。此图可用于确定任何给定环境中服务器上的 Vuser 负载
    b. “Vuser 摘要”图显示 Vuser 性能的摘要。使用此图可以查看成功地完成方案运行的 Vuser 的数量与未成功完成 Vuser 数量之比。
    2.错误图
    在方案执行期间, Vuser 可能没有成功地完成所有事务。通过“错误”图可以查
    看有关失败的、停止的或因错误而终止的事务的信息。使用“错误”图,可以查
    看方案执行期间发生的错误的摘要以及平均每秒发生的错误数。
    3.事务图
    a.“平均事务响应时间”图显示在方案运行期间每一秒内执行事务所用的平均时间。
    b.“每秒事务数”图显示在方案运行的每一秒中,每个事务通过、失败以及停止的次数。此图可帮助您确定系统在任何给定时刻的实际事务负载。您可以将此图与平均事务响应时间图进行对比,以分析事务数目对执行时间的影响。
    c. “每秒事务总数”图显示方案运行的每一秒中,通过的事务总数、失败的事务总数以及停止的事务总数。
    4.Web 资源图
    a.“每秒点击次数”图显示在方案运行过程中 Vuser 每秒向 Web 服务器提交的HTTP 请求数。借助此图可依据点击次数来评估 Vuser 产生的负载量。可将此图与“平均事务响应时间”图进行比较,以查看点击次数对事务性能产生影响。
    b. “吞吐量”图显示方案运行过程中服务器上每秒的吞吐量。吞吐量的度量单位是字节,表示 Vuser 在任何给定的某一秒上从服务器获得的数据量。借助此图您可以依据服务器吞吐量来评估 Vuser 产生的负载量。可将此图与“平均事务响应时间”图进行比较,以查看吞吐量对事务性能产生影响。
    c. “每秒下载页面数”图显示方案运行(X 轴)过程中每秒钟从服务器下载的网页数(Y 轴)。可借助此图依据下载的页面数来评估 Vuser 产生的负载量。
    和吞吐量一样,每秒下载的页面数表示 Vuser 在给定的任一秒内从服务器接收到的数据量。但是吞吐量图考虑的是各个资源及其大小(例如,每个 .gif 文件的大小、每个网页的大小)。而每秒下载页面数图只考虑页面数。
    5.网页细分图
    a.“网页细分”图可以评估页面内容是否影响事务响应时间。使用网页细分图可以分析网站上有问题的元素(例如下载很慢的图像或中断的链接)。
    6.用户定义的数据点图
    7.系统资源图
    “UNIX 资源”图显示在方案运行期间度量的 UNIX 资源。此图可帮助您确定 Vuser 负载对各种系统资源的影响。
    8.网络监视器图
    使用网络监视器图,可以确定网络是否是造成瓶颈的原因。如果网络出现问题,则可以找到故障网段,以便解决该问题。
    9.Web 服务器资源图
    Apache 服务器图将服务器统计信息显示为方案已用时间的函数。
    10.摘要
    “摘要”报告提供有关执行方案的一般信息。列出关于方案运行的统计信息,并提供指向下列各图的链接:正在运行的 Vuser、吞吐量、每秒点击次数、每秒 HTTP 响应数、事务摘要和平均事务响应时间。
    11.自己制作测试报告
    各种表本身是有许多数据组合,找到你想要的数据,导出成excel文件形式,可以在excel中做出你想要看见的图表(曲线图之类的)。

  • 性能测试总结

    2007-06-09 14:06:38

    性能测试总结

    2007-06-07 18:09:06 / 个人分类:性能测试

    在论坛混了多日,发现越来越多的性能测试工程师基本上都能够掌握利用测试工具来作负载压力测试,但多数人对怎样去分析工具收集到的测试结果感到无从下手,下面我就把个人工作中的体会和收集到的有关资料整理出来,希望能对大家分析测试结果有所帮助。

    分析原则:


    &#8226;
    具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)


    &#8226;
    查找瓶颈时按以下顺序,由易到难。


    服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)


    注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。


    &#8226;
    分段排除法 很有效


    分析的信息来源:


    &#8226;1
    根据场景运行过程中的错误提示信息


    &#8226;2
    根据测试结果收集到的监控指标数据


    一.错误提示分析


    分析实例:


    1 &#8226;Error: Failed to connect to server “10.10.10.30:8080″: [10060] Connection

    &#8226;Error: timed out Error: Server “10.10.10.30″ has shut down the connection prematurely

    分析:


    &#8226;A
    、应用服务死掉。


    (小用户时:程序上的问题。程序上处理数据库的问题)


    &#8226;B
    、应用服务没有死


    (应用服务参数设置问题)


    例:在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25


    &#8226;C
    、数据库的连接


    (1
    、在应用服务的性能参数可能太小了 2、数据库启动的最大连接数(跟硬件的内存有关)
    )

    2 Error: Page download timeout (120 seconds) has expired

    分析:可能是以下原因造成


    &#8226;A
    、应用服务参数设置太大导致服务器的瓶颈


    &#8226;B
    、页面中图片太多


    &#8226;C
    、在程序处理表的时候检查字段太大多


    二.监控指标数据分析


    1
    .最大并发用户数:


    应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。


    在方案运行中,如果出现了大于3个用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。


    如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么OK。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。


    2
    .业务操作响应时间:


    &#8226;
    分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用事务性能摘要图,可以确定在方案执行期间响应时间过长的事务。


    &#8226;
    细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?


    &#8226;
    如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用网络监视器图确定导致性能瓶颈的网络问题


    3
    .服务器资源监控指标:


    内存:


    1 UNIX
    资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。


    2 Windows
    资源监控中,如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。


    内存资源成为系统性能的瓶颈的征兆
    :

    很高的换页率
    (high pageout rate);

    进程进入不活动状态
    ;

    交换区所有磁盘的活动次数可高
    ;

    可高的全局系统CPU利用率
    ;

    内存不够出错
    (out of memory errors)

    处理器:


    1 UNIX
    资源监控(Windows操作系统同理)中指标CPU占用率(CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL Server,可接受的最大上限是
    80-85%

    合理使用的范围在60%70%


    2 Windows
    资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。


    CPU
    资源成为系统性能的瓶颈的征兆
    :

    很慢的响应时间
    (slow response time)

    CPU
    空闲时间为零
    (zero percent idle CPU)

    过高的用户占用CPU时间
    (high percent user CPU)

    过高的系统占用CPU时间
    (high percent system CPU)

    长时间的有很长的运行进程队列
    (large run queue size sustained over time)

    磁盘I/O


    1 UNIX
    资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。


    2 Windows
    资源监控中,如果 Disk TimeAvg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。


    I/O
    资源成为系统性能的瓶颈的征兆
    :

    过高的磁盘利用率
    (high disk utilization)

    太长的磁盘等待队列
    (large disk queue length)

    等待磁盘I/O的时间所占的百分率太高
    (large percentage of time waiting for disk I/O)

    太高的物理I/O速率
    :large physical I/O rate(not sufficient in itself)

    过低的缓存命中率
    (low buffer cache hit ratio(not sufficient in itself))

    太长的运行进程队列,但CPU却空闲
    (large run queue with idle CPU)

    4
    .数据库服务器:


    SQL Server
    数据库:


    1 SQLServer
    资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。


    2
    如果Full Scans/sec(全表扫描/秒)计数器显示的值比12高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。


    3 Number of Deadlocks/sec(
    死锁的数量/):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0


    4 Lock Requests/sec(
    锁请求/),通过优化查询来减少读取次数,可以减少该计数器的值。


    Oracle
    数据库:


    1
    如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。


    快存(共享SQL区)和数据字典快存的命中率:


    select(sum(pins-reloads))/sum(pins) from v$librarycache;

    select(sum(gets-getmisses))/sum(gets) from v$rowcache;

    自由内存:
    select * from v$sgastat where name=’free memory’;

    2
    如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。


    缓冲区高速缓存命中率:


    select name,value from v$sysstat where name in (’db block gets’,

    ‘consistent gets’,'physical reads’) ;

    Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))

    3
    如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。


    日志缓冲区的申请情况


    select name,value from v$sysstat where name = ‘redo log space requests’ ;

    4
    如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序


    内存排序命中率


    select round((100*b.value)/decode((a.value+b.value), 0, 1, (a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name=’sorts (disk)’ and b.name=’sorts (memory)’

    注:上述SQL ServerOracle数据库分析,只是一些简单、基本的分析,特别是Oracle数据库的分析和优化,是一门专门的技术,进一步的分析可查相关资料。









    性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。
    一、概述

         
    性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。中国软件评测中心将性能测试概括为三个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。通常情况下,三方面有效、合理的结合,可以达到对系统性能全面的分析和瓶颈的预测。
        ·
    应用在客户端性能的测试
    应用在客户端性能测试的目的是考察客户端应用的性能,测试的入口是客户端。它主要包括并发性能测试、疲劳强度测试、大数据量测试和速度测试等,其中并发性能测试是重点。
         
    并发性能测试是重点
    并发性能测试的过程是一个负载测试和压力测试的过程,即逐渐增加负载,直到系统的瓶颈或者不能接收的性能点,通过综合分析交易执行指标和资源监控指标来确定系统并发性能的过程。负载测试(Load Testing)是确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统组成部分的相应输出项,例如通过量、响应时间、CPU负载、内存使用等来决定系统的性能。负载测试是一个分析软件应用程序和支撑架构、模拟真实环境的使用,从而来确定能够接收的性能过程。压力测试(Stress Testing)是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。
    并发性能测试的目的主要体现在三个方面:以真实的业务为依据,选择有代表性的、关键的业务操作设计测试案例,以评价系统的当前性能;当扩展应用程序的功能或者新的应用程序将要被部署时,负载测试会帮助确定系统是否还能够处理期望的用户负载,以预测系统的未来性能;通过模拟成百上千个用户,重复执行和运行测试,可以确认性能瓶颈并优化和调整应用,目的在于寻找到瓶颈问题。
    当一家企业自己组织力量或委托软件公司代为开发一套应用系统的时候,尤其是以后在生产环境中实际使用起来,用户往往会产生疑问,这套系统能不能承受大量的并发用户同时访问? 这类问题最常见于采用联机事务处理(OLTP)方式数据库应用、Web浏览和视频点播等系统。这种问题的解决要借助于科学的软件测试手段和先进的测试工具。
         
    举例说明:电信计费软件
    众所周知,每月20日左右是市话交费的高峰期,全市几千个收费网点同时启动。收费过程一般分为两步,首先要根据用户提出的电话号码来查询出其当月产生费用,然后收取现金并将此用户修改为已交费状态。一个用户看起来简单的两个步骤,但当成百上千的终端,同时执行这样的操作时,情况就大不一样了,如此众多的交易同时发生,对应用程序本身、操作系统、中心数据库服务器、中间件服务器、网络设备的承受力都是一个严峻的考验。决策者不可能在发生问题后才考虑系统的承受力, 预见软件的并发承受力, 这是在软件测试阶段就应该解决的问题。
    目前,大多数公司企业需要支持成百上千名用户,各类应用环境以及由不同供应商提供的元件组装起来的复杂产品,难以预知的用户负载和愈来愈复杂的应用程序,使公司担忧会发生投放性能差、用户遭受反应慢、系统失灵等问题。其结果就是导致公司收益的损失。
    如何模拟实际情况呢? 找若干台电脑和同样数目的操作人员在同一时刻进行操作,然后拿秒表记录下反应时间? 这样的手工作坊式的测试方法不切实际,且无法捕捉程序内部变化情况,这样就需要压力测试工具的辅助。
    测试的基本策略是自动负载测试,通过在一台或几台PC机上模拟成百或上千的虚拟用户同时执行业务的情景,对应用程序进行测试,同时记录下每一事务处理的时间、中间件服务器峰值数据、数据库状态等。通过可重复的、真实的测试能够彻底地度量应用的可扩展性和性能,确定问题所在以及优化系统性能。预先知道了系统的承受力,就为最终用户规划整个运行环境的配置提供了有力的依据。
         
    并发性能测试前的准备工作
    测试环境:配置测试环境是测试实施的一个重要阶段,测试环境的适合与否会严重影响测试结果的真实性和正确性。测试环境包括硬件环境和软件环境,硬件环境指测试必需的服务器、客户端、网络连接设备以及打印机/扫描仪等辅助硬件设备所构成的环境;软件环境指被测软件运行时的操作系统、数据库及其他应用软件构成的环境。
    一个充分准备好的测试环境有三个优点:一个稳定、可重复的测试环境,能够保证测试结果的正确;保证达到测试执行的技术需求;保证得到正确的、可重复的以及易理解的测试结果。
    测试工具:并发性能测试是在客户端执行的黑盒测试,一般不采用手工方式,而是利用工具采用自动化方式进行。目前,成熟的并发性能测试工具有很多,选择的依据主要是测试需求和性能价格比。著名的并发性能测试工具有QALoadLoadRunnerBenchmark FactoryWebstress等。这些测试工具都是自动化负载测试工具,通过可重复的、真实的测试,能够彻底地度量应用的可扩展性和性能,可以在整个开发生命周期、跨越多种平台、自动执行测试任务,可以模拟成百上千的用户并发执行关键业务而完成对应用程序的测试。
    测试数据:在初始的测试环境中需要输入一些适当的测试数据,目的是识别数据状态并且验证用于测试的测试案例,在正式的测试开始以前对测试案例进行调试,将正式测试开始时的错误降到最低。在测试进行到关键过程环节时,非常有必要进行数据状态的备份。制造初始数据意味着将合适的数据存储下来,需要的时候恢复它,初始数据提供了一个基线用来评估测试执行的结果。
    在测试正式执行时,还需要准备业务测试数据,比如测试并发查询业务,那么要求对应的数据库和表中有相当的数据量以及数据的种类应能覆盖全部业务。
    模拟真实环境测试,有些软件,特别是面向大众的商品化软件,在测试时常常需要考察在真实环境中的表现。如测试杀毒软件的扫描速度时,硬盘上布置的不同类型文件的比例要尽量接近真实环境,这样测试出来的数据才有实际意义。
         
    并发性能测试的种类与指标
    并发性能测试的种类取决于并发性能测试工具监控的对象,以QALoad自动化负载测试工具为例。软件针对各种测试目标提供了DB2DCOMODBCORACLENETLoadCorbaQARunSAPSQLServerSybaseTelnetTUXEDOUNIFACEWinSockWWWJava scrīpt等不同的监控对象,支持WindowsUNIX测试环境。
    最关键的仍然是测试过程中对监控对象的灵活应用,例如目前三层结构的运行模式广泛使用,对中间件的并发性能测试作为问题被提到议事日程上来,许多系统都采用了国产中间件,选择Java scrīpt监控对象,手工编写脚本,可以达到测试目的。
    采用自动化负载测试工具执行的并发性能测试,基本遵循的测试过程有:测试需求与测试内容,测试案例制定,测试环境准备,测试脚本录制、编写与调试,脚本分配、回放配置与加载策略,测试执行跟踪,结果分析与定位问题所在,测试报告与测试评估。
    并发性能测试监控的对象不同,测试的主要指标也不相同,主要的测试指标包括交易处理性能指标和UNIX资源监控。其中,交易处理性能指标包括交易结果、每分钟交易数、交易响应时间(Min:最小服务器响应时间;Mean:平均服务器响应时间;Max:最大服务器响应时间;StdDev:事务处理服务器响应的偏差,值越大,偏差越大;Median:中值响应时间;90%:90%事务处理的服务器响应时间)、虚拟并发用户数。
         
    应用实例:新华社多媒体数据库 V1.0”性能测试
    中国软件评测中心(CSTC)根据新华社技术局提出的《多媒体数据库(一期)性能测试需求》和GB/T 17544《软件包质量要求和测试》的国家标准,使用工业标准级负载测试工具对新华社使用的新华社多媒体数据库 V1.0”进行了性能测试。
    性能测试的目的是模拟多用户并发访问新华社多媒体数据库,执行关键检索业务,分析系统性能。
    性能测试的重点是针对系统并发压力负载较大的主要检索业务,进行并发测试和疲劳测试,系统采用B/S运行模式。并发测试设计了特定时间段内分别在中文库、英文库、图片库中进行单检索词、多检索词以及变检索式、混合检索业务等并发测试案例。疲劳测试案例为在中文库中并发用户数200,进行测试周期约8小时的单检索词检索。在进行并发和疲劳测试的同时,监测的测试指标包括交易处理性能以及UNIXLinux)、OracleApache资源等。
    测试结论:在新华社机房测试环境和内网测试环境中,100M带宽情况下,针对规定的各并发测试案例,系统能够承受并发用户数为200的负载压力,最大交易数/分钟达到78.73,运行基本稳定,但随着负载压力增大,系统性能有所衰减。
    系统能够承受200 查看(411) 评论(0) 收藏 分享 管理

  • SQL语句导入导出大全

    2007-06-09 08:46:39

    SQL语句导入导出大全

    字体:        | 上一篇 下一篇 | 打印

      /*******  导出到excel
    EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'

    /***********  导入Excel
    SELECT *
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

    /*动态文件名
    declare @fn varchar(20),@s varchar(1000)
    set @fn = 'c:\test.xls'
    set @s ='''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 5.0'''
    set @s = 'SELECT * FROM OpenDataSource ('+@s+')...sheet1$'
    exec(@s)
    */

    SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+' ' 转换后的别名
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

    /********************** EXCEL导到远程SQL
    insert OPENDATASOURCE(
             'SQLOLEDB',
             'Data Source=远程ip;User ID=sa;Password=密码'
             ).库名.dbo.表名 (列名1,列名2)
    SELECT 列名1,列名2
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions


    /** 导入文本文件
    EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword'

    /** 导出文本文件
    EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'

    EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'

    导出到TXT文本,用逗号分开
    exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'


    BULK INSERT 库名..表名
    FROM 'c:\test.txt'
    WITH (
        FIELDTERMINATOR = ';',
        ROWTERMINATOR = '\n'
    )


    --/* dBase IV文件
    select * from
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]')
    --*/

    --/* dBase III文件
    select * from
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]')
    --*/

    --/* FoxPro 数据库
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
    'select * from [aa.DBF]')
    --*/

    /**************导入DBF文件****************/
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;
    SourceDB=e:\VFP98\data;
    SourceType=DBF',
    'select * from customer where country != "USA" order by country')
    go
    /***************** 导出到DBF ***************/
    如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句

    insert into openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
    'select * from [aa.DBF]')
    select * from 表

    说明:
    SourceDB=c:\  指定foxpro表所在的文件夹
    aa.DBF        指定foxpro表的文件名.

     


    /*************导出到Access********************/
    insert into openrowset('Microsoft.Jet.OLEDB.4.0',
       'x:\A.mdb';'admin';'',A表) select * from 数据库名..B表

    /*************导入Access********************/
    insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0',
       'x:\A.mdb';'admin';'',A表)

    文件名为参数
    declare @fname varchar(20)
    set @fname = 'd:\test.mdb'
    exec('SELECT a.* FROM opendatasource(''Microsoft.Jet.OLEDB.4.0'',
        '''+@fname+''';''admin'';'''', topics) as a ')

    SELECT *
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="f:\northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;')...产品

    *********************  导入 xml 文件

    DECLARE @idoc int
    DECLARE @doc varchar(1000)
    --sample XML document
    SET @doc ='

     
         
          Customer was very satisfied
         

      

      
         
                Important
                Happy Customer.
         

         
      


    '
    -- Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

    -- Execute a SELECT statement using OPENXML rowset provider.
    SELECT *
    FROM OPENXML (@idoc, '/root/Customer/Order', 1)
          WITH (oid     char(5),
                amount  float,
                comment ntext 'text()')
    EXEC sp_xml_removedocument @idoc

     

    ???????

    /**********************Excel导到Txt****************************************/
    想用
    select * into opendatasource(...) from opendatasource(...)
    实现将一个Excel文件内容导入到一个文本文件

    假设Excel中有两列,第一列为姓名,第二列为很行帐号(16位)
    且银行帐号导出到文本文件后分两部分,前8位和后8位分开。


    邹健:
    如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2
    然后就可以用下面的语句进行插入
    注意文件名和目录根据你的实际情况进行修改.

    insert into
    opendatasource('MICROSOFT.JET.OLEDB.4.0'
    ,'Text;HDR=Yes;DATABASE=C:\'
    )...[aa#txt]
    --,aa#txt)
    --*/
    select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
    from
    opendatasource('MICROSOFT.JET.OLEDB.4.0'
    ,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls'
    --,Sheet1$)
    )...[Sheet1$]

     

    如果你想直接插入并生成文本文件,就要用bcp

    declare @sql varchar(8000),@tbname varchar(50)

    --首先将excel表内容导入到一个全局临时表
    select @tbname='[##temp'+cast(newid() as varchar(40))+']'
     ,@sql='select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
     into '+@tbname+' from
    opendatasource(''MICROSOFT.JET.OLEDB.4.0''
    ,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls''
    )...[Sheet1$]'
    exec(@sql)

    --然后用bcp从全局临时表导出到文本文件
    set @sql='bcp "'+@tbname+'" out "c:\aa.txt" /S"(local)" /P"" /c'
    exec master..xp_cmdshell @sql

    --删除临时表
    exec('drop table '+@tbname)


    /********************导整个数据库*********************************************/

    用bcp实现的存储过程


    /*
     实现数据导入/导出的存储过程
             根据不同的参数,可以实现导入/导出整个数据库/单个表
     调用示例:
    --导出调用示例
    ----导出单个表
    exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',1
    ----导出整个数据库
    exec file2table 'zj','','','xzkh_sa','C:\docman',1

    --导入调用示例
    ----导入单个表
    exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',0
    ----导入整个数据库
    exec file2table 'zj','','','xzkh_sa','C:\docman',0

    */
    if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
     drop procedure File2Table
    go
    create procedure File2Table
    @servername varchar(200)  --服务器名
    ,@username varchar(200)   --用户名,如果用NT验证方式,则为空''
    ,@password varchar(200)   --密码
    ,@tbname varchar(500)   --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表
    ,@filename varchar(1000)  --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt
    ,@isout bit      --1为导出,0为导入
    as
    declare @sql varchar(8000)

    if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表
    begin
     set @sql='bcp '+@tbname
      +case when @isout=1 then ' out ' else ' in ' end
      +' "'+@filename+'" /w'
      +' /S '+@servername
      +case when isnull(@username,'')='' then '' else ' /U '+@username end
      +' /P '+isnull(@password,'')
     exec master..xp_cmdshell @sql
    end
    else
    begin --导出整个数据库,定义游标,取出所有的用户表
     declare @m_tbname varchar(250)
     if right(@filename,1)<>'\' set @filename=@filename+'\'

     set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U'''
     exec(@m_tbname)
     open #tb
     fetch next from #tb into @m_tbname
     while @@fetch_status=0
     begin
      set @sql='bcp '+@tbname+'..'+@m_tbname
       +case when @isout=1 then ' out ' else ' in ' end
       +' "'+@filename+@m_tbname+'.txt " /w'
       +' /S '+@servername
       +case when isnull(@username,'')='' then '' else ' /U '+@username end
       +' /P '+isnull(@password,'')
      exec master..xp_cmdshell @sql
      fetch next from #tb into @m_tbname
     end
     close #tb
     deallocate #tb
    end
    go


    /************* Oracle **************/
    EXEC sp_addlinkedserver 'OracleSvr',
       'Oracle 7.3',
       'MSDAORA',
       'ORCLDB'
    GO

    delete from openquery(mailser,'select *  from yulin')

    select *  from openquery(mailser,'select *  from yulin')

    update openquery(mailser,'select * from  yulin where id=15')set disorder=555,catago=888

    insert into openquery(mailser,'select disorder,catago from  yulin')values(333,777)

     

    补充:

    对于用bcp导出,是没有字段名的.

    用openrowset导出,需要事先建好表.

    用openrowset导入,除ACCESS及EXCEL外,均不支持非本机数据导入

  • sql 经典语句

    2007-06-09 08:45:50

    sql 经典语句


    {4pC%K qEV$C65703下列语句部分是Mssql语句,不可以在access中使用。

    SQL分类: 51Testing软件测试网L$\-BD I
    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
    7sN*WR#bo65703DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) 51Testing软件测试网1`NW GK3K.C
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

    首先,简要介绍基础语句:
    R5C%x'ED657031、说明:创建数据库
    WB6{Ug9g%v4^65703CREATE DATABASE database-name
    v5Bb*])~*cB657032、说明:删除数据库
    K2\u h ^65703drop database dbname51Testing软件测试网v4f0S,f#vN*~'p0U0c4`0q!k
    3、说明:备份sql server
    fU2bu;S]65703--- 创建 备份数据的 device51Testing软件测试网V_hF `:c!{
    USE master51Testing软件测试网)c Puy;W |;w8p
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
    2AA+`{WRuL65703--- 开始 备份51Testing软件测试网 dbr[1FG0m$Cj(K7j
    BACKUP DATABASE pubs TO testBack
    z;Q{'ZP+|OM Z%j657034、说明:创建新表
    (viF"W [H65703create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    {7T\&e9\65703根据已有的表创建新表: 51Testing软件测试网#[cR%S)Ri
    A:create table tab_new like tab_old (使用旧表创建新表)51Testing软件测试网-K3S0vKT0pZ6cT;X
    B:create table tab_new as select col1,col2… from tab_old definition only
    1F7[3vcS9N&z657035、说明:删除新表drop table tabname
    py-Ix7} v!~ bc/U657036、说明:增加一个列
    2q'{bu0`2p;s_F65703Alter table tabname add column col type
    8y{yf$W'`m"m/{A)c65703注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。51Testing软件测试网/K@mQ0m&J8Qi
    7、说明:添加主键: Alter table tabname add primary key(col) 51Testing软件测试网;Dc2jc@G-oJ
    说明:删除主键: Alter table tabname drop primary key(col) 51Testing软件测试网 BUvie'O}
    8、说明:创建索引:create [unique] index idxname on tabname(col….) 51Testing软件测试网"J+q/Y#n1l(laM
    删除索引:drop index idxname
    7GiZp-G3G65703注:索引是不可更改的,想更改必须删除重新建。
    J:V%mzDWVC Z`.[q657039、说明:创建视图:create view viewname as select statement
    *mk)P+e.k G5I_I65703删除视图:drop view viewname
    )?{*uF L6570310、说明:几个简单的基本的sql语句
    t B;P*Qd AM65703选择:select * from table1 where 范围51Testing软件测试网{a'`i1Wxz
    插入:insert into table1(field1,field2) values(value1,value2)
    ob&a5m:Gq4G65703删除:delete from table1 where 范围51Testing软件测试网U%w B#UO1~ L/{J
    更新:update table1 set field1=value1 where 范围51Testing软件测试网8pX'u;Uk\c
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!51Testing软件测试网v ])pa.s(w/[/rP
    排序:select * from table1 order by field1,field2 [desc]
    O{-UVSj65703总数:select count * as totalcount from table151Testing软件测试网K vJ$dJ@&}C)q
    求和:select sum(field1) as sumvalue from table1
    4q Z'R;b!q65703平均:select avg(field1) as avgvalue from table151Testing软件测试网N6xsV-|:yw6y
    最大:select max(field1) as maxvalue from table1
    |"e9M6rd]S65703最小:select min(field1) as minvalue from table1
    2Fr~){ `8VCK8N6570311、说明:几个高级查询运算词51Testing软件测试网.I H0SIxv
    A: UNION 运算符
    e%W eXc#i65703UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
    U,O:P8Uq YY65703B: EXCEPT 运算符
    0m yFqfa BR65703EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
    7k+uw-Lxw4Q:u65703C: INTERSECT 运算符
    'NMg.R-tv0?.S1o65703INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    -t;YvT7Y!~0Y65703注:使用运算词的几个查询结果行必须是一致的。 51Testing软件测试网)?~o5vQ+? EU
    12、说明:使用外连接 51Testing软件测试网otQ neG(?.b3\2h
    A、left outer join:
    +K)UV$p'K/|v6k65703左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 51Testing软件测试网]"}1I6O*_ C
    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c51Testing软件测试网'V K_{Y:c
    B:right outer join: 51Testing软件测试网V"|T4b T0|1s
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 51Testing软件测试网Aokj Kh s5a
    C:full outer join: 51Testing软件测试网/TT#C3OBA
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    其次,大家来看一些不错的sql语句
    drA[UH?P W1~657031、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    u6FUn`eU65703法一:select * into b from a where 1<>1
    Ei A%F^f%k65703法二:select top 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)51Testing软件测试网l a'~7y6[
    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)51Testing软件测试网(p!i7ys0kw0Ye
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    L0bE*T9GL ML(Xi-Y65703例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)51Testing软件测试网5R C yeI
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    LCba2\M65703select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    9H9Q6L7h%aL65703select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )51Testing软件测试网l~['xe+K
    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括51Testing软件测试网i&C%x9e,u8Q
    select * from table1 where time between time1 and time251Testing软件测试网 M2G:aW`
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法51Testing软件测试网Nht.v(q"hz
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息
    ,^lbR `X65703delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:
    8V(nQT,n#w8k65703select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒 51Testing软件测试网 nUSE%d._*])m&zH
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    S["g xH}&C B@w65703select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录51Testing软件测试网!yxq0p;rnH
    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    Cv#~Tz9ef+h"]3D1Gm65703select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    `q(@,C`NP65703(select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据
    3r+S[b1R H65703select top 10 * from tablename order by newid()

    18、说明:随机选择记录51Testing软件测试网bgr]+?2F
    select newid()

    19、说明:删除重复记录
    Awh3u5Op+h65703Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名
    |r ]VN?65703select name from sysobjects where type='U'

    21、说明:列出表里的所有的
    (xsv;afKXP#RoE65703select name from syscolumns where TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    .|1IL/BbD!L3O65703select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    .j ^F FpH-i9a:PE65703显示结果:51Testing软件测试网*O6d|"xsLs
    type vender pcs
    ['m$N7b"L [65703电脑 A 151Testing软件测试网{:\ ^Us{
    电脑 A 151Testing软件测试网1^5K5n D-jV2maW;To
    光盘 B 251Testing软件测试网w5PF#{N!p1]
    光盘 A 2
    +P q6? @CM`c)N65703手机 B 351Testing软件测试网)O0xi)uco)_-lT Dw
    手机 C 3

    23、说明:初始化表table151Testing软件测试网.? h*xSE#l\BK
    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    N"fJ6oJoUb X;i65703select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
    N"O+Fe8^6sZ65703  51Testing软件测试网\FQ;d8z3t
    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
    8Np+a:a;i#F6H9|0W8r/{65703  对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环: 51Testing软件测试网7Y-eH E-y1o
    Randomize 51Testing软件测试网ek Tl9Jk e
    RNumber = Int(Rnd*499) +1 51Testing软件测试网*z:^[ ?+x"T
     51Testing软件测试网o.[jQ+YO8k$k
    While Not objRec.EOF
    m.mj td)URG3v65703If objRec("ID") = RNumber THEN 51Testing软件测试网;Fc^hNmC0Ozi
    ... 这里是执行脚本 ...
    ,r:q7t(_5TW65703end if 51Testing软件测试网+ZQ v_7`q:^
    objRec.MoveNext
    L wf7OV65703Wend
    AG\ g9w\65703 
    5Cj4s_-v1G7X2E65703  这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了? 51Testing软件测试网|?7x"l ` x&Z5j
      采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
    rUL[8Gt65703Randomize 51Testing软件测试网*^)Q9xA {6i!t O2x
    RNumber = Int(Rnd*499) + 1 51Testing软件测试网!e wgUhqC%vk
     
    Ym6yW3ft&?k65703SQL = "SELECT * FROM Customers WHERE & RNumber 51Testing软件测试网uB(T;V }I r*P/a*d
     51Testing软件测试网/MS [o?
    set ōbjRec = ObjConn.Execute(SQL) 51Testing软件测试网? Z%h1a3I+{P K,})H
    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
    T;q7S:pJ65703 51Testing软件测试网4v5H[j2A
      不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。 51Testing软件测试网s }8\vvh
    再谈随机数
    2?1TG[A0B65703  现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
    (js^S??65703  为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
    `Chi/`&H65703SQL = "SELECT * FROM Customers WHERE & RNumber & " OR & RNumber2 & " OR & RNumber3
    '[D/k.}(Dyz:t65703 51Testing软件测试网!R QR1}3E:QZ!B%KI
      假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码): 51Testing软件测试网$Cs0| AG;t
    SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

      注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

     
    A#P,@,V.P0Y65703随机读取若干条记录,测试
    CZz'OTw%V.\%jN65703Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)51Testing软件测试网m7IzFg
    Sql server:select top n * from 表名 order by newid()51Testing软件测试网m#U6m T"KnmO
    mysqlelect * From 表名 Order By rand() Limit n51Testing软件测试网6^+aTz/A|
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)51Testing软件测试网{/sRn'C
    语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
    #u)z;`8~*S wShg65703使用SQL语句 用...代替过长的字符串显示
    I%e*yj7k3~'}+q.c65703语法:51Testing软件测试网[w `,cD+cp TD,rk*F
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    P W L!OR65703Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
    Kb1f2H V p65703 
    Q5S0knjE"l"n65703Conn.Execute说明
    ps?Z6G65703Execute方法
    a,x/G'|"^A0e o9f~65703  该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
    !K6A U9Q Ct.Sx'\8O65703    1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
    .`Uxe7}[65703    Set 对象变量名=连接对象.Execute("SQL 查询语言")
    .n,b9|,~ V]]65703   Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

        2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:51Testing软件测试网B!CP"d/s5L&ajc
        连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
    M D5Y,A_ C)M-Q F65703      ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
    f"I[A6{1GGt65703      ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

    ·BeginTrans、RollbackTrans、CommitTrans方法51Testing软件测试网&e;pJ5R D1Oo,x
      这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。51Testing软件测试网yy4gJ"ko)X
      事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。51Testing软件测试网wz]9T:ypRrH3O#b(c L
      BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。(来源) 51Testing软件测试网P3r2q f2B"cXx

  • ASP数据库语法总结

    2007-06-09 08:44:31

    <一>。数据库的连接方法:

    1.Access数据库的DSN-less连接方法:

    set adocon=Server.Createobject("adodb.connection")
    wf^"hf7BK65703adoconn.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ="& _51Testing软件测试网;ev6|3p#{]x
    Server.MapPath("数据库所在路径")

    2.Access OLE DB连接方法:

    set adocon=Server.Createobject("adodb.connection")51Testing软件测试网'V&M9z-X1e,q8^ Z
    adocon.open"Provider=Microsoft.Jet.OLEDB.4.0;"& _
    ~7ZYXa65703"Data Source=" & Server.MapPath("数据库所在路径")

    3.SQL server连接方法:

    set adocon=server.createobject("adodb.recordset")
    hn$\8rwd"H:_^/y65703adocon.Open"Driver={SQL Server};Server=(Local);UID=***;PWD=***;"& _
    r0m(tgH#\q65703"database=数据库名;"

    4.SQL server OLE DB连接方法:

    set adocon=Server.Createobject("adodb.connection")
    o[caC*}65703adocon.open"provider=SQLOLEDB.1;Data Source=RITANT4;"& _51Testing软件测试网9C"O1Z1d kUJg F6n$y
    "user ID=***;Password=***;"& _51Testing软件测试网2XIlF6m5h(M#w6R$F'N
    "inital Catalog=数据库名"

    5.Oracle 连接方法:

    set adocon=Server.Createobject("adodb.connection")
    .k,I-alLL#D2G65703adocon.open"Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"

    6.Oracle OLE DB 连接方法:

    set adocon=Server.Createobject("adodb.connection")
    Qp/z}4L4u9o4m65703adocon.open"Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"

    7.dBase 连接方法:

    set adocon=Server.Createobject("adodb.connection")
    K5B \7M&ex s9z6K65703adocon.open"Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"

    8.mySQL 连接方法:

    set adocon=Server.Createobject("adodb.connection")51Testing软件测试网6q Qt S zR&r1F g'ix
    adocon.open"Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"

    9.Visual Foxpro 连接方法:

    set adocon=Server.Createobject("adodb.connection")
    :fc$w1nDq[n65703adocon.open"Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"

    10.MS text 连接方法:

    set adocon=Server.Createobject("adodb.connection")
    .K[C9@6^|65703adocon.open"Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;"&_
    @rv8E2y65703"extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"

    11.MS text OLE DB 连接方法:

    set adocon=Server.Createobject("adodb.connection")
    8x}1m5oF_ft2P3U|65703adocon.open"Provider=microsof.jet.oledb.4.0;data source=your_path;"&_
    Wzi;n'N/J1d7K/v65703"Extended Properties'text;FMT=Delimited'"

    <二>。常用的四种SQL命令:

    1.查询数据记录(Select)
    5bD%o$c2a65703语法:Select 字段串行 From table Where 字段=内容
    +t&g Fa4^4J65703例子:想从book表中找出作者为"cancer"的所有记录,SQL语句便如下:
    y+` DQ+vt65703select * from book where author=’cancer’
    $t6D4N3NC65703"*"是取出book表所有的字段,如查询的字段值为数字,则其后的"内容"便无须加上单引号,

    如是日期,则在Access中用(#)包括,而在SQL server中则用(’)包括,
    du|m7C5Y65703如:

    select * from book where id=1
    "Y'EkmRX5R6bIu E65703select * from book where pub_date=#2002-1-7# (Access)51Testing软件测试网:~V6T6hl0Z7\
    select * from book where pub_date=’2002-1-7’ (SQL Server)

    提示:51Testing软件测试网1w(t/f1G3V#d"t)Yp
    日期函数to_date不是标准sql文,不是所有的数据库适用,所以大家在使用的时候要参考数据库具体语法

    另外如果是查询传入的变量,则如下:

    strau=request.form("author")
    *~M*Vd1gycK0C,m65703strsql="select * from book where author=’"&strau&"’"

    如果查询的是数字,则:

    intID=request.form("id")51Testing软件测试网/?G/w{;H8LV3LA
    strsql="select * from book where id="&intID

    在很多数据库中,如:oracle,上面的语句是可以写成:
    y/o&G8Mt2S gFK.xt9|65703strsql="select * from book where id='"&intID&"'"的。51Testing软件测试网U,tV%{(uIk$Q2l8aw
    但是字符型一定不能按照数字格式写,需要注意。

    2.添加记录(Insert)
    !Rt'Q9a.D9r.UPp?pD65703语法:Insert into table(field1,field2,....) Values (value1,value2,....)51Testing软件测试网#W(F bk$C,fp
    例子:添加一作者是"cancer"的记录入book表:
    "L fj7PRX8P@M65703insert into book (bookno,author,bookname) values (’CF001’,’cancer’,’Cancer无组件上传程序’)51Testing软件测试网tp [(T/s3J m[
    同样,如果用到变量就如下:

    strno=request.form("bookno")
    ps7Pj2i/Wy4}3s65703strau=request.form("author")
    nx~N)m\Ha9V65703strname=request.form("bookname")
    W#mmpXSc65703strsql="insert into book (bookno,author,bookname) values (’"&strno&"’,’"&strau&"’,’"&strname&"’)"

    3.用Recordset对象的Addnew插入数据的方法:51Testing软件测试网1y(xv Y9lgf)c*A?
    语法:

    rs.addnew
    3yC)j#F NUFt65703rs("field1").value=value151Testing软件测试网U.?W ~-h8p4i1b
    rs("field2").value=value251Testing软件测试网2}nNY*CjY
    ...
    :}t:U"go)P,^u Q65703rs.update

    4.修改数据记录(Update)51Testing软件测试网(N]is j+l8A2U
    语法:update table set field1=value1,field2=value2,...where fieldx=valuex51Testing软件测试网|#Po+r"Xq"ADf+c%Q
    例子:update book set author=’babycrazy’ where bookno=’CF001’
    N i [UZz1ntM Q'S65703如果用到变量就如下:

    strno=request.form("bookno")51Testing软件测试网%G2\e Hb Q/G
    strau=request.form("author")51Testing软件测试网`0@g _ ^B ~d
    strsql="update book set author=’"&strau&"’ where bookno=’"&strno"’"

    5.Recordset对象的Update方法:51Testing软件测试网f+`M;Hc(K|f R-V nu
    语法:

    rs("field1").value=value1
    tP.mH zM|/l65703rs("field2").value=value2
    $`l3ma$E65703...
    -\*L}s#U#W+zPZ,w65703rs.update

    注意:使用语法3和语法5的时候,一定要注意字段的类型(尤其是日期型)一致,否则出错的几率非常的高。

    51Testing软件测试网k9r7u\1`#[ zHL
    例子:

    strno=request.form("bookno")
    c8Aez/c U65703strau=request.form("author")
    4jVi ?p hl65703set adocon=server.createobject("adodb.connection")
    +~p;B2B f3n65703adocon.open "Driver={Microsoft Access Driver(*.mdb)};DBQ=" & _51Testing软件测试网 w0FOb\5P}R
    Server.Mappath=("/cancer/cancer.mdb")51Testing软件测试网;U b(wGb|GC(r
    strsql="select * from book where bookno=’"&strno&"’"51Testing软件测试网G CNp3~
    set rs=server.createobject("adodb.recordset")
    DpyqEx([j65703rs.open strsql,adconn,1,351Testing软件测试网N*?~5g/j[
    if not rs.eof then ’如果有此记录的话
    9h2~+v%]P/P65703rs("author").value=strau51Testing软件测试网.v9PQP@4W/z)K v
    rs.update
    *B1g4L'z)V65703end if
    2]7X x&IF%Ykbj65703rs.close51Testing软件测试网o Eq| DbX*|&s*T
    set rs=nothing51Testing软件测试网$Rb/kO[ g
    adocon.close51Testing软件测试网6MQS"A0RK
    set adocon=nothing

    6.删除一条记录(Delete)
    ,Bg-QMP65703语法:Delete table where field=value
    j Q7{U2O1wY65703例子:删除book表中作者是cancer的记录

    delete book where author=’cancer’

    (注意:如果book表中author字段的值为cancer的记录有多条,将会删除所有author为cancer的记录)

     

  • 用存储过程写随机生成100个用户名和密码

    2007-06-09 08:42:31

    2007-05-25 15:56:50 / 个人分类:SQL

    CREATE PROCEDURE [dbl].[CreateRandUser]
    z JV"T*tg dE&Pw65703AS
    _|\!HN~ ~x65703
    ^3w/h[%N{)C\{65703--生成随机用户名密码51Testing软件测试网7M eju [.L
    --创建测试环境
    f)@ gXsB65703set nocount on
    osIMj ~0i65703
    /J+KWO#tp/GWB65703--创建字符集
    \-jE6b1d65703create table #1
    2y;n]&YlH65703(51Testing软件测试网gs-MQM H!lG{
         [rnum] varchar(5)
    Q:hh$?l"?w65703)51Testing软件测试网(w?Qx H6q a
    declare  @i  int
    oL?8n0Qms-g!a@65703set @i=0
    [+|J_NR*T&N65703
    TI{p]d$]65703--插入0-9十个数字,不需要数字可注释下面代码
    )A%^^1{Np3\65703while @i<10
    3p+G n"sTcE&n*]65703begin
    X)A{PZ_/Hl`S65703     insert #1 select @i51Testing软件测试网+eq~N5i%y
         set @i=@i+151Testing软件测试网 PjBnly
    end51Testing软件测试网,`L|caJ@}n
    --插入A-Z26个字母51Testing软件测试网[_2V`x*G Hf;o6p
    set @i=ascii('A')51Testing软件测试网1j Z+IRd8ij.[6e
    while @i<=ascii('Z')
    Eh }$^ag65703begin51Testing软件测试网*GpR.p(sd OF
        insert #i select char(@i)51Testing软件测试网 P A+om)r*Cq/X
        set @i=@i+1
    BeMf U(\65703end
    D(^8Ck.n X9_ D/A;MN65703--创建目标表存储过程
    (~"|'P2ilW{65703create table Result51Testing软件测试网 gx-L k!` x
    (
    2p JEC/F65703     ID int identity,username varchar(50),pwd varchar(50)51Testing软件测试网C k] j{+q3?
    )51Testing软件测试网(Ax)B)ONm2h
    --插入数据
    l|+~,D&E/c(I:VG)]&e-g65703declare @tmpuser varchar(100)
    Z%at8FA6y#E65703declare @tmppwd varchar(100)
    7K!qjK ao`65703select @tmpuser='',@tmppwd='',@i=1
    "F!pF e[5qax0IZ65703while @i<=100                   --生成100条结果集
    2H2u&[PioZV65703begin
    js2guKX a65703    select @tmpuser=@tmpuser+rnum from (select top 5 rnum from #1 order by newid())A51Testing软件测试网p4[#R-iBf$q3B
        select @tmppwd=@tmppwd+rnum from (select top 5 rnum from #1 order by newid())A51Testing软件测试网R2A"u"hP
        insert Result(username,pwd) select 'admin_'+@tmpuser,'pwd_'+@tmppwd51Testing软件测试网Ml FDa ~%H!H$X
        set @i=@i+1
    2D$Aj~P_~0||65703    set @tmpuser=''
    7Sx6{p eXe65703    set @tmppwd=''51Testing软件测试网&~ Qd4Q.mR;s:D
    end

    --查看
    F+G,A8w8j9m_:WC65703select * from result51Testing软件测试网 i/`[&rK0hSo
    --删除测试环境
    Q@)x*~bk'~65703drop table #151Testing软件测试网"| K7K!_0NQ/J-m|
    go


  • 在asp中调用存储过程的几种方法

    2007-06-09 08:41:18

    2007-05-26 10:03:50 / 个人分类:ASP

    1 这也是最简单的方法,两个输入参数,无返回值:51Testing软件测试网$P(hF G+RWUC^
    set connection = server.createobject("adodb.connection")51Testing软件测试网L&s8]$JST y
    connection.open someDSN 51Testing软件测试网c7oAN4\g]p
    Connection.Execute "procname varvalue1, varvalue2"

    '将所有对象清为nothing,释放资源51Testing软件测试网"U"NJntq Fw
    connection.close51Testing软件测试网~dHAt*oa9g&X
    set connection = nothing

    51Testing软件测试网 _R)H$p ^Z i
    2 如果要返回 Recordset 集:51Testing软件测试网-R-vB7s!k#vf
    set connection = server.createobject("adodb.connection")51Testing软件测试网 MG bk;`:^
    connection.open someDSN
    aWIl;G#ll65703set rs = server.createobject("adodb.recordset")
    '{+z-ul4U,k*[/C6U65703rs.Open "Exec procname varvalue1, varvalue2",connection

    '将所有对象清为nothing,释放资源51Testing软件测试网1y$C;L3~7syI z`-h$k Y
    rs.close51Testing软件测试网#E3R@C1n+W;]-U
    connection.close51Testing软件测试网\](`#M W4|MwJ-J
    set rs = nothing
    MV@d9kz65703set connection = nothing

    51Testing软件测试网 SG$|aBC:T5Ru,r
    3 以上两种方法都不能有返回值,(Recordset除外),如果要得到返回值,需要用Command的方法。51Testing软件测试网#fy^,J+i
    首先说明,返回值有两种。一种是在存储过程中直接return一个值,就象C和VB的函数返回值那样;另一种是可以返回多个值,存储这些值的变量名称需要在调用参数中先行指定。
    F(b/rwz8kWuG)r65703这个例子要处理多种参数,输入参数,输出参数,返回记录集以及一个直接返回值(够全了吧?)51Testing软件测试网4Zn9u{6K.X eB
    存储过程如下:

    use pubs51Testing软件测试网7ASJJw}
    GO

    -- 建立存储过程
    dS}%IL4BHTf65703create procedure sp_PubsTest

    -- 定义三个参数变量,注意第三个,特别标记是用于输出
    ^C"b6d#I4V~P65703@au_lname varchar (20), 51Testing软件测试网8{o_t-zB&Z
    @intID int,
    ,Z |ox(B"f0Qo'w7I3|65703@intIDOut int OUTPUT

    AS

    SELECT @intIDOut = @intID + 1

    SELECT * 51Testing软件测试网/Go @$Qr7~
    FROM authors 51Testing软件测试网V\Kb-\JP[J-WU
    WHERE au_lname LIKE @au_lname + '%'

    --直接返回一个值51Testing软件测试网8Gw8O:|ST];b:Q T
    RETURN @intID + 2

    51Testing软件测试网8W0E:eR^D8qhB^
    调用该存储过程的asp程序如下:

    <%@ Language=VBscrīpt %>
    %ml8y@^%[c!U J65703<%51Testing软件测试网,{!`3bz+oh
    Dim CmdSP
    s Y:H~5E7`+o65703Dim adoRS51Testing软件测试网5Z vpRJZ6rP
    Dim adCmdSPStoredProc51Testing软件测试网k| Ql2Ugq.K8vE#k
    Dim adParamReturnValue51Testing软件测试网:I SY8M?({+c7A
    Dim adParaminput51Testing软件测试网]!T/B+u#} x'b)CD A~
    Dim adParamOutput
    0b)agr Ok j,F65703Dim adInteger51Testing软件测试网w(]$^b$U
    Dim iVal
    fl$zj!u%v3|X65703Dim oVal
    0Y0V0?8F7J/U$aU65703Dim adoField
    3Q~7qr E(~ T l65703Dim adVarChar

    ‘这些值在 VB 中是预定义常量,可以直接调用,但在 VBscrīpt 中没有预定义
    ~"c!x4DN"}G%H(p65703adCmdSPStoredProc = 451Testing软件测试网,X9\n g:m7pJ+O6G b5W3L
    adParamReturnValue = 451Testing软件测试网 C!ihHCp
    adParaminput = 151Testing软件测试网8U;t/lZ6~N1w)hjw
    adParamOutput = 251Testing软件测试网9mecq[!F
    adInteger = 351Testing软件测试网hw}uZ"\X9}fk
    adVarChar = 200

    iVal = 551Testing软件测试网-L,h(bIp:eJi
    oVal = 3

    '建一个command对象51Testing软件测试网5c$CS&BE,j ` rd
    set CmdSP = Server.CreateObject("ADODB.Command")

    '建立连结51Testing软件测试网8|:z:u lKQ ?
    CmdSP.ActiveConnection = "Driver={SQL Server};server=(local);Uid=sa;Pwd=;Database=Pubs"

    '定义command 对象调用名称 51Testing软件测试网 va B+z2V J VG7D0{
    CmdSP.CommandText = "sp_PubsTest"

    '设置command调用类型是存储过程 (adCmdSPStoredProc = 4)51Testing软件测试网 Qxkn+o,[iO
    CmdSP.CommandType = adCmdSPStoredProc

    '往command 对象中加参数
    $c#`o'O,u3Yw65703'定义存储过程有直接返回值,并且是个整数,省缺值是4
    bjo;EOo&W65703CmdSP.Parameters.Append CmdSP.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue, 4)
    0D{0h!V~0f!LR65703'定义一个字符型输入参数51Testing软件测试网-b AZN]:|u4J
    CmdSP.Parameters.Append CmdSP.CreateParameter("@au_lname", adVarChar, adParaminput, 20, "M")
    [5vWB:Y#@&]%S"E.j|65703'定义一个整型输入参数51Testing软件测试网/ctuz:q[RN$i)y{0[/m
    CmdSP.Parameters.Append CmdSP.CreateParameter("@intID", adInteger, adParamInput, , iVal)
    +U7`crP+Eb65703'定义一个整型输出参数51Testing软件测试网"P$j0Pg \!\*hc
    CmdSP.Parameters.Append CmdSP.CreateParameter("@intIDOut", adInteger, adParamOutput, oVal)

    '运行存储过程,并得到返回记录集51Testing软件测试网bKw x~ ?:YU
    Set adoRS = CmdSP.Execute

    51Testing软件测试网$py,\-u&Q
    '把每个记录打印出来,其中的字段是虚拟的,可以不用管51Testing软件测试网[5CXKT,xaD
    While Not adoRS.EOF

    for each adoField in adoRS.Fields51Testing软件测试网v%g Yd FRJ)a gJE
    Response.Write adoField.Name & "=" & adoField.Value & "<br>" & vbCRLF51Testing软件测试网 @w!Zv.NCTr}
    Next51Testing软件测试网 Ky;y'?'O
    Response.Write "<br>"51Testing软件测试网)b/y{v"I A)|`
    adoRS.MoveNext51Testing软件测试网6os0m]-z7M P$gz
    Wend

    '打印两个输出值:51Testing软件测试网S'ruN+A Y
    Response.Write "<p>@intIDOut = “ & CmdSP.Parameters("@intIDOut").Value & "</p>"51Testing软件测试网{w@@s4D9|L ~
    Response.Write "<p>Return value = " & CmdSP.Parameters("RETURN_VALUE").Value & "</p>"


    %GI$gQ4t65703'大扫除51Testing软件测试网H0|6c uPIve
    Set adoRS = nothing
    "j-yKYv`{Cd.]f65703Set CmdSP.ActiveConnection = nothing
    lFLdR*Y7H65703Set CmdSP = nothing51Testing软件测试网 l'ou C2tz0WU!_
    %>

  • 修改版本的测试流程模版

    2007-06-09 08:37:35

    修改版本的测试流程模版

    ***测试任务

    一。测试环境
    (测试环境可能有很多机器,每个机器上也可能有很多测试版本,所以需要把这次用到的整套环境记录下来,下面是我所测试系统的环境模版)
    测试程序目录位置:
    数据库IP:
    后台IP:
    原始需求和修改内容文档位置:
    开发人员:(遇到问题时找谁问)
    测试时间:(好安排测试任务)

    二。原始需求
    (客户来函之类的,尽量避免使用开发人员编写的原始需求)

    三。修改内容
    (开发人员在测试版本中一般会写个modify文档,里面有具体修改的内容,如果没有该文档,只好麻烦你自己去问开发人员了然后记录下来)

    四。测试流程
    一)。需求理解
    (对原始需求文档不明确和不明白的地方询问相关人员之后在这里进行解释补充,做个记录防止忘记)
    二)。修改理解
    (对修改文档不明确和不明白的地方询问相关人员之后在这里进行解释补充,做个记录防止忘记)
    三)。测试范围及测试时间安排
    (规划好测试范围后,才好利用测试时间,保证测试整个进度正常)
    四)。测试用例设计
    分解测试功能模块:(功能模块A,功能模块B,..)
    (把需要测试的范围尽可能的划分出更小的功能模块,直到无法再细分为止)
    1.(功能模块A)
    功能点分解:(功能1,功能2,功能3,..)
    1)(功能1)
    需求和设计补充:(在测试过程中,有些功能细节部分不清楚的询问开发人员得到答案后在这里记录下来,或者是发现环境某些配置需要改动也记录下来)
    规则点:(功能的具体要求,为测试用例的设计提供依据,也可以称为测试点)
    观察点:(预期输出结果要看哪些地方正确才算测试通过?比如说某个数据库中的某个表有数据(不必写具体数据),某个后台中的某个文件变化了.如果没有必要写可以不写)
    测试数据:(对应于测试用例中的每一个用例,这里记录的是每个测试用例中使用到的输入数据和预期的输出数据,为了使测试用例简单易懂,记录测试数据是为了方便回归测试)
    用例编号   输入                                                   输出
    SC001    (不一定是真正的输入数据,可能是数据库某表中需要具备哪些数据)    (预期的结果具体数据)
    SC002
    测试用例
    (利用基本的黑盒测试方法,包括边界值,正常测试用例,备选测试用例,异常测试用例,错误推断等方法)
    用例编号     输入                          输出                      实际结果
    SC0001
    SC0002
    2)(功能2)
    需求和设计补充:
    规则点:
    观察点:
    测试数据:
    测试用例:
    用例编号     输入                          输出                      实际结果
    SCXXXX

    2.(功能模块B)
    (同上)

                          
    五)。测试用例执行及更新测试用例
    (若任务紧急,可以边写测试用例边执行测试,该项可以合并到上一步骤中去)
    六).回归测试
    (执行需要回归测试的测试用例)
    七)。BUG提交或问题
    1.BUG1(修改结果?)(在某个测试用例的实际结果中有写BUG1标记)
    2.BUG2(下一个版本再修改的原因?)

    五。经验总结
    (测试过程中,有什么新的测试想法,或者用了新的测试方法使得测试效率得到提高,都可以在这里记录下来,作为这次测试任务的经验收获)

  • 什么是javascript

    2007-06-09 08:35:44

    Javascrīpt是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的脚本语言。使用它的目的是与HTML超文本标记语言、Java 脚本语言(Java小程序)一起实现在一个Web页面中连接多个对象,与Web客户交互作用。从而可以开发客户端的应用程序 等。它是通过嵌入或调入到标准的HTML语言中实现的。它的出现弥补了HTML语言的缺陷,它是Java与HTML折衷的选择,具有以下几个基本特点:

    1、是一种脚本编写语言
    Javascrīpt是一种脚本语言,它采用小程序段的方式实现编程。像其它脚本语言一样,Javascrīpt同样已是一种解释性语言,它提供了一个易的开发过程。它的基本结构形式与C、C++、VB、Delphi十分类似。但它不像这些语言一样,需要先编译,而是在程序运行过程中被逐行地解释。它与HTML标识结合在一起,从而方便用户的使用操作。
    2、基于对象的语言。
    Javascrīpt是一种基于对象的语言,同时以可以看作一种面向对象的。这意味着它能运用自己已经创建的对象。因此,许多功能可以来自于脚本环境中对象的方法与脚本的相互作用。
    3、简单性
    Javascrīpt的简单性主要体现在:首先它是一种基于Java基本语句和控制流之上的简单而紧凑的设计, 从而对于学习Java是一种非常好的过渡。其次它的变量类型是采用弱类型,并未使用严格的数据类型。
    4、安全性
    Javascrīpt是一种安全性语言,它不允许访问本地的硬盘,并不能将数据存入到服务器上,不允许对网络文档进行修改和删除,只能通过浏览器实现信息浏览或动态交互。从而有效地防止数据的丢失。
    5、动态性的
    Javascrīpt是动态的,它可以直接对用户或客户输入做出响应,无须经过Web服务程序。它对用户的反映响应,是采用以事件驱动的方式进行的。所谓事件驱动,就是指在主页(Home Page)中执行了某种操作所产生的动作,就称为“事件”(Event)。比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后,可能会引起相应的事件响应。
    6、跨平台性
    Javascrīpt是依赖于浏览器本身,与操作环境无关,只要能运行浏览器的计算机,并支持Javascrīpt的浏览器就可正确执行。从而实现了“编写一次,走遍天下”的梦想。实际上Javascrīpt最杰出之处在于可以用很小的程序做大量的事。无须有高性能的电脑,软件仅需一个字处理软件及一浏览器,无须WEB服务器通道,通过自己的电脑即可完成所有的事情。

    综合所述Javascrīpt是一种新的描述语言,它可以被嵌入到HTML的文件之中。Javascrīpt语言可以做到回应使用者的需求事件(如:form的输入),而不用任何的网路来回传输资料,所以当一位使用者输入一项资料时,它不用经过传给伺服端(server)处理,再传回来的过程,而直接可以被客户端 (client) 的应用程式所处理。


  • 网页常用小技巧

    2007-06-09 08:34:06

    2007-06-01 14:34:46 / 个人分类:javascrīpt

    1.oncontextmenu="window.event.returnValue=false"将彻底屏蔽鼠标右键51Testing软件测试网{ u JDA7MQ
      <table border ōncontextmenu=return(false)><td>no</table>可用于Table

    2.<body ōnselectstart="return false">取消选取、防止复制

    3.onpaste="return false"不准粘贴

    4.oncopy="return false;" ōncut="return false;"防止复制

    5.<link rel="Shortcut Icon" href="favicion.ico">IE地址栏前换成自己的图标

    6.<link rel="Bookmark" href="favicion.ico">可以在收藏夹中显示出你的图标

    7.<input style="ime-mode:disabled">关闭输入法

    8.永远都会带着框架
    .C"rO&j ]EB65703<scrīpt language="Javascrīpt">51Testing软件测试网)})g#h$T'Y \ S A4]z
    <!--51Testing软件测试网u`!q7s Vu&[f
    if(window==top)top.location.href="frams.htm";//frames.htm为框架网页51Testing软件测试网 L g;ek^Rv`M
    //--></scrīpt>

    9.防止被人frame
    %VQR.y5eDx7v"U#s65703<scrīpt language=javascrīpt>51Testing软件测试网r0wb,t2o.n9m$m
    <!--
    YT[ C _b5s.p!E;_65703if(top.location!=self.location)top.location=self.location;
    #N+h sg P CGU65703-->
    pW"hZ?f k"R65703</scrīpt>

    10.网页将不能被另存为51Testing软件测试网(}2bs `~ F
    <noscrīpt><iframe src=*.html><iframe></noscrīpt>

    11.<input type=button value=查看网页源代码 ōnclick="window.location="view-source:"+http://www.51.js.com/">

    12.删除时确认
    +O2B"dC,m4Rt9@65703<a href="javascrīpt:if(confirm("确实要删除吗?"))location="boos.asp?&areyou=删除&page=1"">删除</a>

    13. 取得控件的绝对位置51Testing软件测试网&ur7YlHqt
    //Javascrīpt
    3C3E&H2^[x"V%t65703<scrīpt language="Javascrīpt">
    Xjx}0f1i65703function getIE(e){51Testing软件测试网+_ wis$x/Pf4s?!l
    var t=e.offsetTop;
    v(I2a+RKf;k'd@@65703var l=e.offsetLeft;51Testing软件测试网q(g2H"|-z*CGF \
    while(e=e.offsetParent){
    o u$E4f5O65703t+=e.offsetTop;51Testing软件测试网*Z!L)w#H ZAR
    l+=e.offsetLeft;
    /v/},k&e}F ~5k r65703}
    T+yq.x0H5@.C(i:W%q65703alert("top="+t+"/nleft="+l);
    f#U ~z }Syc65703}51Testing软件测试网xbuH+_#j,a/I?
    </scrīpt>

    //VBscrīpt51Testing软件测试网7bPt.q|
    <scrīpt language="VBscrīpt"><!--
    B7M\|b/g:[y2x65703function getIE()
    6l)_ pw9S65703dim t,l,a,b
    x%_6KBX)|65703set a=document.all.img1
    3B0s9G EP-V65703t=document.all.img1.offsetTop51Testing软件测试网5A+o ~];tu5S
    l=document.all.img1.offsetLeft51Testing软件测试网*usw U~km
    while a.tagName<>"BODY"
    l ``SQ3A8nB65703set a = a.offsetParent51Testing软件测试网L e/Li Dhsd
    t=t+a.offsetTop
    1p#g*br2T![1M$T+D65703l=l+a.offsetLeft
    q-cJb0X y+LZ65703wend
    y} wwHk0DK65703msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"51Testing软件测试网)S YkY w }'bu6g$j
    end function
    /I c_-T,fxmI65703--></scrīpt>

    14. 光标是停在文本框文字的最后
    Be-zi7S0w3`65703<scrīpt language="javascrīpt">
    r/Z1h$X~t7hc65703function cc()
    3T&Bw9B g3K D#`5W)X"m },t65703{51Testing软件测试网,fJ~:OF2}eH
    var e = event.srcElement;
    ykU9B0~(a&{Z5B65703var r =e.createTextRange();51Testing软件测试网3?!CEB3g Hd"P*Y(g
    r.moveStart("character",e.value.length);
    %Hxwg#r`|:?gL6K65703r.collapse(true);51Testing软件测试网a2h}5Y9p3?n
    r.select();
    @-gW8`o*Wl65703}51Testing软件测试网3MTx {4^,o;X*o S.|
    </scrīpt>51Testing软件测试网;}W8fvb!Q2N
    <input type=text name=text1 value="123" ōnfocus="cc()">

    15. 判断上一页的来源
    -bN Qn Wd+b65703javascrīpt:
    K[H$ZIf}E&a65703document.referrer

    16. 最小化、最大化、关闭窗口51Testing软件测试网'A2k ]u`u
    <object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
    \ N#u'W%Y7[ r?CX%F-|65703<param name="Command" value="Minimize"></object>
    7h$s)o6K Pp/i N:q)X65703<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
    $\[yj E,T!D65703<param name="Command" value="Maximize"></object>51Testing软件测试网 o8i*l m*d
    <OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
    P/p%`y5V8L(b65703<PARAM NAME="Command" VALUE="Close"></OBJECT>

    <input type=button value=最小化 ōnclick=hh1.Click()>
    _[,X7k6f F/\65703<input type=button value=最大化 ōnclick=hh2.Click()>51Testing软件测试网F2j hovm!T7h{j
    <input type=button value=关闭 ōnclick=hh3.Click()>51Testing软件测试网"XW f4|5S:L#Pu
    本例适用于IE

    17.屏蔽功能键Shift,Alt,Ctrl51Testing软件测试网O$cC"@ ` O/e"e
    <scrīpt>51Testing软件测试网w*n(OYV%A"^
    function look(){ 51Testing软件测试网(bfi V3x*f
    if(event.shiftKey)
    gud l8W qM7U65703alert("禁止按Shift键!"); //可以换成ALT CTRL51Testing软件测试网H q$GL6C
    } 51Testing软件测试网:D2qb:H.~c6r
    document.onkeydown=look;
    Dz?c5cs(i65703</scrīpt>

    18. 网页不会被缓存51Testing软件测试网Z+aAX9o[-j7M"W&R-F
    <META HTTP-EQUIV="pragma" CONTENT="no-cache">
    i V;~ bbS'z#q65703<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
    EF1|xGF65703<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">51Testing软件测试网'Rw?1R!L"}zJL c%E"b
    或者<META HTTP-EQUIV="expires" CONTENT="0">

    19.怎样让表单没有凹凸感?51Testing软件测试网 W3u*kuDV$I
    <input type=text style="border:1 solid #000000"> 51Testing软件测试网!n/YST'e i,bt

    6GzBXY65703<input type=text style="border-left:none; border-right:none; border-top:none; border-bottom: 1 solid #000000"></textarea>

    20.<div><span>&<layer>的区别? 51Testing软件测试网P dB@,K8sL
    <div>(division)用来定义大段的页面元素,会产生转行
    @%jly-J5s!L65703<span>用来定义同一行内的元素,跟<div>的唯一区别是不产生转行 51Testing软件测试网 o lXgp [^ z7E
    <layer>是ns的标记,ie不支持,相当于<div>


    ,z6p-^8P1d$OW/^6570321.让弹出窗口总是在最上面:51Testing软件测试网bq lrht \,F9S
    <body ōnblur="this.focus();">

    22.不要滚动条?
    Xe6j#l(p ?65703让竖条没有: 51Testing软件测试网&w&p0^{Y&`Q4RW
    <body style="overflow:scroll;overflow-y:hidden"> 51Testing软件测试网2d0S6[7]| x,k
    </body>
    7a/xh4d2{ u65703让横条没有:
    J4zR3N+W(r;|65703<body style="overflow:scroll;overflow-x:hidden"> 51Testing软件测试网SR oK~$p
    </body> 51Testing软件测试网+Pt%iOA f-\
    两个都去掉?更简单了 51Testing软件测试网PR7Z4}.E1r @
    <body scroll="no"> 51Testing软件测试网1gshslO
    </body>

    23.怎样去掉图片链接点击后,图片周围的虚线?
    m%]Dv p!m+^65703<a href="#" ōnFocus="this.blur()"><img src="logo.jpg" border=0></a>

    24.电子邮件处理提交表单51Testing软件测试网 ile9GuBkOSW
    <form name="form1" method="post" action="mailto:****@***.com" enctype="text/plain"> 51Testing软件测试网0~/r)q^&@*eq
    <input type=submit>
    Dn9g/yt.F8{:Obf r65703</form>

    25.在打开的子窗口刷新父窗口的代码里如何写?51Testing软件测试网u)MO^{&`2Gx`
    window.opener.location.reload()

    26.如何设定打开页面的大小51Testing软件测试网E~#lR&E \9Jf
    <body ōnload="top.resizeTo(300,200);">51Testing软件测试网7\(XT!NdL(}\0W
    打开页面的位置<body ōnload="top.moveBy(300,200);">

    27.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动 51Testing软件测试网EF}:?O8_
    <STYLE>
    {`UY;l"SS65703body 51Testing软件测试网 \9a x*h1Q
    {background-image:url(logo.gif); background-repeat:no-repeat;

    background-position:center;background-attachment: fixed} 51Testing软件测试网[i a-\As
    </STYLE>

    28. 检查一段字符串是否全由数字组成
    X T9_:\0}65703<scrīpt language="Javascrīpt"><!--
    s,v:I5f ^j3g65703function checkNum(str){return str.match(//D/)==null}51Testing软件测试网'\`!wx9e2U-XGoT7Vy
    alert(checkNum("1232142141"))
    .`h _/[fA65703alert(checkNum("123214214a1"))
    ?/n.b*c j8\N _7c65703// --></scrīpt>

    29. 获得一个窗口的大小51Testing软件测试网1T7Zm5y1oW3OK
    document.body.clientWidth; document.body.clientHeight

    30. 怎么判断是否是字符51Testing软件测试网M,U4`['sv/qK/a
    if (/[^/x00-/xff]/g.test(s)) alert("含有汉字");51Testing软件测试网!i^!P i?:K&|n
    else alert("全是字符");

    31.TEXTAREA自适应文字行数的多少51Testing软件测试网!e5tr u"A_p9j1b.K
    <textarea rows=1 name=s1 cols=27 ōnpropertychange="this.style.posHeight=this.scrollHeight">
    (?5U?t7W,e:S65703</textarea>

    32. 日期减去天数等于第二个日期51Testing软件测试网;Uf*[MgT tlb W}
    <scrīpt language=Javascrīpt>
    4}7M/t~+ch(jA.qr65703function cc(dd,dadd)
    .T!m"yFO{h65703{
    7[9Dp~/R ?.i"L65703//可以加上错误处理51Testing软件测试网SC7FeB$~1s,\ u
    var a = new Date(dd)
    ]3K8oB}+P O65703a = a.valueOf()51Testing软件测试网Hh"AFD$| av QV4e
    a = a - dadd * 24 * 60 * 60 * 100051Testing软件测试网%~9Ew:L9?8A-k7S P
    a = new Date(a)51Testing软件测试网C w{$L etUnP
    alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")51Testing软件测试网RJ(EsrUe
    }
    o5ZXT1IX,b-LO65703cc("12/23/2002",2)
    S+s8_9l$If65703</scrīpt>

    33. 选择了哪一个Radio
    ]'vt[Ez_65703<HTML><scrīpt language="vbscrīpt">51Testing软件测试网}F:_;{#`
    function checkme()
    ]_P/Z\4g.C65703for each ob in radio1
    B? HSvQ-F7L65703if ob.checked then window.alert ob.value
    A0Joj Nh/~ ~65703next
    a2I"Qi9g65703end function51Testing软件测试网6`~0Y_0SSyt
    </scrīpt><BODY>51Testing软件测试网/Jqf j$Foy
    <INPUT name="radio1" type="radio" value="style" checked>Style
    +u Kv}7P d65703<INPUT name="radio1" type="radio" value="barcode">Barcode51Testing软件测试网 hnv)u2q?&k!j
    <INPUT type="button" value="check" ōnclick="checkme()">51Testing软件测试网0G{.l"[eq|o
    </BODY></HTML>

    34.脚本永不出错
    %V.Rb'l9|c [c#h7w0qc65703<scrīpt LANGUAGE="Javascrīpt"> 51Testing软件测试网G O'X2K C&`Ju;yI
    <!-- Hide
    ?A s8{/zrN65703function killErrors() {
    +\Zl XkW65703return true;
    :m6_9g0c z%}&f65703} 51Testing软件测试网2_X^\4?+V l
    window.onerror = killErrors; 51Testing软件测试网H6[5^Qp1lN
    // -->
    fD]xCOyo65703</scrīpt>

    35.ENTER键可以让光标移到下一个输入框
    m2J&kH_L65703<input ōnkeydown="if(event.keyCode==13)event.keyCode=9">

    36. 检测某个网站的链接速度:
    :SHu^_F/@65703把如下代码加入<body>区域中:51Testing软件测试网Pxm#t5h:CU8R
    <scrīpt language=Javascrīpt>51Testing软件测试网F"y-X0_2_:J}i
    tim=1
    $y#p$B~VF65703setInterval("tim++",100)
    ;xt[4Z Ps(ke(?65703b=1

    var autourl=new Array()
    :^!vq!v.JV1OX65703autourl[1]="www.njcatv.net"51Testing软件测试网,L6Z:i,e0y
    autourl[2]="javacool.3322.net"51Testing软件测试网+_QsRfV`
    autourl[3]="www.sina.com.cn"51Testing软件测试网7v$A7L+HX9J3M
    autourl[4]="www.nuaa.edu.cn"
    ej fMxPn65703autourl[5]="www.cctv.com"

    function butt(){
    u.ho"X%Rmx2j.w(s65703document.write("<form name=autof>")51Testing软件测试网;H8qP;fn
    for(var i=1;i<autourl.length;i++)
    7QS(B*c d3vjK65703document.write("<input type=text name=txt"+i+" size=10 value=测试中……> =》<input type=text name=url"+i+" size=40> =》<input type=button value=GO 51Testing软件测试网`#\gA |&}:~5M
    onclick=window.open(this.form.url"+i+".value)><br>")
    oh8GZ] s7t65703document.write("<input type=submit value=刷新></form>")
    "M.U7z1fA_4`-`65703}51Testing软件测试网+jB `:aNhG?(G
    butt()
    2g!@i$ZT9[$O4t65703function auto(url){
    +]$c3_Q4eZwb7f:`(_65703document.forms[0]["url"+b].value=url51Testing软件测试网C2r&M.Qkjn V
    if(tim>200)51Testing软件测试网Kf nv4Y'[.fAk5l3d
    {document.forms[0]["txt"+b].value="链接超时"}
    o%u"bf8W8Y|65703else
    wI L#R%EG3K6V65703{document.forms[0]["txt"+b].value="时间"+tim/10+"秒"}51Testing软件测试网`xV%q8m%P
    b++
    o ^(Jbr"_:r;UP65703}
    t1?J+^"Y A/p"f65703function run(){for(var i=1;i<autourl.length;i++)document.write("<img src=http://"+autourl+"/"+Math.random()+" width=1 height=1 ōnerror=auto("http://"+autourl+"")>")}
    zO(vg1I8Y|h7Vs]65703run()</scrīpt>

    37. 各种样式的光标
    B5?,x4O @+cS ^4D65703auto :标准光标51Testing软件测试网/Mmh6E9v2sm#[5\
    default :标准箭头
    ]$U2]Y*O"B65703hand :手形光标51Testing软件测试网S.\{#Qz$v`O1b#a
    wait :等待光标
    3rG0N+M AC7` M65703text :I形光标
    -Xs5_8R _]!p)I65703vertical-text :水平I形光标51Testing软件测试网 x.dkq~y
    no-drop :不可拖动光标
    G+L7PF@f6j!b65703not-allowed :无效光标51Testing软件测试网cA3U(J2ejQW'E,nF6i
    help :?帮助光标51Testing软件测试网g3G0P Gg
    all-scroll :三角方向标
    ES,P8k,PB65703move :移动标
    mx!U-H"I\#_2X65703crosshair :十字标51Testing软件测试网?1?(u1E3O
    e-resize
    pNuEoY"ej65703n-resize51Testing软件测试网5kH#e B*T {l
    nw-resize51Testing软件测试网y7S%As+[0B)Ti&r|
    w-resize
    {+Xs0`9dD65703s-resize51Testing软件测试网kiW/eADUl
    se-resize51Testing软件测试网IS;d%kBMB.n R3J
    sw-resize

    38.页面进入和退出的特效51Testing软件测试网*me%M"T4c_/J
    进入页面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
    s}H H"J e-X9n.b b8F65703推出页面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)"> 
    T*O$~C.zWBf65703这个是页面被载入和调出时的一些特效。duration表示特效的持续时间,以秒为单位。transition表示使用哪种特效,取值为1-23:51Testing软件测试网m6VRrK
      0 矩形缩小
    (o.Rxy3a QpA65703  1 矩形扩大 51Testing软件测试网Ca+BU*i j q5A
      2 圆形缩小51Testing软件测试网5G L4U(H!If [Ov
      3 圆形扩大 51Testing软件测试网4D\$b#Xs
      4 下到上刷新
    :Dr*Z v[/}]wX65703  5 上到下刷新
    "sJX?D6|h(E x Yy65703  6 左到右刷新
    FB:Qyu6|-Z65703  7 右到左刷新
    %FJr9h`"v0l:k EXoZ65703  8 竖百叶窗51Testing软件测试网&[%?E,[\
      9 横百叶窗
    #z7x-_4z$}7x([V65703  10 错位横百叶窗
    %J dp*VHZ$Cp65703  11 错位竖百叶窗51Testing软件测试网'P)t%l7x%T&G
      12 点扩散
    8mB~k]65703  13 左右到中间刷新 51Testing软件测试网ns oR/}8aSV T
      14 中间到左右刷新51Testing软件测试网 D/p"UB n8] wD
      15 中间到上下
    ]8zf8DS"c65703  16 上下到中间 51Testing软件测试网M)S;O_F-h$p G
      17 右下到左上51Testing软件测试网-bo1A/fr/zS9iY
      18 右上到左下 51Testing软件测试网#ri ~o?T7od-~
      19 左上到右下 51Testing软件测试网 ]sr n ^ @oV
      20 左下到右上51Testing软件测试网$J8]f:Y2bLD
      21 横条
    8H9t;nI r*K65703  22 竖条 51Testing软件测试网} A OH'|_9v
      23 以上22种随机选择一种

    39.在规定时间内跳转
    \3W"y"^ _65703<META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com">

    40.网页是否被检索
    5z6t)G c2Y65703<meta name="ROBOTS" content="属性值">
    3D/mo9H]W4b:[#X+n65703  其中属性值有以下一些:51Testing软件测试网9CU9i&v~*] Qg
      属性值为"all": 文件将被检索,且页上链接可被查询;51Testing软件测试网e G-| Z)d
      属性值为"none": 文件不被检索,而且不查询页上的链接;
    qko k EG1YbP7S65703  属性值为"index": 文件将被检索;51Testing软件测试网EMVr$Xs(N~/q
      属性值为"follow": 查询页上的链接;51Testing软件测试网j){g9? D*w_
      属性值为"noindex": 文件不检索,但可被查询链接;51Testing软件测试网 ?i8m"D%W u'E*u^ td {
      属性值为"nofollow": 文件不被检索,但可查询页上的链接。

  • 分页存储过程

    2007-06-09 08:32:50

    2007-06-05 15:59:09 / 个人分类:ASP


    &b*Jt$SZ7LR65703create procedure sp_search

    @tblName   varchar(255),       -- 表名

    @strGetFields varchar(1000) = '*',  -- 需要返回的列

    @fldName varchar(255)='',      -- 排序的字段名

    @PageSize   int = 10,          -- 页尺寸

    @PageIndex  int = 1,           -- 页码

    @doCount  bit = 0,   -- 返回记录总数, 非 0 值则返回

    @OrderType bit = 0,  -- 设置排序类型, 非 0 值则降序

    @strWhere  varchar(1500) = ''  -- 查询条件 (注意: 不要加 where)

    AS

    declare @strSQL   varchar(5000)       -- 主语句

    declare @strTmp   varchar(110)        -- 临时变量

    declare @strOrder varchar(400)        -- 排序类型

     

    if @doCount != 0

    begin
    j5t8hB^CB0]E0E\PK65703 
    }T,f7Q&?Y/p)q65703    if @strWhere !=''
    %h2? ru!`65703 51Testing软件测试网 md)h.f|J%Z.|s5uT
            set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere
    E g-@*F+G65703 
    }&g7{,E6b3fw ^c65703    else
    V7pXPh:P&C|65703 
    f-t0x^%Hm Gg!Z65703        set @strSQL = "select count(*) as Total from [" + @tblName + "]"

    end 

    --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况

    else

    begin

     

        if @OrderType != 0

        begin

            set @strTmp = "<(select min"

            set @strOrder = " order by [" + @fldName +"] desc"

            --如果@OrderType不是0,就执行降序,这句很重要!

        end

        else

        begin

            set @strTmp = ">(select max"

            set @strOrder = " order by [" + @fldName +"] asc"

        end

     

    if @PageIndex = 1

    begin

        if @strWhere != ''  

        set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from [" + @tblName + "] where " + @strWhere + " " + @strOrder

         else

         set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from ["+ @tblName + "] "+ @strOrder

    --如果是第一页就执行以上代码,这样会加快执行速度

    end

    else

    begin

    --以下代码赋予了@strSQL以真正执行的SQL代码

    set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from ["

        + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder

     

    if @strWhere != ''

        set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from ["

            + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["

            + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["

            + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "

            + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder

    end

    end  

    exec (@strSQL)

    GO

  • IP网络的测试方法

    2007-06-09 08:28:47

    随着IP附应用时及和深入,IP网络的建设、维护和故障诊断面临着巨大的挑战:网络的规模越来越大、组成网络的设备越来越复杂、在网络中运行的软件系统越来越庞大、网络承载的业务越来越多.

      网络测试是保证网络高性能、高可靠性和高可用率的基本手段,它在IP网络建设和发展中的重要意义正得到日益广泛的认可。

    网络测试

      网络是一个很复杂的系统,通常人们把网络分为不同的层次予以简化。在网络测试中,我们可以把网络分为3个不同的层次:设备层、系统层和应用层,因此网络测试正是轩对这3个层次来进行的。

      网络设备测试主要包括功能测试、性能测试、一致性和互通性测试等几个方面。网络系统测试包括物理连通性、基本功能和一致性的测试、网络系统的规划验证测试、性能测试、流量测试和模型化等。网络应用测试是测试网络系统支持各种应用的能力。完整的网络测试包含完成上述3个层次的所有测试。

      网络测试主要包括测试方法、
    测试工具和测试经验等3个方面的内容。无论是测试方法的设计、测试工具的发明和运用还是测试经验的积累,都有很高的技术要求,其中测试方法是核心。网络测试的方法和手段因测试的目的而有所不同。典型的网络设备测试的方法有2 种:第一种方法是使用网络测试设备单独对产品进行测试;第二种方法是将设备放在具体的网络环境中,通过分析该产品在网络中的行为对其进行测试,这种网络环境多数是用仿真的方式实现的。测试工具主要有线缆测试仪、协议分析仪和网络智能分析仪等。实际的网络在设备、拓扑、管理维护等各方面千差万别,可能出现的问题也是五花八门的,测试人员除了要掌握必须的网络知识外,还需要有丰富的系统集成和现场测试的经验。

      网络系统的建设一般经历规划、设计、部署、运行和升级五个阶段。网络测试应贯穿其中的每个阶段。由于技术或者经济的原因,实际网络测试的应用和理论上还有较大的差距。无论从经济的角度还是从时间的角度来看,用户都很难自己来完成所有的测试。用户在选购设备时可以参照由设备提供商提供的第三方测试机构对其设备的测试报告,依据测试报告和自身的需求选择设备。在网络设计施工完成之后,应该由施工单位以外的测试机构对网络进行网络系统测试,以检验工程质量。最后在试运行阶段对网络承载业务和应用的能力进行测试,即进行网络的应用测试。但是, 我国网络测试起点较低,虽然已经成立,了多家开展网络测试的机构,但至今还没有形成相对比较权威的网络测试机构,我国的网络
    测试技术和市场都有待发展。

    IP网络的
    测试技术

      IP网络测试和上述所有的网络测试一样,包括对网络设备层、系统层和应用层的测试。与其它网络测试不同的是:(1)IP网络中的设备与电信网中的设备在性能、安全性和稳定性方面有较大的区别,它们原先更多的是用于计算机互联的设备;(2)IP网络是IP网络测试的目标,它的网络层协议采用IP协议,IP 协议并不保证网络数据的可靠性,它采用“尽力而为”的方式转发数据包;(3)IP网络以传输数据业务为主,业务高很高的突发性,IP网络几乎可以承载任何业务,因此网络应用层的测试比较复杂。

    IP网络设备测试

      我们就以太网交换机的测试为例说明具体的网络设备测试。

      首先要分析交换机的物理特性,即对诸如外观(包括颜色、重量、尺寸和包装等)、端口配置、扩展能力等用户可以直接了解的设备信息的测试,主要的测试方法是目测。这些参数和交换机本身的功能和性能没有关系,但是对用户来说则很重要,将直接影响用户对设备的评价。一款颜色:搭配不和谐、尺寸很大的交换机,显然不会成为用户优先选择的目标。

      进一步的测试需要一台带有收发端口的测试仪。测试仪与被测交换机有两种连接方法。

      在第二种连接方式下,如果测试仪(发送)和测试仪(接收)之间没有计算机的控制,则无法完成部分精度要求较高的测试项和在发送与接收之间有时间或逻辑关系要求的测试顶,如流量测试等。

      在测试仪与被测设备连接完成以后,在开始测试之前,还要首先配置被测的交换机,包括对软件和硬件的配置,特别是配置交换机支持的协议并予以激活。

      首先是对交换机进行功能测试,目的是检测设备是否能够完成交换机这类设备所应具备的功能,如帧的转发、过滤、流量控制、VLAN、生成树协议等。

      接着进行性能测试,目的是了解交换机完成各项功能时的性能情况。交换机性能测试的参数包括吞吐量、时延、帧丢失率、处理背靠背数据帧的能力、地址缓冲容量、地址学习速率等。RFC1242和RFC2285分别定义了网络互联设备和LAN交换设备测试的基准术语,RFC2544和RFC2889则分别定义了网络互联设备和LAN交换设备测试的基准方法。这几个RFC是测试网络设备时参考的标准。

      完成上述测试之后,需要进行一致性和互通性测试,以验证交换机是否符合各项规范的要求,包括协议的一致性,确保交换机和其他的网络设备进行互联时不会出现问题。

      对交换机设备的测试最终应提供一份完整的测试报告,测试报告对在这次测试中的测试对象、
    测试工具、测试环境、测试内容、测试结果等进行详细论述。测试报告中包括对各测试项目的测试结果,应以数字、图形、列表等方式记录下来。完整、客观的设备测试报告是购买设备的重要参考。

    IP网络系统测试

      IP网络系统测试的第一步是了解所测网络的状况,包括网络所属单位的情况、网络设备情况、网络主要应用、使用该网络的人员情况、网络中存在的问题等等。对网络状况的调查可以明确测试的对象、目的、要求等,为制定详细的测试方案做好准备,对网络设备的调查可以为所测网络建立详细的网络文档。网络文档的内容包括网络拓扑结构图,路由器和交换机的生产厂家、型号、内部参数配置,服务器和工作陆的生产厂家、型号、内存、硬盘、网卡的序列号和MAC地址等,IP地址、防火墙和操作系统参数配置等。

      了解了网络基本状况后,就可以根据测试要求拟定详细的测试方案。

      物理连通性、基本功能和一致性的测试是最基本的网络系统测试内容,其中主要是线缆测试,用以查明所测线缆及布线是否符合设计要求和国际标准。如果线缆的安装不符合各类标准,就应该绘出具体的各种类型电缆管脚的连接图。

      模拟和仿真是规划验证测试的两个基本手段。模拟即用软件的方法建立虚拟的网络系统及其运行模型,通过设置配置参数模拟实际环境下的网络运行,并给出对该网络的评价。仿真则是建立真实的试验环境来模拟实际的网络运行。模拟和仿真对大型网络的规划设计很有意义,它可以在网络实际建设之前了解网络的特性,或者发现规划设计中的缺陷,大大降低网络建设的风险。但是模拟和仿真本身需要许多资金和时间,因此在网络建设中各单位会参照具体情况来决定是否要做这项测试。

      性能测试可以分为被动测试和主动测试。被动测试就是用仪表监测网络中的数据,通过分析采集到的数据判断网络性能状况。被动测试在不影响网络正常工作的情况下测试。主动测试通过向网络中发送特定的数据包来分析网络系统的性能。不论是被动测试还是主动测试,都需从网络中采集数据。一个IP网络系统可以分为物理层、数据链路层、网络层和应用层。IP网络系统的性能测试应该分别针对物理层、数据链路层和网络层进行。如以太网,物理层的测试包括碰撞分析、错误统计和是否有随机能量、无格式的帧和信号回波等,数据链路层的测试包括流量分析、错误帧(FCS错误帧、长帧、短帧和延迟碰撞)统计等,网络层的测试包括响应时间测试、网络层协议分析、IP路由分析等。

      流量测试和模型化的工作有利于提高整个网络的运行效率,其中涉及到运用一些很深的数学工具和丰富的网络经验,许多关键技术还有待研究。

    IP网络应用测试

      完成IP网络设备测试和系统测试之后就可以在网络上加载各种应用,各种网络应用的性能水平与网络的类型、网络本身的性能有直接关系。IP网络应用测试是 IP网络测试中最高层次的测试内容,主要测试IP网络对应用的支持水平,如网络应用的性能和服务质量的测试等。另外,IP网络应用测试和网络应用本身直接相关,对于不同的网络应用,有不同的测试内容和测试方法。在部署VoIP时,需要测试网络中的交换机和路由器设备能否有效地支持语音流量和语音QoS等, 在测试用于视频传输的网络时,需要测试视频传输在IP网络中的性能以及网络用户是否能够得到满意的视频质量等。
Open Toolbar