日历

« 2008-10-08  
   1234
567891011
12131415161718
19202122232425
262728293031 

统计信息

  • 访问量: 2777
  • 日志数: 30
  • 文件数: 2
  • 建立时间: 2007-04-16
  • 更新时间: 2008-05-16

RSS订阅

欢迎加入论坛 http://51test.5d6d.com 分享测试经验. MSN: luxuabc@hotmail.com

我的最新日志

  • 在IIS上配置SSL服务

    2008-5-16

    在测试web应用的时候经常会测试HTTPs的联接情况。这是就需要自己搭建HTTPS服务器,这里讲述如何用IIS6.0搭建HTTPS服务。创建一个服务器证书是简单的,IIS的向导就可以完成这个功能。但是创建出的证书并没有经过CA认证,所以Brower在访问的时候,首先会出现警告。要模拟正常工作的情况,最好自己创建一个CA,然后再用这个CA去签名服务器证书,这样就可以了。 主要步骤是:

    1. 下载并安装openssl windows版本。

    2. 创建CA。

    openssl req -x509 -newkey rsa:1024 -keyout cakey.pem -out cacert.pem

    然后将cakey.pem放在apps\demoCA\private\下,把cacert.pem放在apps\demoCA\下。

    3. 用IIS的certificate向导产生一个证书申请,certreq.txt. 注意证书申请时的Country要与生成CA时候选择的相同,同时Common name选项就是你的服务器DNS name。

    4. 用第2步生成的CA来签名证书

    openssl ca -in certreq.txt -out server.pem

    5. 把pem格式转换为X509格式

    openssl x509 -in server.pem -out server.cer

    6. 在IIS server中继续完成证书配置。

    7. 将CA的证书转换为x509格式:

    openssl x509 -in cacert.pem -out cacert.cer

    8. 将cacert.cer导入Browser中。

    现在就可以用https访问服务器了,并且不会出现警告窗口。


  • Windows NLB cluster配置要点

    2008-4-21

        在Web测试过程中,往往需要对服务器进行负载平衡,Windows Server本身就提供了一种负载平衡的机制。关于Windows NLB的配置网上也有许多现成的教程,这里我只说明一些重要的参数配置以及它们的含义。通过打开本地连接的属性选择“网络负载均衡”,并单击属性按钮就可以打开NLB的配置窗口。如下:

    在Cluster IP configuration中填入必要的信息,如IP,掩码,DNS名称。Cluster有两种工作模式,unicast和multicast。首先说明一下,在Windows NLB中客户端的包会传递给每一个Cluster节点,然后每个节点根据特定的规则进行过滤。

    当选择unicast的时候,cluster使用一个虚拟的IP地址和Mac地址,一般在L2的switch上,会记录固定的MAC地址和端口的对应关系,这样防止数据包发向每个交换机端口。但在unicast的时候系统根据一个注册表中的值(MaskSourceMAC)来决定是否隐藏MAC地址,如果值为1,交换机就无法记录对应关系,所以发个cluster的数据包会在交换机的每个端口进行发送,这样就造成了switch flooding。但如果设置为0,那么MAC地址就会与特定端口绑定,所有数据包都发送至一台服务器,所以就无法进行Load Balance。这时候就需要其他技术来让switch不要记录Cluster Mac地址。选择unicast,所有节点共享相同的IP和MAC地址,所以节点之间不能通信。

    当选择multicast时候,给cluster分配了一个多播地址而不是改变它的静态地址,所以允许节点之间进行通信。但是对于节点ARP的请求,返回的response中的IP地址会被多播地址取代,这种ARP请求会被一些路由器拒绝,因此需要管理员自己在router中加入静态的ARP记录。

    接下来需要定义主机参数如下:

    Priority选择1-32之间的数字,每个节点应该不相同,Dedicated IP是本机IP地址。

    最后添加port rules如下:

     “Filtering mode(筛选模式):在此选项设置中,选择以何种方式提供服务有“Multiple host(多主机)”和“single host”。选择多主机之间进行负载平衡时,“Affinity(相似性)可以选择“None”“Single” “Class C”三种。相似性在此是设置在多主机负载平衡时,对客户端的IP做出的相应反应。选择“None”表示所有节点都是等价的,所有请求根据Load Weight的配置进行分配。选择“Single(单一),表示第一次用户端访问VIP分配到实际的物理主机后,以后从该客户端的所有请求都由这台主机提供处理;若选择“Class C”模式,则表示一个C类地址的客户端请求将全部由第一次处理请求的主机负责。当请求为有状态的时候,应该选择Single或者Class C,当请求是无状态的时候选择None。不过当某个节点发生故障重新加入cluster后所有的状态都会丢失。
             “Single Host
    (单一主机):若选择此选项,该端口范围内的所有请求都将由一台主机来进行处理,此选项将配合后面的主机优先级来进行主机判定。

     

  • Silk Performer基本概念

    2008-4-15

        Silk Performer是Borland公司生产的一款性能测试工具,和Load Runner是竞争对手。Silk Performer采用work flow的概念将性能测试的步骤制作成一个工作流,这让初学者很容易上手,十分方便。其中包括baseline的测试。 另一点好的方面是,它将一个测试作为一个整体工程来看待,所有的相关文件都整合在某一个工程文件内。

    这里介绍一些基本概念:

    Project: 一个Project是配置文件(Profiles)、教本文件(scrīpts)、包含文件(Include files)、数据文件(Data files)、客户端(Agents)以及Work Loads文件的组合,其中Include fileSilk Performer教本运行时需要的库文件系统会根据脚本自行添加。

     

    Profile文件:这个文件是录制脚本和播放教本的基本设置,经常用到的是设置不同的浏览器类型和网络连接类型。

    scrīpt文件就是录制下来的用户操作文件,在测试的时候由Virtual user运行。

    Data file包含一些测试数据,比如用户登录名和密码。

    Work load文件是定义测试的行为,里面定义了压力的类型,有多少虚拟用户,执行多长时间等等一系列的参数。

     

    User Type是一个scrīpt,一个User Group和一个Profile的组合,顾名思义就是一组什么样的用户在什么配置下执行什么操作。其中User Group中可以定义执行哪些Transaction以及执行多少次,一个User Group特定于一个scrīpt

     

    Baseline通过采用一个虚拟用户执行每一种User Type的方法得到一些初始数据作为今后计算虚拟用户数的标准,计算公式是:Vusers = Session Time[s] * Sessions Per Peak Hour / 3600. 同时可以定义一些Timer的上限和下限。要注意的是每一个BaseLine是和一个WorkLoad相关的,如果你改变了相应的WorkLoad那么也需要重新制作BaseLine

  • 浅析Windows内存计数器

    2008-3-24

       最近测试中发现Windows服务器的速度很慢,发现是内存造成瓶颈,现在将Windows内存检测的一些方法总结一下。Windows内存中有三个数据很重要,Pages/sec, Available Bytes和Committed Bytes.

       在测试中内存的缺少会造成频繁的页错误,导致系统不停在磁盘和内存中交换数据,有可能表现出IO瓶颈的现象,实则内存不足。在页错误中,有分为硬件错误和软件错误,硬件错误是指程序需要的数据不在内存中需要从硬盘读取,软件错误是指数据还在内存的缓存中但已不再程序的驻留内存里,需要从内存的其他地方读取。访问硬盘比内存要慢几个数量级,所以当系统出现很多硬件页错误时候,系统就会慢的很多,成为系统产生抖动。

       如何发现硬件页错误呢?通过在性能监视器里监控一下指标:

    Memory\Pages/sec, Process(All_process)\Working Set, Memory\Pages Input/sec

    Memory\Pages Output/sec

    同时可以通过一下计数器看到内存和磁盘之间的频繁交换:

    Memory\Page Reads/sec, PhysicalDisk\Disk Reads/sec,

    PhysicalDisk\Avg.Disk Read Bytes/sec

    其中,Pages/sec是指由于硬件页错误而引起的页交换数量等于Pages Input/sec和Pages Output/sec的总和。Page Faults/sec是页错误的数量包括硬件的和软件的。

    因此总结下来,当Pages/sec大于10的时候就表明系统存在抖动(thrashing),当Available Bytes小于4MB时就说明系统内存不足,Committed Bytes的数值明显大于内存总量的时候,系统就应该增加内存。

    有一点值得注意的是,如果某个程序连续的读取内存映像文件(Memory Mapping file)的时候也会造成Pages/sec变的很大,但此时不能认定系统出现抖动,我们还要参考其他数值来确定是否内存出现瓶颈。

  • 【转】数据库设计三大范式应用实例剖析

    2008-3-14

    引言

      数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。

      设计范式是不是很难懂呢?非也,大学教材上给我们一堆数学公式我们当然看不懂,也记不住。所以我们很多人就根本不按照范式来设计数据库。

      实质上,设计范式用很形象、很简洁的话语就能说清楚,道明白。本文将对范式进行通俗地说明,并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。

      范式说明

      第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

      例如,如下的数据库表是符合第一范式的:

    字段1 字段2 字段3 字段4
           

      而这样的数据库表是不符合第一范式的:

    字段1 字段2 字段3 字段4
        字段3.1 字段3.2  


      很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。

      第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

     
     


      假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:

      (学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

      这个数据库表不满足第二范式,因为存在如下决定关系:

      (课程名称) → (学分)

      (学号) → (姓名, 年龄)

      即存在组合关键字中的字段决定非关键字的情况。

      由于不符合2NF,这个选课关系表会存在如下问题:

      (1) 数据冗余:

      同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

      (2) 更新异常:

      若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。

      (3) 插入异常:

      假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。

      (4) 删除异常:

      假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

      把选课关系表SelectCourse改为如下三个表:

      学生:Student(学号, 姓名, 年龄);

      课程:Course(课程名称, 学分);

      选课关系:SelectCourse(学号, 课程名称, 成绩)。

      这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。

      另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

      第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:

      关键字段 → 非关键字段x → 非关键字段y

      假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:

      (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)

      这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:

      (学号) → (所在学院) → (学院地点, 学院电话)

      即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。

      它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。

      把学生关系表分为如下两个表:

      学生:(学号, 姓名, 年龄, 所在学院);

      学院:(学院, 地点, 电话)。

      这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。

      鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。

     假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

      (仓库ID, 存储物品ID) →(管理员ID, 数量)

      (管理员ID, 存储物品ID) → (仓库ID, 数量)

      所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

      (仓库ID) → (管理员ID)

      (管理员ID) → (仓库ID)

      即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情况:

      (1) 删除异常:

      当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。

      (2) 插入异常:

      当仓库没有存储任何物品时,无法给仓库分配管理员。

      (3) 更新异常:

      如果仓库换了管理员,则表中所有行的管理员ID都要修改。

      把仓库管理关系表分解为二个关系表:

      仓库管理:StorehouseManage(仓库ID, 管理员ID);

      仓库:Storehouse(仓库ID, 存储物品ID, 数量)。

      这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。

     

    范式应用

      我们来逐步搞定一个论坛的数据库,有如下信息:

      (1) 用户:用户名,email,主页,电话,联系地址

      (2) 帖子:发帖标题,发帖内容,回复标题,回复内容

      第一次我们将数据库设计为仅仅存在表:
      

    用户名 email 主页 电话 联系地址 发帖标题 发帖内容 回复标题 回复内容

      这个数据库表符合第一范式,但是没有任何一组候选关键字能决定数据库表的整行,唯一的关键字段用户名也不能完全决定整个元组。我们需要增加"发帖ID"、"回复ID"字段,即将表修改为:

    用户名 email 主页 电话 联系地址 发帖ID 发帖标题 发帖内容 回复ID 回复标题 回复内容

      这样数据表中的关键字(用户名,发帖ID,回复ID)能决定整行:

      (用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)

      但是,这样的设计不符合第二范式,因为存在如下决定关系:

      (用户名) → (email,主页,电话,联系地址)

      (发帖ID) → (发帖标题,发帖内容)

      (回复ID) → (回复标题,回复内容)

      即非关键字段部分函数依赖于候选关键字段,很明显,这个设计会导致大量的数据冗余和操作异常。
     
     


      我们将数据库表分解为(带下划线的为关键字):

      (1) 用户信息:用户名,email,主页,电话,联系地址

      (2) 帖子信息:发帖ID,标题,内容

      (3) 回复信息:回复ID,标题,内容

      (4) 发贴:用户名,发帖ID

      (5) 回复:发帖ID,回复ID

      这样的设计是满足第1、2、3范式和BCNF范式要求的,但是这样的设计是不是最好的呢?

      不一定。

      观察可知,第4项"发帖"中的"用户名"和"发帖ID"之间是1:N的关系,因此我们可以把"发帖"合并到第2项的"帖子信息"中;第5项"回复"中的"发帖ID"和"回复ID"之间也是1:N的关系,因此我们可以把"回复"合并到第3项的"回复信息"中。这样可以一定量地减少数据冗余,新的设计为:

      (1) 用户信息:用户名,email,主页,电话,联系地址

      (2) 帖子信息:用户名,发帖ID,标题,内容

      (3) 回复信息:发帖ID,回复ID,标题,内容

      数据库表1显然满足所有范式的要求;

      数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖,即不满足第二范式的要求,但是这一设计并不会导致数据冗余和操作异常;

      数据库表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖,也不满足第二范式的要求,但是与数据库表2相似,这一设计也不会导致数据冗余和操作异常。

      由此可以看出,并不一定要强行满足范式的要求,对于1:N关系,当1的一边合并到N的那边后,N的那边就不再满足第二范式了,但是这种设计反而比较好!

      对于M:N的关系,不能将M一边或N一边合并到另一边去,这样会导致不符合范式要求,同时导致操作异常和数据冗余。
    对于1:1的关系,我们可以将左边的1或者右边的1合并到另一边去,设计导致不符合范式要求,但是并不会导致操作异常和数据冗余。

      结论

      满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的,在数据库表中存在1:1或1:N关系这种较特殊的情况下,合并导致的不符合范式要求反而是合理的。

      在我们设计数据库的时候,一定要时刻考虑范式的要求。

    转自CSDN新闻频道

  • 如何升级Windows Server 2003到Windows Server 2003 R2

    2008-3-03

        Windows Server 2003 R2 是微软为了扩展 Windows Server 2003 系统的功能而推出的一项功能软件包,目前已经有很多用户将 Windows Server 2003 升级到了 R2 版。

        Windows Server 2003 R2 的程序文件是在 Windows Server 2003 SP1 的基础上开发的,因此在将 Windows Server 2003 升级到 R2 版之前,我们必须首先安装 SP1 或 SP2(至少安装 SP1)。在升级到 R2 版后,SP1 将无法卸载。Windows Server 2003 R2 的安装程序由两张 CD 组成,第一张 CD 是 Windows Server 2003 with SP1 的安装程序、第二张就是 R2 组件的安装程序。如果我们已经有安装好的 Windows Server 2003 系统(已安装 SP1 或 SP2,至少安装有 SP1),只要直接运行第二张光盘中的安装程序,即可将 Windows Server 2003 升级到 R2 版了。

    但是当Server本身是域控制器的时候,升级过程中将会产生如下错误:

    “The Active Directory installation wizard cannot continue because the forest is not prepared for installing windows server 2003 ,use the adprep command-line tool to prepare both the forest and the domain for more information about using  the ADprep ,see active directory Help。。。”

    产生的原因是由于域中的Schema没有扩展到最新的匹配windows 2003 server R2 的SCHEMA。解决方法是:将R2的第二张光盘放入光驱,然后运行以下命令:
    光驱盘符:\CMPNENTS\R2\ADPREP\adprep.exe /forestprep

    最好先对AD进行备份以防止意外发生。

  • 在Windows Server Cluster中安装非cluster程序

    2008-2-25

       在最近的一个项目中,我们的服务器程序需要提供Failover的功能。我们通过在部署环境中建立Windows Server Cluster并在CLuster的节点上安装服务器端程序来达到此目的。

    首先介绍一下Windows Cluster这个名词,提起Windows Cluster容易让人混淆。他有三个不同的延伸:

    1. Windows NLB cluster是Windows本身提供的网络负载均衡的集群服务。属于active/active模式,即多个节点可以运行相同的程序或服务。

    2. Windows Server Cluster是Windows本身提供的支持Failover的集群服务。属于active/passive模式,即某一个程序或者服务(cluster resource)在任意时刻只能在一个节点中运行。

    3. Windows Compute Cluster Server用于高性能计算,是微软推出的特殊的服务器。

       这里我们主要讨论第2种,支持Failover的Windows Server Cluster.许多服务器程序本身就支持Cluster,如Microsoft Exchange, SQL Server等。但是如果我们自己的服务器程序本身在开发的时候没有对Windows Server Cluster做特别的开发,是否就不能利用Windows Server Cluster的failover功能吗?答案是否定的,我们可以通过cluster Administrator进行配置来利用Windows Server Cluster的failover功能来让我们的服务更加稳定。但是并不是所有的程序都可以通过配置来实现failover。

    部署非Cluster程序到Cluster环境中的主要步骤是:

    1. 搭建Windows Server Cluster环境,参考微软文档。

    2. 在每个节点上安装应用程序。

    3. 打开Cluster Administrator。新建一个Virtual Server,也可以用默认的Virtual Server即"Cluster Group"

    4. 添加相应的资源到特定的Group中,这里的Group就是你的virtual server。添加何种资源就要看你的程序需要那种资源,详细的资源类型介绍可以参考微软的网站。

    5. 配置资源的属性比如依赖性,以及failover方案。

    我们采用2个节点的cluster来支持failover,将服务器所需资源加入其中。配置结果如下:

    图中红色的资源就是服务器程序所需的资源,通过手工加入。这个时候我们看到"Cluster Group"在第一个节点上运行,测试服务一切正常。然后关闭服务器LABVM2K3。我们会看到整个Group切换到了LABVM2K3-2上运行,测试服务一切正常。实现了服务器的Failover。

  • Exchange server 2003安装中error code 0xc0070714问题的解决

    2008-2-21

    在安装Exchange server 2003的时候遇见错误如下:

    Setup failed while installing sub-component System attendant service with error code 0xc0070714

    导致安装失败。

    我的安装平台是Windows 2003 Server Enterprise SP1.解决方法: 升级系统Windows 2003 Server到SP2,此问题得以解决。但微软的安装程序文档只要求系统Windows 2003 Server Enterprise,提醒大家升级到SP2来安装Exchange server 2003.

    另外在安装过程中会出现“平台兼容性问题的提示”可以忽略,继续安装即可。

  • sscanf函数的高级用法

    2007-12-15

    转载时请注明出处:http://blog.csdn.net/absurd/

     

    大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。

     

    1.         常见用法。

    char str[512] = {0};

             sscanf("123456 ", "%s", str);

        printf("str=%s\n", str);

     

    2.         取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

        sscanf("123456 ", "%4s", str);

        printf("str=%s\n", str);

     

    3.         取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

        sscanf("123456 abcdedf", "%[^ ]", str);

        printf("str=%s\n", str);

     

    4.         取仅包含指定字符集的字符串。如在下例中,取仅包含19和小写字母的字符串。

        sscanf("123456abcdedfBCDEF", "%[1-9a-z]", str);

        printf("str=%s\n", str);

     

    5.         取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

        sscanf("123456abcdedfBCDEF", "%[^A-Z]", str);

        printf("str=%s\n", str);

     

  • 如何定义Bug的优先级

    2007-12-12

        在测试工程师的日常工作中,最经常做的也是必须做的就是提交缺陷报告.在提交Bug的时候,我们要给出这个Bug的优先级(Priority),开发人员会根据Bug的优先级来决定先修那个Bug,后修哪个Bug.所以优先级的正确与否会影响到Bug的解决时间进而可能会影响测试和开发的进度.对于一个Bug的优先级也往往是QA和RD争论的焦点.

       在我们的公司中Bug的优先级根据其严重度和发生的频率和环境来决定.首先一个Bug有5种严重程度的定义:

    严重度A--系统Crash,不能进行安装等;

    严重度B--需求说明书中要求的重要功能没有实现;

    严重度C--功能存在缺陷;

    严重度D--功能可以进一步改进;

    严重度E--建议

    优先级的定义如下:

    Priority 1--必须立即修复;

    Priority 2--在Beta前必须修复;

    Priority 3--在release前必须修复;

    Priority 4--在下一版修复;

    Priority 5--可以修复或不修;

    接下来根据Bug发生的频率和环境建立一张优先级Mapping表.

    重现频率       

    Always  Sometimes  Hardly In User Environment

     严重度A

     P1  P1  P2  P1
     严重度B  P1  P2  P3  P2
     严重度C  P2  P3  P4  P3

     严重度D

     P4  P4  P4  P4
     严重度E  P5  P5  P5  P5

    根据这张表就可以很容易定义Bug的优先级了.

Open Toolbar