精华内容
下载资源
问答
  • 数据库复习笔记(全覆盖,包括往年部分真题)

    万次阅读 多人点赞 2020-11-26 18:08:35
    关系中的属性(列)无先后顺序 在关系中的所有元组必须是独一无二的 在元组中的每值是一原子值 4.4什么是复合属性、多值属性 4.5关系数据库和关系数据库模式 *4.6什么是完整性约束,种约束的概念* 1、关系的...

    PS:大学开始写博客,写了三年了,虽然大二太忙了,专业知识学的潦草,也没写太多博客。大三开始写专业课的复习笔记,没想到这一篇博文浏览和点赞这么高,心里还是挺高兴的。当时写的时候也没注意,加上好久没写了,结果用了富文本,本来一直用的Markdown,写到一半才发现,所以这一篇的排本就很丑,如果大家看着不舒服可以留言,我可以修改一下格式,当然,好好学习,学习的知识才是最重要的!

    ## 1、数据库系统概述


    **1.1 数据库的基本概念**
        数据库:
            长期储存在计算机内、有组织的、可共享的大量数据的集合。
            *基本特征:*
            数据按一定的数据模型组织、描述和储存
            可为各种用户共享、冗余度较小、易扩展
            数据独立性较高
        数据    :
            描述事物的符号记录
            数据有结构的:记录是计算机存储数据的一种格式或一种方法
        数据库管理系统及其功能:
            位于用户应用与操作系统之间的一层数据管理软件 ,是基础软件,是一个大型复杂的软件系统
            用途: 科学地组织和存储数据、高效地获取和维护数据
        数据库系统    
            是指在计算机系统中引入数据库后的系统构成。
            在不引起混淆的情况下常常把数据库系统简称为数据库。
        元数据
            用来描述数据的数据。
    **1.2 数据管理技术的产生和发展,以及每个阶段的特点**


     


    ## 2、数据模型

    **2.1数据模型的基本概念**
        是对现实世界数据特征的模拟和抽象,用来描述数据是如何组织、存储和操作的。
        
    **2.2数据模型的分类及每类常用的数据模型**
        对应不同的应用层次分成三种类型:分别是概念模型,逻辑模型和物理模型;
        概念模型:
            信息世界的基本概念:
                实体(Entity)
                    客观存在并可相互区别的事物称为实体。
                    可以是具体的人、事、物或抽象的概念。
                属性(Attribute)
                    实体所具有的某一特性称为属性。一个实体可以由若干个属性来刻画。
                码(Key)
                    唯一标识实体的属性集称为码。
                实体型(Entity Type)
                    用实体名及其属性名集合来抽象和刻画同类实体称为实体型    
                实体集(Entity Set)
                    同一类型实体的集合称为实体集
                联系(Relationship)
                    1.实体内部的联系:组成实体的各属性之间的联系
                    2.实体之间的联系: 通常是指不同实体集之间的联系
                    实体之间的联系有一对一(1:1)、一对多(1:n)和多对多(m:n)等多种类型

    **2.3数据模型的组成要素**
        数据模型是严格定义的一组概念的集合, 精确地描述了系统的静态特性、动态特性和完整性约束条件。
        数据模型由三部分组成:
            数据结构--描述系统的静态特性    数据结构的类型来命名数据模型
            数据操作--描述系统的动态特性    对数据库中各种对象的实例允许执行的操作的集合
            完整性约束
                一组完整性规则的集合
                完整性规则:
                    给定的数据模型中数据及其联系所具有的制约和依存规则。
                    用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容。
                数据模型对完整性约束条件的定义
                    反映和规定必须遵守的基本的通用的完整性约束条件。
                    提供定义完整性约束条件的机制,以反映具体应用所涉及的数据必须遵守的特定的语义约束条件。
                理解
                    完整性约束使用一些规则,规范数据的操作,来保证数据的正确、有效和相容。


    ER图

    ER图分为实体、属性、关系三个核心部分。实体是长方形是实体,属性是椭圆形,关系为菱形。


    ## 3、数据库系统结构

    **3.1数据库模式和实例的概念以及区别**
            *模式(Schema)*
                是对数据库逻辑结构和特征的描述
                是型的描述,不涉及具体值
                模式是相对稳定的
            *实例(Instance)*
                数据库某一时刻的状态——模式的一个具体值
                同一个模式可能有很多实例
                实力随数据库中数据的更新而变动
    **3.2数据库系统的三级模式结构**
            *模式(Schema)*
            模式(也称概念模式):
                数据库中全体数据的逻辑结构和特征的描述
                所有用户的公共数据视图
            一般,某个应用的数据库有一个模式
            模式是数据库系统模式结构的中心:
                与数据的物理存储细节和硬件环境无关
                与具体的应用程序、开发工具及高级程序设计语言无关
            定义模式:
                DDL定义数据的逻辑结构,以某种数据模型为基础
                数据记录由哪些数据项构成,数据项的名字、类型、取值范围等
                定义数据之间的联系
                定义与数据有关的安全性、完整性要求
            *外模式 (External Schema)*
            外模式(也称子模式或用户模式):
                数据库用户使用的局部数据的逻辑结构和特征的描述
                数据库用户的数据视窗,是与某一应用有关的数据的逻辑表示
            外模式与模式的关系:
                外模式通常是模式的自己、一个模式可以有多个外模式,反映了不同的用户的应用需求、看待数据的方式、对数据保密的要求
                对模式中某一数据,在不同的外模式种结构、类型、长度、保密级别等都可以不同
            外模式与应用的关系:
                一个外模式可以为多个应用系统所使用,一个应用程序只能使用一个外模式
            外模式的用途:
                每个用户只能看见和访问所对应的外模式中的数据,简化用户视图
                保证数据库安全性的一个有力措施
            *内模式 (Internal Schema)*
            内模式(也称为存储模式):
                是数据物理结构和存储方式的描述
                是数据再数据库内部的表示方式
                    记录的存储方式(例如,顺序存储,堆存储,Cluste按hash方法存储等)
                    索引的组织方式(B+树,Bitmap,Hash)
                    数据是否压缩存储
                    数据是否加密
                    数据存储记录结构的规定——如定长/变长,记录是否可以跨页存放等
            一个数据库只有一个内模式
            三级模式是对于数据的三个抽象级别
            数据库管理系统内部提供二级映像
            外模式/模式映像:
                对每一个外模式,有一个外模式/模式映像 定义外模式与模式之间的对应关系 映像定义通常包含在各外模式的描述中
                保证数据的逻辑独立性
                当模式改变时,数据库管理员堆外模式/模式映像做相应改变,使外模式保持不变
                应用程序是依据数据的外模式编写的,应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性
            模式/内模式映像:
                定义了数据全局逻辑结构与存储结构之间的对应关系。如,说明某个逻辑记录对应何种存储结构
                数据库中模式/内模式映像是唯一的
                该映像定义通常包含在模式描述中
                保证数据的物理独立性
                        当数据库的存储结构改变了(例如选用了另一种存储结构) ,数据库管理员修改模式/内模式映像,使模式保持不变
                        模式不变,则应用程序不变。保证了数据与程序的物理独立性,简称数据的物理独立性

    **3.3数据库系统的两级映像功能与数据独立性**
            保证了应用程序的稳定性
                除非应用需求本身发生变化,否则应用程序一般不需要修改
            从程序为中心——发展为以数据为中心
                具有了数据与程序之间的独立性,使得数据的定义和描述可以从应用程序中分离出去
            数据的存取由数据库管理系统管理
                简化了应用程序的编制
                大大减少了应用程序的维护和修改
    **3.4SQL SERVER数据库种类及文件(参考教材8.6节)**

    个别题目:

    ## 4、关系数据库基础

    **4.1关系模型的基本概念**
        域
            属性取值范围
        关系模式
            1.最早由E.F.Codd在1970年提出。
            2.是从表(Table)及表的处理方式中抽象出来的,是在对传统表及其操作进行数学化严格定义的基础上,引入集合理论与逻辑学理论提出的。
            3.是数据库的三大经典模型之一,现在大多数数据库系统仍然使用关系数据模型。
            4.标准的数据库语言(SQL语言)是建立在关系模型基础之上的,数据库领域的众多理论也都是建立在关系模型基础之上的。
        关系的前两种定义:
            笛卡尔乘积的子集就是一个关系
            关系是满足特定规范的二维表
        关系与关系模式的区别:
                1.同一关系模式下,可有很多的关系
                2.关系模式是关系的结构,关系是关系模式在某一时刻的数据
                3.关系模式是稳定的:而关系是某一时刻的值,是随时间可能变化的
    码:也称作键,指的是取值具有唯一性的属性,可以唯一的确定表中的一个元组,他可以由一个属性组成,也可以由多个属性共同构成;
    候选码:某一属性组的值能唯一地标识一个元组,而其子集不能的属性组
    主码:若一个关系有多个候选码,则选定一个作为主码
    外码:必须与其所参照的主码具有相同的域,且外码的取值只能引用参照表中主码的值或者使用空值。
            
    4.2关系的类型
            基本关系
                实际存在的表,是 实际存储数据的逻辑表示
            查询表
                查询结果对应的表
            视图表
                由基本表或者其他视图表导出的表
    4.3关系的性质
            列是同质的,即每一列中的分量是同一类型的数据,来自同一个域
            关系中的元组(行)无先后顺序
            关系中的属性(列)无先后顺序
            在关系中的所有元组必须是独一无二的
            在元组中的每个值是一个原子值
    4.4什么是复合属性、多值属性
    4.5关系数据库和关系数据库模式
    *4.6什么是完整性约束,五种约束的概念*
            1、关系的完整性约束
                完整性通常包括域完整性、实体完整性、参照完整性和用户自定义完整性;其中域完整性、实体完整性和参照完整性是关系模型必须满足的完整性的约束条件
            2、域完整性约束
                        指属性的值域的完整性
            3、实体完整性规则
                    关系中的主码值不可以为空值
                    意义:关系中的元组都是通过主码来识别的,若主码为空,则会出现不可识别的个体,这是不允许的。
            4、参照完整性规则
                    如果关系R1的外码Fk与关系R2的主码Pk相对应时。那么R1的每一个元组的Fk值都等于R2的某个元组的Pk值或者为空。
                     意义:如果关系R1的某个元组t1参照R2的某个元组t2,则必须要求t2存在。
            5、用户定义的完整性规则
                    用户根据具体应用的环境来定义的完整性约束。
            *五种约束*
                域约束
                键约束
                非空约束
                实体完整性约束
                参照完整性约束
            
    4.7关系代数八种运算的符号、意义及表示方法。在这八种运算中哪些属于基本运算?
    基本运算
        选择(σ)
            设R是一个n元关系,F是一个形如riθc的公式,其中θ∈{=,≠,>,<,≤,≥},R的选择操作定义为F(R)={(r1,…,ri ,…,rn )|(r1,…,ri ,…,rn )∈R∧riθc }。
            白话: 把符合条件的拿出来
        投影(Π)
            设R是一个n元关系,R的投影操作定义为∏i1,i2,…,im(R) = {(ri1, …,rim)|(r1 ,…,ri1,…,rim,…,rn)∈R}。
            白话: 看横行, 如果有两个横行相同, 只写一个. 因此若是S关系投影操作的话, 也就是有b和a
        并(∪)
            设R和S是n元关系,而且两者各对应属性的数据类型也相同。R和S的并操作定义为 R∪S = { t | t∈R∨t∈S }。
            白话: R和S关系合一起, 相同的不写
        交(∩)
            设R和S是n元关系,而且两者各对应属性的数据类型也相同。R和S的交操作定义为 R  S = { t | t∈R∧t∈S }= R-(R-S)。
            白话: 相同的拿出来
        差(-)
            设R和S是n元关系,而且两者各对应属性的数据类型也相同。R和S的差定义为 R-S ={ t | t∈R∧tS}。
            白话: 因为是R-S, 找R在S关系中没有的
        笛卡尔积(X)
            设R是n元关系,S是m元关系,R和S的的笛卡尔积定义为R×S={(r1,…,rn,s1,…,sm)|(r1,…, rn )∈R∧(s1, …,sm )∈S}。
            白话: 和普通的笛卡尔乘机差不多, 自己看看, 规律很好找

    连接()


        设R是n元关系,S是m元关系,A是R的属性,B是S的属性,A和B的值域具有相同的数据类型,θ∈{=, ≠, >, <, ≤, ≥}。R和S的连接操作定义为这里写图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/20201124202758225.png#pic_center)
        其中,r[A]表示元组r在属性A上的值,s[B]表示元组s在属性B上的值。我们称A和B是连接属性。
    除(/)

    4.8什么叫“并兼容”的两个关系?哪些关系代数运算要求两个关系必须是“并兼容”的?什么叫“重复消除”?
        两个关系有相同数量的属性,每对对应的属性有同样的值域;   并,交,差。

    个别习题:

    选D

    选B


    ## 5、SQL语言

    **5.1SQL语言的功能组成**
            数据查询,数据操纵,数据定义,数据控制;

    **5.2单表查询,主要掌握以下SQL语句用法,并复习实验2相关部分**
    (1)不带元组筛选条件的单表查询
            检索所有行和列:**SELECT * FROM Student**
    (2)重命名查询结果关系列名(友好列标题)
            在原始字段之后跟上As再指定标题即可:**SELECT Sno As 学号,Sname As 姓名......**      
    (3)TOP关键字
            TOP n语法只说明显示前n条数据:**SELECT TOP 3 * FROM Student**
    (4)筛选元组:IN、BETWEEN、DISTINCT、LIKE的用法
            1.可以在BETWEEN...AND语法前使用NOT取反
                检索年龄不在19-21岁的学生信息,显示学号,姓名:**SELECT Sno,Sname FROM Student WHERE Sage NOT BETWEEN 19 AND 21**
            2.要检索的信息是一系列取值列表,可以使用IN
                从Teacher表中检索职称为教授或者副教授的信息:**SELECT * FROM Teacher WHERE Tport IN('教授','副教授')**
            3.使用DISTINCT关键字,表示检索时显示不重复信息
                显示Teacher表中有哪些职称,要求信息不重复:**SELECT DISTINCT Tprot FROM Teacher**
            4.使用LIKE关键字进行模糊查询
                查询Student表中姓刘的同学:**SELECT * FROM Student WHERE Sname LIKE '刘%'**
    (5)空值检查
            检索Master数据库中spt_values表里low字段为空的数据行:**SELECT * FROM spt_values WHERE low IS NULL**
    (6)查询结果排序
            使用ORDER BY对显示的数据进行排序,升序时ASC可以省略
            显示Course表的所有行,要求按照课程名称降序显示:**SELECT * FROM Course ORDER BY Cname DESC**
            显示Course表的所有行,要求按照课程学分降序,学分相同再按照课程号升序排列:**SELECT * FROM Course ORDER BY Ccredit DESC,Cno ESC**
    (7)返回“计算列”
            对Course表,显示课程号、课程名、学分,另外额外增加一列“学时”,学时等于学分*16:**SELECT Cno,Cname,Ccredit, Ccredit*16 AS 学时 FROM Course**
    (8)五个汇总函数的用法
            COUNT(统计Teacher表中教授的数量):**SELECT COUNT(*) FROM Teacher WHERE Tprot = '教授'**   (COUBT()函数返回匹配指定条件的行数,COUNT(*)函数返回表中的记录数)
            SUM(求和):对Course表中必修课的学分进行求和:**SELECT SUM(Ccredit) FROM Course WHERE XKLB='必修'**
            MAX
            MIN
            AVG:分别用来计算最大值,最小值,平均值,显示Teacher表中教师年龄最大,最小,平均年龄:**SELECT MAX(Tage),MIN(Tage),AVG(Tage) FROM Teacher**
    (9)分组及对分组的筛选
            对Course表,按照必修和选修进行分类,统计每种类别的课程数量:**SELECT XKLB As 类别,COUNT(Cname) AS 数量 FROM Course GROUP BY XKLB**
            对Student表按照专业和性别进行分组,显示每个专业,每种性别的学生数量,按照学生数量降序排列:**SELECT Smajar,Ssex,COUNT(Sno) FROM Student GROUP BY Smajor,Ssex,ORDER BY COUNT(Sno) DESC**

    **5.3多表连接查询,主要掌握以下SQL语句用法,并复习实验2相关部分**
    (1)内联接
        对SC和Student表进行内连接,显示学生的学号,姓名,课程号,分数:
            语法一:**SELECT Student.Sno,Student.Sname,SC.Cno,SC.Grade FROM SC JOIN Studet ON SC.Sno=Student.Sno**
            语法二:**SELECT Student.Sno,Student.Sname,SC.Cno,SC.Grade FROM SC,Student WHERE SC.Sno=Studet,Sno**
    (2)外联接
        让Student表和SC表进行左外连接,即不管学生是否选课,该学生的信息都会显示出来:
        **SELECT Student.Sno,Student.Sname,SC.Sno,SC.Grade FROM Student LEFT OUTER JOIN SC ON Student.Sno= SC.Sno**
        让SC表和Teacher表进行完全外连接,显示教师编号,教师姓名,教师讲授的课程号:
        **SELECT Teacher.Tno,Teacher.Tname.SC.Cno FROM SC FULL OUTER JOIN Teacher ON SC.Tno=Teacher.Tno**
    (3)交叉联接
        对学生和课程两张表进行交叉连接:**SELECT * FROM Student CROSS JOIN Course**
    (4)自联接
    (5)补充:一个查询优化的例子(参考课件第7讲)


    **5.4子查询,主要掌握以下SQL语句用法,并复习实验2相关部分**
    (1)带有IN谓词的子查询
        查询在SC表中选修了课程的学生信息:**SELECT * FROM Student WHERE Sno IN (SELECT DISTINCT Sno FROM SC)**
    (2)带有比较运算符的子查询
    (3)带有ANY或ALL谓词的子查询
        在教室表中,检索比任何一个女教师年龄都大的男教师的信息:**SELECT * FROM Teacher WHERE Tsex='男' AND Tage > ALL(SELECT Tage FROM Teacher WHERE Tsex='女')**
    (4)带有EXISTS谓词的子查询(只需掌握一层EXISTS)
        查询和王国在同一专业学习的所有学生的基本信息:**SELECT Sno,Sname,Smajar FROM Student S1 WHERE EXISTS(SELECT * FROM Student S2 WHERE S2 WHERE S1.Smajor=S2.Smajor AND S2.Sname='王国')**


    **5.5集合查询,主要掌握以下SQL语句用法,并复习实验2相关部分**
    (1)并
        将学生的学号、姓名和教师的教工号,姓名,在一个检索结果中显示出来:**SELECT Sno,Sname FROM Student UNION SELECT Tno,Tname FROM Teacher**
    (2)交
        对专业名以计算机开头的学生及年龄是21岁的学生,用交运算求两者的交集:**SELECT Sno,Sname,Sage,Smajor FROM Student WHERE Smajor LIKE '计算机%' INTERSECT SELECT Sno,Sname,Sage,Smajor FROM Student WHERE Sage=21**
    (3)差
        查询专业名以计算机开头,但不包括年龄是21岁的学生:**SELECT Sno,Sname,Sage,Smajor FROM Student WHERE Smajor LIKE '计算机%' EXCEPT SELECT Sno,Sname,Sage, Smajor FROM Student WHERE Sage=21**


    **5.6数据的增、删、改(利用SQL语言),并复习实验3相关部分**
        将学生表中的学号,姓名,性别,院系,年龄,电话,邮箱抽取出来,插入Teacher表,所有新插入的数据,职称为讲师:
            **INSERT INTO Teacher(Tno,Tname,Tsex,Tdept,Tage,Tport,Tel,EMAIL)SELECT Sno,Sname,Ssex,Sdept,Sage,'讲师',Tel,EMAIL FROM Student**
        将Course表中的编号是B002的课程,学分修改为3分:
            **UPDATE Course SET Ccredit=3 WHERE Cno='B002'**
        删除Course表中编号为B009的记录
            **DELETE FROM Course WHERE Cno='B009'**

    字符截取函数SUBSTRING
            查询姓名中第二个汉字和第三个汉字相同的学生:**Select * from Student Where SUBSTRING(Sname,2,1)=SUBSTRING(Sname,3,1)**

    **5.7DDL数据定义语言,主要掌握以下SQL语句用法,并复习实验3相关部分**
    (1)创建数据库(简易版)
        CREATE DATABASE 数据库名字
    (2)删除数据库
        DROP DATABASE 数据库名字
    (3)创建数据库表:指定数据类型、是否允许为空、标识列
    (4)修改数据库表:增加列、修改列、删除列
        Alter table 表名 add 字段名 类型 是否为空
        Alter table 表名 alter column 字段名 类型 是否为空
        Alter table 表名 drop column 字段名 类型 是否为空
    (5)删除数据库表
        DROP table 表名
    (6)完整性约束条件
    ①完整性约束条件的分类:按作用对象、按状态
    ②默认值约束
    ③对数据格式的约束
    ④对取值范围或取值集合的约束
    ⑤元组级约束
    ⑥主键约束
    ⑦唯一性约束
    ⑧外键约束
    ⑨删除约束
    (7)视图的概念(复习实验3相关部分)
    (8)视图的优点
    (9)视图的创建
        创建一个名为vwSCs的视图,将学生表中院系是计算机科学学院的学生学号、姓名、性别、专业四个字段显示出来:
            **CREATE VIEW vwScs AS SELECT Sno,Sname,Ssex,Tel,EMAIL FROM Student WHERE Sdept='计算机科学学院'**
    (10)视图的修改
        通过对视图进行数据更新,将杨华的电话修改为66666666:**UPDATE vwScs SET TEL='66666666' WHERE Sname ='杨华'**
    (11)删除视图
    (12)视图的更新
    ①视图可更新性的基本判断原则
        (1)视图中的每一列都必须和一个基本表中的一个源列对应
        (2)视图中的每一行都必须和一个基本表中的一个源行对应
    ②视图可更新性的具体判断标准
            只要修改只影响与视图相关的一个基础表,视图就可以修改,
            包含聚合函数的视图不可更新
            存在计算列或者导出列的视图不可更改
    (14)索引的概念和作用(参考教材4.7节)
    (15)索引的创建和管理(复习实验3相关部分)


    **5.8DCL数据控制语言,主要掌握以下相关概念及SQL语句用法,并复习实验4相关部分**
    (1)SQL SERVER的安全控制过程、安全控制模型
    (2)SQL SERVER的身份验证模式
    (3)SQL SERVER登录名的管理
    (4)SQL SERVER数据库用户的管理
    (5)SQL SERVER权限的管理
    (6)SQL SERVER角色的管理

    **5.9 Transact-SQL编程,主要掌握以下相关概念及T-SQL语句用法,并复习实验5相关部分**
    (1)Transact-SQL基础语法
    (2)Transact-SQL流程控制语句
    (3)Transact-SQL常用函数
    (4)存储过程概述
    (5)存储过程(包括带输入和输出参数的)的创建与管理


    **6、数据库设计(复习数据库设计案例)**


    6.1数据库设计的基本过程及每阶段的主要任务
            数据库设计通常分为6个阶段
            1、需求分析:分析用户的需求,包括数据、功能和性能需求;
                    分析方法常用SA(Structured  Analysis) 结构化分析方法,SA方法从最上层的系统组织结构入手,采用自顶向下,逐层分解的方式分析系统。
                     数据流图表达了数据和处理过程的关系,在SA方法中,处理过程的处理逻辑常常借助判定表或判定树来描述。在处理功能逐步分解的同事,系统中的数据也逐级分解,形成若干层次的数据流图。系统中的数据则借助数据字典(data dictionary,DD)来描述。数据字典是系统中各类数据描述的集合,数据字典通常包括**数据项,数据结构,数据流,数据存储,和处理过程** 5个阶段。
            2、概念结构设计:主要采用E-R模型进行设计,包括画E-R图;
            3、逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换;
            4、数据库物理设计:主要是为所设计的数据库选择合适的存储结构和存取路径;
                    常用的存取方法有三类:1.索引方法,目前主要是B+树索引方法。2.聚簇方法(Clustering)方法。3.是HASH方法。
            5、数据库的实施:包括编程、测试和试运行;
            6、数据库运行与维护:系统的运行与数据库的日常维护。
    6.2 掌握E-R建模和绘制E-R图的方法
    6.3 “数据库逻辑结构设计阶段”的任务
    6.4 掌握将E-R模型转换为关系模型的规则和方法
            (1)每个实体类型转换成一个关系模式。实体的属性就是关系模式的属性,实体的的码就是关系的主码。
            (2)实体之间的联系转换,根据不同的情况进行不同的处理:一个 1:1 的联系可以转换为一个独立的关系模式,也可以与任意一端的关系模式合并;一个 1:n 的联系可转换为一个独立的关系模式,也可以与 n 端实体对应的关系模式合并;一个 m:n 的联系必须转换为一个关系模式。
    6.5 掌握关系模式的非形式化设计原则和更新异常的概念
    6.6 掌握1NF、2NF、3NF的概念和规范化方法(参考教材5.1、5.2、5.3节)
            *规范化*的基本思想是消除关系模式中的数据冗余,消除数据依赖中不合适的部分,解决数据插入、删除和修改时发生的异常现象。关系数据库的规范化过程中为不同程度的规范化要求设立的不同的标准或准则称为范式。一个低一级的范式的关系模式,通过模式分解可以转换为若干个高一级的范式的关系模式的集合,这种过程叫做规范化。
            6.6.1 第一范式
                    如果关系模式R所有属性均为简单属性,即每个属性都是不可再分的,则称R为第一范式。
            6.6.2 第二范式
                    如果关系模式属于第一范式,R(U,F)中的所有非主属性都完全函数依赖于任意一个候选关键字,则称关系R属于第二范式。即不存                       在某非主属性对某候选关键字存在部分函数依赖。
            6.6.3 第三范式
                    如果关系模式R属于第二范式,R(U,F)中的所有非主属性对任何候选关键字都不存在传递函数依赖,则称R是属于第三范式。
                   

    6.7 反规范化的基本概念(参考教材5.4节)
            常用的反规范化技术有哪些?
            解:反规范化常用的方法是合并 1:1 联系的表,合并 1:n 联系的表,复制 1:n 联系 1端表中数据到 n 端,复制 m:n 联系中 m 端和 n 端数据到新产生的联系表中。

    有关ER图的例题

    例题一:


    (2)将所画的 E-R 图转换为关系模型。
    解: 读者(借阅证号 ,姓名,地址)
            图书(编号,书名,出版社,单价,作者姓名)
            借阅(借阅证号,图书编号,借阅日期)
            作者(姓名,性别,工作单位)

    例题二

    2. 设计满足下述业务需求的 E-R (注意:实体、属性和联系名称均用中文表示)

    某图书馆要实现如下的业务:新书的入库,读者信息的入库,读者对图书的借阅 和归还业务。此外,图书馆还要维护书籍的作者信息,在有需求的情况下可以查 询作者联系方式。

    (1)图书,需要存储:图书编号、索书号、书名、出版社、单价;

    (2)作者,需要存储:作者编号、姓名、性别、联系电话;(3)读者,需要存储:借阅证号、姓名、联系电话。图书编号是指图书馆中的每一本书,有一个全馆唯一的编号。假定一个作者可以撰写多本图书,但是一个图书只能属于一个作者。一个读者可以借多本图书,一本书也可以先后在不同时刻被多个读者借阅。读者借阅图书时,要记录借阅的日期时间。你的设计中暂不考虑读者的还书业务,也不考虑同一个索书号的库存问题。

    2. 将该 E-R 图转换为等价的关系模式,分别指出每个关系的主键和外键,并画出各关系间的主键、外键参照(注意:关系模式的表示规范请参照下图、不用写数据类型;关系和属性名称均用中文表示)

    作者(作者编号,姓名,性别,联系电话)

    图书(图书编号,索书号,书名,出版社,单价,作者号)

    读者(借阅证号,姓名,联系电话)

    借阅(图书编号,借阅证号,借阅日期)

    说明:借阅表也可增加一个自增字段作为主键

    例题三:

    3. 设计满足下述业务需求的 E-R 图,并写出你在确定 E-R 模型约束条件时所做的其他假设(注意:实体、属性和联系名称均用中文表示)某研究所拟开发一套系统管理其科研人员及科研项目,经分析,有如下需求:

    1) 该研究所由多个研究部门组成,每个员工属于某一个研究部门;

    2) 该研究所有若干研究项目,每个项目由且仅由一个部门负责;

    3) 每个员工可参与多个研究项目(注:可参与不由员工所属部门负责的项目),当员工参与研究项目时,需记录这个员工在所参与的每个项目上的工作时间和角色。

    4) 员工的基本信息包括:员工号、姓名、性别、生日、职称、年龄;

    5) 部门的基本信息包括:部门号、部门名、办公地址;

    6) 研究项目的基本信息包括:项目编号、项目名称、项目经费;

    7) 上面信息中的员工号,部门号和项目编号都具有唯一性。


    **7、 数据库保护**


    7.1事务的基本概念
    7.2 事务的定义
            事务是用户定义的一个数据操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单元;
    7.3 事务的特征
    7.4 并发控制
            事务是并发控制的基本单位。
    7.5 并发操作引发的问题
            并发操作带来的数据不一致性包括:丢失修改、不可重复读、读 “脏” 数据。
    7.6并发控制的基本方法(封锁协议,并发调度的可串行性,两段锁协议)
            并发控制主要技术:封锁、时间戳、乐观控制法、多版本并发控制等。
            基本封锁类型:排他锁(X 锁 / 写锁)、共享锁(S 锁 / 读锁)。

    7.7 死锁的概念、预防、诊断与解除(详见教材第7.2节)
            活锁和死锁:
                活锁:事务永远处于等待状态,可通过先来先服务的策略避免。
                死锁:事物永远不能结束
                    预防:一次封锁法、顺序封锁法;
                    诊断:超时法、等待图法;
                    解除:撤销处理死锁代价最小的事务,并释放此事务的所有的锁,使其他事务得以继续运行下去。
    7.7数据库故障类型
            事务内部故障,系统故障,介质故障,计算机病毒

    7.8数据库恢复的基本方法(详见教材第7.3节)
    7.9备份和恢复数据库(详见教材第11章)
    7.10 备份类型和备份内容(详见教材第11.2节)
            数据库备份,就是通过特定的办法,将数据库的必要文件复制到转储设备的过程。其 中,转储设备是指用于放置数据库拷贝的磁带或磁盘。数据库备份的作用就是防止数据丢失,最大限度地降低灾难性数据丢失的风险,从数据库中定期保存用户对数据库所做的修改,当数据库出现故障时,用以将数据库从错误状态下恢复到正确状态的副本。还有一个作用,就是对数据库进行转储。
    7.11 备份策略(详见教材第11.3节)
    7.12 恢复策略(详见教材第11.5节)

    **8 、数据库新技术**
    8.1 什么是大数据?(参考教材14.2)
    8.2 数据仓库与数据挖掘(参考教材14.3)
    8.3 NoSQL数据库(参考教材14.4)


     

    展开全文
  •  今天,我遇到这样一问题:查询栏中的下拉框中的内容过长,导致部分被覆盖了。  查询了一些资料,有的说用函数控制,有的说用事件控制,有的看不懂,有的实现起来太复杂了。后来, 问了一下同事,有没有一些简单...

    HTML中的select下拉框内容显示不全的解决办法


           今天,我遇到这样一个问题:查询栏中的下拉框中的内容过长,导致部分被覆盖了。

           查询了一些资料,有的说用函数控制,有的说用事件控制,有的看不懂,有的实现起来太复杂了。后来,问了一下同事,有没有一些简单的方法,他告诉我在option中加title这个属性,于是按照他的方法试试,终于发现这个办法可行。这样,我就想记录下来,避免自己给忘记了。


    1、具体实例如下

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>HTML中的select下拉框内容显示不全的解决办法</title>
    <style type="text/css">
       #area option{
    	   width:140px;
       }
    </style>
    </head>
    
    <body style="width:80%; height:100px; text-align:center;">
       <div id="div_select">
           <label for="area">字母:</label>
           <select id="area" name="area" style="width:150px;">
               <option value="0">全部</option>
               <option value="1" title="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</option>
               <option value="2" title="BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB">BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB</option>
               <option value="3" title="CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC">CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC</option>
               <option value="4" title="DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD">DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD</option>
               <option value="5" title="EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE">EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE</option>
               <option value="6" title="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF">FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</option>
               <option value="7" title="GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG">GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG</option>
               <option value="8" title="HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH">HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH</option>
               <option value="9" title="IIIIIIIIIIIIIIIIIIIIIIIIIIIIII">IIIIIIIIIIIIIIIIIIIIIIIIIIIIII</option>
           </select>
       </div>
    </body>
    </html>
    

    2、实例结果



    3、动态数据

    <div id="div_select">
           <label for="area">省份:</label>
           <select id="area" name="area" style="width:150px;">
               <option value="0">全部</option>
               <c:forEach items="${list}" var="area">
                     <option value="${area.areaCode}" title="${area.areaName}">${area.areaName}</option>
               </c:forEach>
           </select>
    </div>





    展开全文
  • 覆盖率验证——代码覆盖率+功能覆盖

    万次阅读 多人点赞 2020-04-25 14:52:32
    文章目录一、基于覆盖率驱动的验证...采用覆盖率驱动的验证方式可以量化验证进度,一般在验证计划中会指定具体覆盖率目标。通过覆盖率验证可以确定验证是否达到要求。当然,达到目标覆盖率并不意味着验证就通过...

    一、基于覆盖率驱动的验证技术

       采用覆盖率驱动的验证方式可以量化验证进度,保证验证的完备性。一般在验证计划中会指定具体的覆盖率目标。通过覆盖率验证可以确定验证是否达到要求。当然,达到目标覆盖率并不意味着验证就通过了,因为功能覆盖率是由人为定义的,有时候即便达到100%,也未必将所有的功能场景全部覆盖了,因为人为主观定义的功能场景有时候可能存在遗漏,所以还需要对测试用例进行迭代。

    二、代码覆盖率与功能覆盖率

    1. 代码覆盖率:工具会自动搜集已经编写好的代码,常见的代码覆盖率如下:
    • 行覆盖率(line coverage):记录程序的各行代码被执行的情况。
    • 条件覆盖率(condition coverage):记录各个条件中的逻辑操作数被覆盖的情况。
    • 跳转覆盖率(toggle coverage):记录单bit信号变量的值为0/1跳转情况,如从0到1,或者从1到0的跳转。
    • 分支覆盖率(branch coverage):又称路径覆盖率(path coverage),指在if,case,for,forever,while等语句中各个分支的执行情况。
    • 状态机覆盖率(FSM coverage):用来记录状态机的各种状态被进入的次数以及状态之间的跳转情况。
    1. 功能覆盖率:`是一种用户定义的度量,主要是衡量设计所实现的各项功能,是否按预想的行为执行,即是否符合设计说明书的功能点要求,功能覆盖率主要有两种如下所示:
    • 面向数据的覆盖率(Data-oriented Coverage)-对已进行的数据组合检查.我们可以通过编写覆盖组coverage groups)、覆盖点coverage points)和交叉覆盖cross coverage)获得面向数据的覆盖率.
    • 面向控制的覆盖率(Control-oriented Coverage)-检查行为序列sequences of behaviors)是否已经发生.通过编写SVA来获得断言覆盖率(assertion coverage).

    需要指出的是: 代码覆盖率达到要求并不意味着功能覆盖率也达到要求,二者无必然的联系。而为了保证验证的完备性,在收集覆盖率时,要求代码覆盖率和功能覆盖率同时达到要求。

    三、功能覆盖率建模

    功能覆盖率主要关注设计的输入、输出和内部状态,通常以如下方式描述信号的采样要求;

    • 对于输入,它检测数据端的输入和命令组合类型,以及控制信号与数据传输的组合情况。
    • 对于输出,它检测是否有完整的数据传输类别,以及各种情况的反馈时序。
    • 对于内部设计,需要检查的信号与验证计划中需要覆盖的功能点相对应。通过对信号的单一覆盖、交叉覆盖或时序覆盖来检查功能是否被触发,以及执行是否正确。

    3.1.覆盖组——covergroup

       使用覆盖组结构(covergroup)定义覆盖模型,覆盖组结构(covergroup construct)是一种用户自定义的结构类型,一旦被定义就可以创建多个实例就像类(class)一样,也是通过new()来创建实例的。覆盖组可以定义在module、program、interface以及class中。

    每一个覆盖组(covergroup)都必须明确一下内容:

    • 一个时钟事件以用来同步对覆盖点的采样;
    • 一组覆盖点(coverage points),也就是需要测试的变量
    • 覆盖点之间的交叉覆盖;
    • 可选的形式参数;
    • 覆盖率选项;
    covergroup cov_grp @(posedge clk);    //用时钟明确了覆盖点的采样时间,上升沿采样覆盖点,也可省略clk,在收集覆盖率时在根据情况注明
      cov_p1: coverpoint a;//定义覆盖点,cov_p1为覆盖点名,a为覆盖点中的变量名,也就是模块中的变量名
    endgroup
     
    cov_grp cov_inst = new();//实例化覆盖组
    

      上述例子用时钟明确了覆盖点的采样时间,上升沿采样覆盖点,也可省略clk,在收集覆盖率时在根据情况注明,如下示例:

    covergroup cov_grp;
      cov_p1: coverpoint a;//cov_p1为覆盖点名,a为覆盖点中的变量名,也就是模块中的变量名
    endgroup
     
    cov_grp cov_inst = new();
    cov_inst.sample();          //sample函数收集覆盖率
    

      上面的例子通过内建的sample()方法来触发覆盖点的采样.

    logic [7:0] address;
    covergroup address_cov (ref logic [7:0] address,        //添加形式参数
           input int low, int high) @ (posedge ce);
        ADDRESS : coverpoint address {
          bins low    = {0,low};
          bins med    = {low,high};
        }
      endgroup
     
    address_cov acov_low  = new(addr,0,10);
    address_cov acov_med  = new(addr,11,20);
    address_cov acov_high = new(addr,21,30);
    

       覆盖组中允许带形式参数,外部在引用覆盖组时可以通过传递参数,从而对该覆盖组进行复用。

    3.2.覆盖点——coverpoint

      一个覆盖组可以包含多个覆盖点,每个覆盖点有一组显式bins值,bins值可由用户自己定义,每个bins值与采样的变量或者变量的转换有关。一个覆盖点可以是一个整型变量也可以是一个整型表达式。覆盖点为整形表达式的示例如下:注意覆盖点表达式写法。

    class Transaction();
       rand bit[2:0]  hdr_len;       //取值:0~7
       rand bit[3:0]  payload_len;   //取值:0~15
       ...
    endclass
    
    Transaction   tr;
    
    covergroup Cov;
       len16: coverpoint(tr.hdr_len + tr.payload_len);    //注:取值范围为0~15
       len32:coverpoint(tr.hdr_len + tr.payload_len + 5'b0);   //注:取值范围为0~31
    endgroup
    

      当进行仿真后,len16的覆盖点覆盖率最高可达100%,而覆盖点len32的覆盖率最高只能达到23/32=71.87%。由于总的bins数量为32个,而实际最多只能产生产生len_0,len_1,len2,…,len22共23个bins,所以覆盖率永远不可能达到100%。

      如果要使覆盖点len32达到100%的覆盖率,可以手动添加自定义bins,代码如下:

    covergroup Cov;
       len32:coverpoint(tr.hdr_len + tr.payload_len + 5'b0);   //注:取值范围为0~31  
                        {bins  len[] = {[0:22]};} 
    endgroup
    

      此时将覆盖点的范围限定在0~22之间,符合覆盖点的实际取值范围,故覆盖率可以达到100%。

    3.3.覆盖点元素——隐式bin与显式bins

    • 隐式或自动bin:覆盖点变量,其取值范围内的每一个值都会有一个对应的bin,这种称为自动或隐式的bin。例如,对于一个位宽为nbit的覆盖点变量,若不指定bin个数,2^n个bin将会由系统自动创建,需要注意的是 自动创建bin的最大数目由auto_bin_max内置参数决定,默认值64
    program automatic test(busifc.TB ifc);        //接口例化
       class Transaction;
          rand bit [3:0]  data;
          rand bit [2:0]  port;
       endclass
    
       covergroup Cov;           //定义覆盖组,未添加时钟信号,此时需要使用sample()函数采集覆盖率
          coverpoint  tr.port;     //设置覆盖点
       endgroup
    
       initial begin
          Transaction  tr=new();     //例化数据包
          Cov          ck=new();     //例化覆盖组
          repeat(32) begin
             tr.randomize();
             ifc.cb.port <= tr.port;
             ifc.cb.data <= tr.data;
             ck.sample();            //采集覆盖率
             @ifc.cb;
          end
       end
       
    endprogram   
    

    对于覆盖点tr.port,如果覆盖率达到100%,那么将会有auto[0],auto[1],auto[2] … auto[7]等8个bin被自动创建。其实际功能覆盖率报告如下:
    在这里插入图片描述

    • 显式bins:"bins"关键字被用来显示定义一个变量的bin,用户自定义bin可以增加覆盖的准确度,它属于功能覆盖率的一个衡量单位。在每次采样结束时,生成的数据库中会包含采样后的所有bins,显示其收集到的具体覆盖率值。最终的覆盖率等于采样的bins值除以总的bins值。
    covergroup 覆盖组名 @(posedge clk);//时钟可以没有
      覆盖点名1: coverpoint 变量名1{ bins bin名1 = {覆盖点取值范围}(iff(expression));  //iff结构可以指定采样条件
                                    bins bin名2 = {覆盖点取值范围};
                                    bins bin名3 = {覆盖点取值范围};
                                  .......
                                  }//一般会将bin的数目限制在8或16
                               。。。。。。
    endgroup : 覆盖组名
    
    iff结构的运用实例如下:
    bit[1:0]  s0;
    covergroup  g4;
      cover1: coverpoint s0 iff(!reset) ;    //当reset=0时,表达式为真开始采样 
    endgroup
     
    //注意对coverpoint的bin的声明使用的是{},这是因为bin是声明语句而非程序语句,而且{}后也没有加分号
    

      针对某一变量,我们关心的可能只是某些区域的值或者跳转点,因此我们可以在显示定义的bins中指定一组数值(如3,5,6)或者跳转序列(如3->5->6) 显示定义bins时,可通过关键字default将未分配到的数值进行分配

    covergroup  Cov;
       coverpoint  tr.data{             //data变量的取值范围为0~15,不设置显示bins时,理论上会有16个bin
                   bins  zero = {0};            //取值:0
                   bins  lo = {[1:3],5};        //取值:1,2,3,5
                   bins  hi[] = {[8:$]};        //取值:8~15,使用动态数组方法时相当于创建了hi[0],hi[1],...,hi[7]一共8个bins
                   bins  misc = default;        //余下的所有值:4,6,7
       }
    

    其部分覆盖率报告如下:
    在这里插入图片描述

    3.4.覆盖点的状态跳转——=> 与 ?通配符

      除了在bins中定义数值,还可以定义数值之间的跳转,操作符(=>),如下所示:

    bit[2:0]     v;
    covergroup  sg@(posedge clk);
       coverpoint  v{bins b1=(3=>4),(4=>5),(5=>6);   
                     bins b2=(3 => 4 => 5);   //跳转次序为 3->4->5,如果没有执行这个次序,则这个bins没有覆盖
                     bins b3=(1,5 => 6,7);   //(1=>6)、(1=>7)、(5=>6)、(5=>7)
                     bins b5=(5[*3]);         //3 consecutive 5's(连续重复,数值5的3次重复连续)
                     bins b6=(3[*3:5]);       //(3=>3=>3)、(3=>3=>3=>3)、(3=>3=>3=>3=>3)
                     bins b7=(4[->3]=>5);     //...=>4...=>4...=>4=>5(跟随重复,4出现3次,可以不连续,但在最后一个4出现后,下一个数值为5)
                     bins b8=(2[=3]=>5);      //...=>2...=>2...=>2...=>5(非连续重复,数值2出现3次)
                     bins anothers=default_sequence;
                     }
    endgroup
    
    

      除操作符外,还可使用关键词wildcard通配符?来表示状态和状态跳转;

    
    wildcard bins abc = {2'b1?};//覆盖10,11
     
    wildcard bins abc = (2'b1x => 2'bx0};
     
    //覆盖 10=>00 ,10=>10 ,11=>00 ,11=>10
     
    covergroup address_cov () @ (posedge ce);
      ADDRESS : coverpoint addr {
        // Normal transition bibs
        wildcard bins adr0  = {3'b11?};
        // We can use wildcard in transition bins also
        wildcard bins adr1  = (3'b1x0 => 3'bx00);
        wildcard bins adr2  = (3'b1?0 => 3'b?00);
      }
    endgroup
    
    ————————————————
    原文链接:https://blog.csdn.net/bleauchat/article/details/90445713
    

    3.4.覆盖点之间的交叉覆盖率——cross

      交叉覆盖是在覆盖点或变量之间指定的,必须先指定覆盖点,然后通过关键字cross定义覆盖点之间的交叉覆盖

    //通过覆盖点来定义交叉覆盖
    bit [3:0] a, b;
    covergroup cg @(posedge clk);
      c1: coverpoint a;
      c2: coverpoint b;
      c1Xc2: cross c1,c2;    //1. 定义交叉覆盖使用关键字cross,利用**覆盖点名字**定义交叉覆盖
    endgroup : cg
     
    //通过变量名来定义交叉覆盖
    bit [3:0] a, b;
    covergroup cov @(posedge clk);
      aXb : cross a, b;      //2. 定义交叉覆盖使用关键字cross,直接利用**变量名字**定义交叉覆盖
    endgroup
     
    //交叉覆盖的通用定义格式: 
    交叉覆盖名:cross 交叉覆盖点名1,交叉覆盖点名2;
    

       由于上面每个覆盖点都有16个bin,所以它们的交叉覆盖总共有256(16*16)个交叉积(cross product),也就对应256个bin

    bit [3:0] a, b, c;
    covergroup cov @(posedge clk);
      BC  : coverpoint b+c;
      aXb : cross a, BC;
    endgroup
    

    上例的交叉覆盖总共有256个交叉积(cross product),也对应256个bin.

    3.6.覆盖率的选项与方法

    • at_least——覆盖阈值,定义一个bin在执行代码过程中至少触发的次数,低于这个触发次数的话,这个bin不算覆盖,默认值是1;
    • auto_bin_max——当没有bin为显示创建时,定义一个覆盖点的自动bin的最大数量,默认值为64;
    • cross_auto_bin_max——定义一个交叉覆盖的交叉积(cross product)的自动bin的最大数量,没有默认值;
    covergroup cg @(posedge clk);
      c1: coverpoint addr  { option.auto_bin_max = 128;}//addr自动bin的数目最大为128
      c2: coverpoint wr_rd { option.at_least = 2;}//wr_rd的每个bin至少要触发两次,否则不算覆盖
      c1Xc2: cross c1, c2  { option.cross_auto_bin_max = 128;}//交叉积的自动bin数目最大为128
    endgroup : cg
    
    //覆盖选项如果是在某个coverpoint中定义的,那么其作用范围仅限于该coverpoint;
    //如果是在covergroup中定义的,那么其作用范围是整个covergroup;
    

    四、代码code——约束与覆盖率的运用

    • void sample() : Triggers the sampling of covergroup 触发覆盖组的采样
    • real get_coverage() : Calculate coverage number, return value will be 0 to 100 返回覆盖组覆盖率
    • real get_inst_coverage() :Calculate coverage number for given instance, return value will be 0 to 100 返回覆盖组实例的覆盖率
    • void set_inst_name(string) :Set name of the instance with given string 设置实例名
    • void start() :Start collecting coverage 开启覆盖率收集
    • void stop() :Stop collecting coverage 结束收集覆盖率
    module test();
     
    logic [2:0] addr;
    wire [2:0] addr2;
     
    assign addr2 = addr + 1;
     
    covergroup address_cov;
      ADDRESS : coverpoint addr {
        option.auto_bin_max = 10;
      }
      ADDRESS2 : coverpoint addr2 {
        option.auto_bin_max = 10;
      }
    endgroup
     
    address_cov my_cov = new;
     
    initial begin
      my_cov.ADDRESS.option.at_least = 1;
      my_cov.ADDRESS2.option.at_least = 2;
      // start the coverage collection
      my_cov.start();
      // Set the coverage group name
      my_cov.set_inst_name("ASIC-WORLD");
      $monitor("addr 8'h%x addr2 8'h%x",addr,addr2);
      repeat (10) begin
        addr = $urandom_range(0,7);
        // Sample the covergroup
        my_cov.sample();
        #10;
      end
      // Stop the coverage collection
      my_cov.stop();
      // Display the coverage
      $display("Instance coverage is %e",my_cov.get_coverage());
    end
     
    endmodule
    

    4.1.通过修改随机化次数——提高覆盖率(覆盖点变量取值范围小)

    1)、在不添加约束constraint、不使用自定义bins,的情况下:

    module cov_demo();
    
      class transaction;
          rand bit[31:0]  data;        //2^32种可能
          rand bit[2:0]  port;         //0~7,一共8种可能
      endclass
        
       covergroup cov_port;
           port_bin : coverpoint tr.port;
           data_bin : coverpoint tr.data;
       endgroup
         
        transaction    tr=new;      //声明类的句柄,创建对象
        cov_port       ck=new;      //声明覆盖组的句柄,创建对象; covergroup和class类似
        
        initial begin
            repeat(4)begin           //生成得数据包的数量会影响覆盖率,也可以通过添加约束constraint来提升覆盖率,或者自定义bins。
                tr.randomize;        //随机化生成数据
                ck.sample();         //搜集覆盖率
            end
        end 
    
    endmodule
    
    

       覆盖率如下:使用Makefile实例三即可。在这里插入图片描述
      可以看出,两个覆盖点cport和cdata的覆盖率都较低,这是由于产生的随机化数据次数太少, 可以通过提高产生随机化的重复次数进一步提高覆盖率
    2)、在不添加约束constraint、不使用自定义bins,**改变随机化次数**的情况下:

            repeat(32)begin           //生成得数据包的数量会影响覆盖率,也可以通过添加约束constraint来提升覆盖率,或者自定义bins。
    

       在将repeat(4)改为repeat(32)后:覆盖率如下:
    在这里插入图片描述
      需要指出的是,提高随机化次数来提高覆盖率的方法只适用于,覆盖点的变量本身取值范围不大(如cport)的情况,如cdata自身取值范围太大,此方法便不再适用。此时可以通过添加约束constraint提高覆盖率
    在这里插入图片描述

    4.2.通过添加约束constraint、自定义bins——提高覆盖率(覆盖点变量取值范围大)

    1)、在自定义bins,而不添加约束constraint的情况下:

    module cov_demo();
    
      class transaction;
          rand bit[31:0]  data;        //2^32种可能
          rand bit[2:0]  port;         //0~7,一共8种可能
      endclass
        
       covergroup cov_port;
           port_bin : coverpoint tr.port;
           data_bin : covergroup tr.data{
                             bins min={[0:100]};        //此时,随机化生成该范围内任意一个数,该bins便被覆盖
                             bins mid={[101:9999]};
                             bins max={[10000:$]};       //$—-表示最大的边界
                          }
        endgroup
         
        transaction    tr=new;      //声明类的句柄,创建对象
        cov_port       ck=new;      //声明覆盖组的句柄,创建对象; covergroup和class类似
        
        initial begin
            repeat(32)begin           //生成得数据包的数量会影响覆盖率,也可以通过添加约束constraint来提升覆盖率,或者自定义bins。
                tr.randomize;        //随机化生成数据
                ck.sample();         //搜集覆盖率
            end
        end 
    
    endmodule
    

    在这里插入图片描述
    2)、在自定义bins,添加约束constraint的情况下:

    module cov_demo();
    
      class transaction;
          rand bit[31:0]  data;        //2^32种可能
          rand bit[2:0]  port;         //0~7,一共8种可能
          constraint data_c1{
                        data inside {[0:100],[101:9999],[10000:12000]};       //由于data的可能性太多,故对其施加约束
                        }
       endclass
        
       covergroup cov_port;
           port_bin : coverpoint tr.port;
           data_bin : covergroup tr.data{
                             bins min={[0:100]};        //此时,随机化生成该范围内任意一个数,该bins便被覆盖
                             bins mid={[101:9999]};
                             bins max={[10000:$]};       //$—-表示最大的边界
                          }
        endgroup
         
        transaction    tr=new;      //声明类的句柄,创建对象
        cov_port       ck=new;      //声明覆盖组的句柄,创建对象; covergroup和class类似
        
        initial begin
            repeat(32)begin           //生成得数据包的数量会影响覆盖率,也可以通过添加约束constraint来提升覆盖率,或者自定义bins。
                tr.randomize;        //随机化生成数据
                ck.sample();         //搜集覆盖率
            end
        end 
    
    endmodule
    

    在这里插入图片描述
    将随机化的次数改为320次后,repeat(320):覆盖率的hit次数变化分布不明显,如下图:可以通过施加权重调整hit的次数分布.
    在这里插入图片描述

    4.3.通过权重dist——调整hit次数分布

    将代码中的constraint约束调整为权重dist处理后,其各个bins的hit次数分布更加均匀,如下所示:

          constraint data_c1{
              data dist {[0:100]:/ 100, [101:9999]:/ 100, [10000:12000]:/ 120};      
                        }
    

    在这里插入图片描述

    展开全文
  • 最近十几年间,项目管理逐渐发展成为一涵盖9大知识体系、5个具体阶段的单独的学科分支。9大知识体系包括: ·集成管理在项目分析中,项目管理人员必须把各种能力综合起来并加以协调利用。 ·范围管理定义项目的...
            
    驱动
    21
    世纪新型商务企业发展的原动力是什么?有人答曰:项目管理。的确,项目管理作为一门新兴的学科,发展之快已超过了我们的想象。美国
    Fortune
    杂志甚至预言,项目经理将是
    21
    世纪的首选职业。让我们共同走近项目管理。
     
    

    金字塔工程北极星导弹计划

    论起项目管理的起源,其实很早。古代诸如金字塔、长城等著名的伟大工程项目的成功,都得助于当时对工程项目进行的严密和科学的管理。20世纪60年代初,在著名数学家华罗庚教授的倡导下,将项目管理的概念引入了我国,并在当时的国民经济各个部门进行试点应用,将这种方法命名为统筹法。之后,中国科学院管理科学与科技政策研究所,还牵头成立了中国统筹法、优选法与经济数学研究会。改革开放后,项目管理在水利、建筑、化工等领域开始被大量地应用起来。2000年底,联想在天麒天麟两款计算机产品的开发过程中,结合业务对项目管理的需求,配合项目管理相关理论、方法编制软件方案,使该项目在8个月的时间内便全部完成,并达到了国际上PC生产技术的最高水平。

    现代项目管理的概念起源于美国。上个世纪五十年代后期,美国的Booz-Allen

    Lockheed公司首次在北极星导弹计划中运用了PERT技术。同一时期,美国的Dupont and

    RamintonnRand公司创造了CPM方法,用于研究和开发、生产控制和计划编排,结果大大缩短了完成预定任务的时间,之后它们分别被称为计划评审技术关键路径法。现代项目管理科学便是从这两项技术的基础涎杆俜蛊鹄吹模 诤狭撕罄捶蛊鹄吹腤BS工作分解技术、蒙特卡罗(Monte Carlo)模拟技术和EV挣值分析技术,形成了一门关于项目资金、时间、人力等资源控制的管理科学。著名的阿波罗登月计划、曼哈顿计划等都是采用项目管理的理论和方法而取得成功的经典案例。

    9大知识体系与5个具体阶段

    早期的项目管理主要关注的是成本、进度(时间),后来又扩展到质量。最近十几年间,项目管理逐渐发展成为一个涵盖9大知识体系、5个具体阶段的单独的学科分支。9大知识体系包括:

    ·集成管理在项目分析中,项目管理人员必须把各种能力综合起来并加以协调利用。

    ·范围管理定义项目的边界,着眼于大画面的事物。例如项目的生命周期、工作分工结构的开发、管理流程变动的实施等。

    ·时间管理要求培养规划技巧。有经验的项目管理人员应该知道,当项目出现偏离规划时,如何让它重回规划。

    ·成本管理要求项目管理人员培养经营技巧,处理诸如成本估计、计划预算、成本控制、资本预算以及基本财务结算等事务。

    ·人力资源管理着重于人员的管理能力,包括冲突的处理、对职员工作动力的促进、高效率的组织结构规划、团队工作和团队形成以及人际关系技巧。

    ·风险管理需要管理人员在信息不完备的情况下作决定。风险管理模式通常由三个步骤组成:风险确定、风险影响分析以及风险应对计划。

    ·质量管理要求项目管理人员熟悉基本的质量管理技术。例如:制作和说明质量控制图、实施8020规则、尽力达到零缺陷等。

    ·采购管理项目管理人员应掌握较强的合同管理技巧。例如,应能理解定价合同相对于成本附加合同所隐含的风险。应了解签约中关键的法律原则。

    ·沟通管理要求项目管理人员能与他们的经理、客户、厂商及属下进行有效的交流。

    5个阶段是:项目启动、项目计划、项目执行、项目控制和项目收尾。

    除此之外,作为一个称职的项目管理专业人员,还必须具有相应的通用管理知识和经验、相关的业务知识背景以及精深的风险管理经验。也就是说,项目经理应当是一个具有相当丰富的知识并具有合理知识结构的高级复合型人才。

    现在,项目管理在全球范围内被政府、大型公司、企业以及小型非赢利组织广泛地采用。与此同时,具备项目管理经验和项目领导才能的管理者,在职场上变得炙手可热。因为全球化的竞争要求新项目和新业务的发展都要在预算范围内按时完成。

    向项目管理要高效

    项目是一项为了达到一个特殊目的而进行的临时性活动。每一个项目有明确的开始和结束时间,项目能够由组织的各个层次创建;涉及的人数可以是一个人,也可以是上千人;可以只涉及一个单独的部门,也可以是跨部门的合作。项目管理可以应用于任何项目,而不受它的大小、预算或期限的限制,例如:

    ·开发一个新产品或服务;

    ·设计一个新车型;

    ·运作一次政治竞选;

    ·建一座大桥;

    ·发射火星探测器;

    ·建立一个电子商务站点。

    那么,什么是项目管理呢?按照PMBOK2000的定义,项目管理是运用相关的知识、工具和技术管理的活动,目的是满足客户对特定项目的要求。项目经理负责管理整个项目,他的工作主要是:

    ·在项目范围、时间、成本、风险和质量之间做出最佳平衡;

    ·满足不同项目干系人的不同需要和期望;

    ·实现既定的需求目标。

            理想情况下,所有的企业都能够从项目管理中获益,特别是在管理资本投入和间接活动的花费上。在当今快速多变、全球化的市场环境下,所有类型的企业都需要看到它们投资在固定资产设施、房地产建设以及一些设备的升级上面的回报和收益,或者要对一些内部功能的管理和跟踪,如IT项目、市场项目等。无论什么行业,项目管理都可以使企业通过更好的信息共享来提高生产率和降低成本,在有限的资源条件下更快地以更低的成本交付产品和服务,从而增加营收。

    项目管理可以帮助企业通过把日常工作标准化、减少可能被遗忘或被忽略的任务,来达到客户的期望值;

    项目管理也能使可利用的资源以最有效的方式得到最佳的利用;项目管理还能使高级管理者洞察到组织内正在发生的和将要发生的事件。

    项目管理原则的应用能够帮助高级管理层做到:

    ·建立成功的衡量指标;

    ·以客户为中心并与客户保持一致;

    ·量化体现价值的成本;

    ·优化组织资源的使用;

    ·贯彻质量原则和标准;

    ·实施战略计划;

    ·缩短新产品的研制周期并快速进入市场。

      相关小知识

    IPMA:国际项目管理协会,是一个在瑞士注册的非赢利性组织,是项目管理国际化的主要促进者。IPMA创建于1965年,最早是一个在国际项目领域的项目经理之间交流各自经验的论坛。1967年,IPMA在维也纳主持召开了第一届国际会议,项目管理从那时起即作为一门学科而不断发展。

    IPMA的成员主要是各个国家的项目管理协会,到目前为止共有29个成员组织。这些国家的组织用他们自己的语言服务于本国项目管理的专业要求,IPMA则以广泛接受的英语作为工作语言提供有关需求的国际层次的服务。为了达到这一目的,IPMA提供了大量的产品和服务,包括研究与发展、培训和教育、标准化和证书制以及有关广泛的出版物支撑的会议、学习班和研讨会等。

    PMI Project Management

    Institute(美国项目管理学术组织),成立于1969年,是一个有近5万名会员的国际性学会。它致力于向全球推行项目管理,是项目管理专业最大的由研究人员、学者、顾问和经理组成的全球性专业组织,在教育、会议、标准、出版和认证等方面发起技术计划和活动,以提高项目管理专业的水准。PMI正在成为一个全球性的项目管理知识与智囊中心。

    前言
    CMM(Capability Marurity Model,软件能力成熟度模型)是于1984年美国国会与美国主要的公司和研究中心合作创立的一个由联邦资助的非盈利组织——软件工程研究所(Software Engineering Institute,SEI)的一个早期研究成果。该模型提供了软件工程成果和管理方法的框架,自90年代提出以来,已在北美、欧洲和日本成功地应用。现在该模型已成为事实上的软件过程改进的工业标准。下面我们来一起学习有关CMM的一些基础知识。  
    一、 CMM基本概念  
    过程(Process):为实现既定目标的一系列操作步骤[IEEE-STD-610].  
         软件过程(Software Process):指人们用于开发和维护软件及其相关产品的一系列活动、方法、时间和革新。其中相关产品是指项目计划、设计文档、编码、测试和用户手册。当一个企业逐步走向成熟,软件过程的定义也会日趋完善,其企业内部的过程实施将更具有一致性。  
         软件过程能力(Software Process Capability):描述了在遵循一个软件过程后能够得到的预期结果的界限范围。该指标是对能力的一种衡量,用它可以预测一个组织(企业)在承接下一个软件项目时,所能期望得到的最可能的结果。

    软件过程性能(Software Process Performance):表示遵循一个软件过程后所得到的实际结果。
        软件过程成熟度(Software Process Maturity):是指一个具体的软件过程被明确地定义、管理、评价、控制和产生实效的程度。所谓成熟度包含着能力的一种增长潜力,同时也表明了组织(企业)实施软件过程的实际水平。随着组织软件过程成熟度能力的不断提高,组织内部通过对过程的规范化和对成员的技术培训,软件过程也将会被他的使用者关注和不断修改完善。从而使软件的质量、生产率和生产周期的到改善。

    CMM是软件过程能力成熟度模型(Capacity Maturity Model)的简称,是卡内基-梅隆大学软件工程研究院为了满足美国联邦政府评估软件供应商能力的要求,于1986年开始研究的模型,并于1991年正式推出了CMM 1.0 版。CMM自问世以来备受关注,在一些发达国家和地区得到了广泛应用,成为衡量软件公司软件开发管理水平的重要参考因素和软件过程改进事实上的工业标准。

    CMMI(Capability Maturity Model Integration)即能力成熟度模型集成,这也是美国国防部的一个设想,他们想把现在所有的以及将被发展出来的各种能力成熟度模型,集成到一个框架中去。这个框架有两个功能,第一,软件获取方法的改革;第二,建立一种从集成产品与过程发展的角度出发、包含健全的系统开发原则的过程改进。

    关键过程(区)域(Key Process Area)是指一系列相互关联的操作活动,这些活动反映了一个软件组织改进软件过程时所必须满足的条件。也就是说,关键过程域标识了达到某个成熟程度级别时所必须满足的条件。在CMM中一共有18个关键过程域,分布在第二至五级中。  
         关键实践(Key Practices):是指关键过程域中的一些主要实践活动。每个关键过程域最终由关键实践所组成,通过实现这些关键实践达到关键过程域的目标。

    软件过程评估(Software Process Assessment)是用来判断一个组织当前所涉及的软件过程的能力状态,判断下一个组织所面向得更高层次上的与软件过程相关的课题,以及利用组织的鼎力支持来对该组织的软件过程进行有效的改进。  
         软件能力评价是(Software Capability Appraisal)用来判断有意承担某个软件项目的软件组织的软件过程能力,或是判断已进行的软件过程所处的状态是否正确或是否正常。  

    软件工程组(Software Engineering Group):负责一个项目的软件开发和维护活动的团体。活动包括需求分析、设计、编码和测试等。  
         软件相关组(Software Related Groups):代表一种软件工程科目的团体,它支持但不直接负责软件开发或维护工作,如软件质量保证组、软件配置管理组合软件工程过程组等等。在CMM的关键实践中,软件相关组通常应该根据关键过程域和组织的上下文来理解。

    软件工程过程组(Software Engineering Process Group):是由专家组成的组,他们推进组织采用的软件过程的定义、维护和改进工作。在关键实践中,这个组织通常指“负责组织软件过程活动的组”。  
         系统工程组(System Engineering Group):是负责下列工作的个人的团体:分析系统需求;将系统需求分配给硬件、软件和其他成分;规定硬件、软件和其他成分的界面;监控这些成分的设计和开发以保证它们符合其规格说明。

    系统测试组(System Test Group):是一些负责策划和完成独立的软件系统测试的团体,测试的目的是为了确定软件产品是否满足对它的需求。

         软件质量保证组(Software Quality Assurance Group):是一些计划和实施项目的质量保证的团体,其工作目的是保证软件过程的步骤和标准是否得到遵守。

    软件配置管理组(Software Configuration Management Group):是一些负责策划、协调和实施软件项目的正式配置活动的团体。

         培训组(Training Group):是一些负责协调和安排组织培训活动的团体。通常这个组织负责准备和讲授大多数培训课程并协调其他培训方式的使用。
    CMM 的分级
    任何一个软件的开发、维护和软件组织的发展离不开软件过程,而软件过程经历了不成熟到成熟、不完善到完善的发展过程。它不是一朝一夕就能成功的,需要持续不断的对软件过程进行改进,才能取得最终的成效。CMM就是根据这一指导思想设计出来的。该模型为了正确和有序地引导软件过程活动的开展,建立一个能够有效地描述和表示的软件过程的改进框架,使其能够对各阶段软件过程的任务和管理起指导作用。该模型以产品质量的概念和软件工程的经验教训为基础,指导企业如何控制开发、维护软件的生产过程和如何制定一套与之相适应的软件过程及管理体系。
    (一)、分级标准
    CMM模型描述和分析了软件过程能力的发展程度,确立了一个软件过程成熟程度的分级标准。一方面软件组织利用它可以评估自己当前的过程成熟度,并以此提出严格的软件质量标准和过程改进的方法和策略,通过不断的努力去达到更高的成熟程度。另一方面,该标准也可以作为用户对软件组织的一种评价标准,使之在选择软件开发商时不再是盲目的和无把握的。

    CMM的分级结构可以描述为:
         ①、初始级:软件过程的特点是无秩序的,有时甚至是混乱的。软件过程定义几乎处于无章法和步骤可循的状态,软件产品所取得的成功往往依赖于极个别人的努力和机遇。
         ②、可重复级:已建立了基本的项目管理过程,可用于对成本、进度和功能特性进行跟踪。对类似的应用项目,有章可循并能重复以往所取得的成功。
         ③、已定义级:用于管理的和工程的软件过程均已文档化、标准化,并形成了整个软件组织的标准软件过程。全部项目均采用与实际情况相吻合的、适当修改后的标准软件过程来进行操作。

    ④、已管理级:软件过程和产品质量有详细的度量标准。软件过程和产品质量得到了定量的认识和控制。
         ⑤、优化级:通过对来自过程、新概念和新技术等方面的各种有用信息的定量分析,能够不断地、持续地对促进过程进行改进。
    除第一级外,每一级都设定了一组目标,如果达到了这组目标,则表明达到了这个成熟级别,自然可以向下一级别迈进。CMM体系不主张跨级别的进化。因为从第二级开始,每一个低级别的实现均是高级别实现的基础。
    (二)CMM的主要内容
    CMM为软件企业的过程能力提供了一个阶梯式的进化框架,它采用分层的方式来解释其组成部分,如图示。在第二至第五个成熟等级中,每个等级包含一个内部结构的概念。      每一级向上一级迈进的过程中都有其特定的改进计划,具体情况如下。

     

    初始级的改进方向是:建立项目过程管理,是使规范化管理,保障项目的承诺;艳进行需求管理方面的工作,建立用户域软件项目之间的沟通,使项目真正反映用户的需求;建立各种软件项目几乎,如软件开发计划、软件质量保证计划、软件配置管理计划、软件测试计划、风险管理计划及过程改进计划等;积极开展软件质量保证活动(SQA)。
         可重复级的改进方向是:不再按项目制定软件过程,而是总结各种项目的成功经验,使之规则化,把具体经验归纳为权利组织的标准软件过程,把改进软件组织的整体软件过程能力的软件过程活动,作为软件开发组织的责任;确定全组织的标准软件过程,把软件工程及管理活动集成到一个稳固确定的软件过程中,从而可以跨项目改进软件过程效果,也可以作为软件过程剪裁的基础;建立软件工程过程小组(SPEG)长期承担评估域调整软件过程的任务,以适应未来软件项目的要求;积累数据,建立组织的软件过程库及软件过程相关的文档;加强培训。

    已定义级的改进方向是:着手软件过程的定量分析,已达到定量地控制软件项目过程的效果;通过软件的质量管理达到软件质量的目标。
         已管理级的改进方向是:防范缺陷,不仅在发现了问题能及时改进,而且应采取特定行动防止将来出现这类缺陷;主动进行技术改革管理、标识、选择和评价新技术,是有效的新技术能在开发组织中实施;进行过程变更管理,定义过程改进的目的,经常不断地进行过程改进。
         优化级的改进目标方向是:保持持续不断的软件过程改进。
    (三)CMM的内部结构
    CMM为软件过程能力的提高提供了一条改进的途径。CMM由5个成熟度等级组成,每个成熟度等级有着各自的功能。除第一级外,CMM的每一级按完全相同的内部结构构成的。成熟度等级为顶层,不同的成熟度等级反映了软件组织的软件过程能力和该组织可能实现预期结果的程度。 在CMM中,每个成熟度等级(第一级除外)规定了不同的关键过程域,一个软件组织如果希望达到某一个成熟度级别,就必须完全满足关键过程域所规定的要求,即满足关键过程域的目标。
    (四)软件过程评估和软件能力评价
    软件过程评估所针对的是软件组织自身内部软件过程的改进问题,目的在于发现缺陷,提出改进方向。评估组以CMM模型为指引调查、鉴别软件过程中的问题,翻过来将这些问题与CMM关键实践活动所提出的指导一起用于确定组织的软件过程改进策略。
         软件能力评价是对接受评价者在一定条件下、规定时间内能否完成特定项目的能力考核,即承担风险的系数大小。评价包括承包者是否有能力按计划开发软件产品,是否能按预算完成等。通过利用CMM模型确定评价结果后,就可以利用这些结果确定选择某一承包商的风险。也可以用来判断承包者的工作进程,推动他们解决软件过程。

    CMM为评估和评价提供了一个参考框架,指出了在评估和评价中通常采用的步骤。      具体来说,评估过程是:选择一个工作组;完成问卷调查和取样工作;结果分析;现场访问;与CMM模型对照分析;依据关键过程域的基本情况列出评估提纲。以上步骤在软件过程评估和软件能力评价题勾勒很有参考价值的方法,但在具体操作时以下这些特点也值得考虑:

         ①、在现场访问和考察中,充分运用成熟度问卷和结果分析为依据。
         ②、以CMM模型作为现场调查的路线图。
         ③、利用CMM中的关键过程域定义软件过程中的优点和缺陷,从中发现差异。
         ④、对关键过程域目标是否是满足的实际情况出发,分析满意程度,写出书面报告。
         尽管软件过程评估和软件能力评价有很多相似之处,但由于其目的和结果的不同,它们之间的差异也是必然存在的,如:

    ①、软件过程评估和软件能力评价在出发点和目标上的不同,使得会谈目的、调查范围、收集的信息和输出的表示方式上有着本质的不同。尤其在一些细节规范方面,评估和评价的方法有很大差异。      ②、软件过程评估和软件能力评价的结果和结果所起的作用不同。因为两者的侧重点不一样,即使是对同一个应用项目,运用相同的方法,也不会得出相同的结果。      ③、被评估和评价单位的态度对评估和评价活动的影响。评估在某种意义上被评估单位的态度较积极,而评价在某种意义上被评价单位的态度可能比较慎重。软件过程评估是在一个开放的、互相协作的环境中进行的,而软件能力评价往往是在有较大的阻力的环境中进行的。

    (五)CMM的组织保证

        当人们面对CMM实施时,首先想到的就是人员的构成和各种小组的划分。它是实施CMM的组织保证,是一切活动的基础。CMM在制定软件过程实施中本着尽量不和具体的组织机构和组织形式相联系的原则,为的是提供一个独立于具体企业而又有广泛指导意义的模型框架。但在实施各种软件关键实践中,不可避免地要涉及到角色和组织结构。所以为了使CMM能够适用各种级别和各种规模的企业,SEI提出了一个相对抽象的组织结构,它与组织、项目、人员(角色)相关联,具有自己特定的术语,而且可能不同于其他组织所用的名词。例如基本概念中提到的主要的软件工作组的概念。

    三、 正确的态度看待CMM

        SEI的CMM并不是软件开发的方法学,也不是产品模板,更不是过程法律。CMM是过程改进的途径,是一套指南,帮助你通过持续的重复、测量和提炼,稳步创造与净化开发环境。CMM的假定是:如果你实施一个不断重复、测量和提炼的大纲,作为环境改进的副产物,质量便会自然的提高。不要把CMM设想为一套规则,而应将它理解为一个学科,做事的一般方法。在这套指南下运作,你会发现这里有着广阔的空间,让你剪裁和塑造自己的大纲,以适应组织的特定要求。

    CMM不采用“用这种方法做这类事”的风格,它也不对由问题的IT组织提供快速的纠正方案。CMM是一个指南针,指导你如何逃离暴风雪。CMM是一个大纲,要求你对整个IT组织的有关部分,从高层领导到软件生产的第一次线工作者,都做出坚定的、长期的实施承诺。成熟的过程不可能在它之间实现。
         在如何解释CMM建议时,它允许极大的灵活性。CMM意识到,IT组织之间存在着很大的差别。他们的客户不同,使用的工具不同,人员智力和专业背景不同,从事的项目属于不同的类型,规模大小不同,要求也各不相同。因而,他们应当以自己的方式走向成熟。在一处活用的东西,在另一处未必适用。这一点非常重要,中国部分软件公司的前车之鉴也从某种程度上给了我们建议和经验教训,那就是,要灵活应用CMM,不要幻想一夜就有成效。
    从 CMM 到 CMMI 的映射
    CMM 到 CMMI 的映射是一个复杂的体系,它涉及到 KPA 重构, KP 的再组织。图 1 只是从总体上描述了 CMM 到 CMMI 的映射关系。

    映射分析
    CMMI 虽然是建立在 CMM 基础之上,两者大部分相似,但还是有很大差异。从总体上讲, CMMI 更加清晰的说明各过程域和类属实践( generic practice )如何应用实施,并指出如何将工作产品纳入相应等级的配置和数据管理基线,风险管理策略,验证策略等。 CMMI 包含更多工程活动,如需求开发,产品集成,验证等过程域;过程内容的定义更加清晰,较少强调文档化规程。
    如图,在 CMMI2 级中增加了测量和分析 KPA ( Measurement and analysis ),将各测量分析实践( KP )归结为一个正式的关键过程域,而在 CMM 中测量分析实践是散落在各等级中的。因此在 CMMI 中更加强调了量化管理,管理的透明度和软件开发的透明度得到了升级。

    CMMI3 级中增加了需求开发( Requirements Development )、技术解决方案( Technical Solution )、产品集成( Product Integration )、验证( Verification )、确认( Validation )、风险管理( Risk Management )、决策分析和决定( Decision Analysis and Resolution ) KPAs 。 CMM 中的软件产品工程 KPA 被需求开发,技术解决方案,产品集成,验证,确认 KPAs 所取代;同行评审 KPA 被融入到验证 KPA 中; CMM 中集成软件管理 KPA 所阐述的风险管理在 CMMI3 中形成了一个独立风险管理 KPA 。同时集成软件管理和组间协调 KPAs 合并成集成项目管理 KPA 。合成团队、决定分析和解决方案、组织的一体化环境 KPAs 是全新的,其过程内容在 CMM 中没有提及。
    CMMI4 中没有新的过程域,只是对原来的定量过程管理,软件质量管理 KPAs 重新构建为定量项目管理和组织过程性能 KPAs 。
    CMMI5 中的技术变更管理和过程变更管理 KPAs 合并为组织革新与技术推广 KPA ,缺陷防范 KPA 重新构建为原因分析和解决方案 KPA 。
    CMM 到 CMMI 的升级
    升级前的准备工作
    (1) 回顾 CMMI 模型和其他的 CMMI 信息,确定如何使 CMMI 最好的满足组织需要( 2 )拟订升级策略。( 3 ) 在升级过程中确保以前用于 CMM 改进的投资得到维持和运用( 4 )将升级事项通告客户( 5 )将对现有过程域和新增过程域的改进费用编入预算,并提供有关改进需要的培训。( 6 )确定组织升级计划的风险表并管理这些风险,关键要识别 CMM 和 CMMI 之间的差异以及这些差异如何得到支持。

    升级的方法:
    一旦做好了升级前的准备工作,弄清了升级可带来的利益和成本,可执行下列活动进行升级,这些活动是迭代的。
    ( 1 ) 选择适合组织最好的 CMMI 模型。 CMMI 覆盖各种知识体,包括项目管理,软件工程,系统工程,集成产品,过程开发供应商来源。按组织的商业目标选择模型。
    ( 2 )选择最适合组织的表示法。 CMMI 有阶段式表示法和连续式表示法,由于 CMM 采用的是阶段式的表示法,许多组织都采取 CMMI 阶段式表示法,若组织对连续式表示法较熟悉,也可以采取连续式表示法。
    ( 3 )将选择的 CMMI 模型与 CMM 对比,确定需要变更的范畴。具体的对比见上文。 变更的主要活动是对 CMMI 中重组的 KPA 及 CMMI 中新增的 KPA 进行更新。

    ( 4 ) 确定升级会带来的影响。
    ( 5 )向 CMMI 升级因该报高级管理层的认可。
    ( 6 )变更组织目前的过程改进计划以支持 CMMI 升级。过程改进计划要反映出工作的优先级、组织所需增加的新部门。将该计划送交评审,得到关键储金保管者( key stakeholders )的许诺和认可,计划要说明升级可能带来的管理风险和进度风险,所需的培训,工具,和服务支持。传达这个计划并保持更新。
    ( 7 )确保对工程过程组,技术工作组及其他相关的员工进行 CMMI 的培训。
    ( 8 )获取 SCAMPI 评估支持。
    ( 9 ) 修改每个项目已定义的过程使其与项目改进计划一致。
    ( 10 )给每个项目制定升级进度表 不同的项目升级进度表可能不同,如果有的升级工作已经完成则该工作可以抛弃。
    ( 11 )执行 SCAMPI 评估,看是否所有的目标过程域和目标得到支持。
    处于 CMM 不同成熟等级的组织所做的具体工作
    ( 1 ) CMM1 级:
    如果组织正使用 CMM 模型致力于过程改进而并处于 CMM1 级,那么组织应该继续用 CMM 模型。在改进的同时,组织将 CMM2 与 CMMI2 进行对比和差异确认,分析这些差异中哪些是对组织有价值的。当组织刚达到 CMM2 级时其主要工作时立即从 CMM2 向 CMMI2 升级。
    ( 2 ) CMM2 级,
    组织应该把其当前的过程改进向 CMMI2 级映射,填补两者之间的差距,从 CMM2 升级到 CMMI2 完成后,在下一步的工作中采用 CMMI 模型进行过程改进。主要有一下几方面

    (1) 将 CMM 中分散的测量分析活动集中到 CMMI2 级测量分析 KPA 中,形成一个独立的过程域,提高开发的透明度。
    (2) 重定位测量分析 KPA ( Measurement and Analysis )的共同特征( common feature )
    测量分析 KPA 重组见表 所示。


    表示符说明: QPM Co 2 Ac1,3,4,5,6 表示定量过程管理( Quantitative Process Management )过程域执行的约定( Commitment to perform ) 2 和执行活动( Activities to perform ) 1,3,4,5,6 。
    Co 表示执行的约定; Ab 表示执行的能力; Ac 表示执行的活动; SG 表示特殊目标( Special Goal ); GG 表示一般目标( Generic Goal );其他可类推。

    ( 3 ) CMMI3 级
    ①将 CMM 软件产品工程 KPA 分解为需求开发、技术解决方案、产品集成、认证、确认 KPAs ,并进行扩充。
    ②了解 CMMI3 级中新增的决定分析和解决方案、合成团队,组织一体化环境 KPAs ,并填补。
    ③迭代 CMM2 级的工作。
    说明
    卡内基梅隆大学软件工程研究所推出 CMM Version 2.0 draft C 后就停止了在 CMM 的改进。 CMM 被 CMMI 所取代是大势所趋。许多正在运用 CMM 模型进行软件过程改进的组织纷纷向 CMMI 升级。而 CMMI 模型迄今还没有成熟,卡内基梅隆大学软件工程研究所 推出了 CMMI-SE/SW 1.1 和 CMMI-SE/SW/IPPD ,在目前的产品集中没有关于软件采购方面的内容,估计以后还会推出这个科目。而且从 CMM 向 CMMI 升级也只是处于尝试阶段。组织升级的操作过程,运用 CMMI 模型所带来的效益等信息还很匮乏,这些信息也为未能及时反馈到卡内基梅隆大学软件工程研究所,这也给 CMMI 模型的改进及向 CMMI 的升级工作带来了一定的难度。

    关于CMM评估的一些背景资料
    CMM评估包括5个等级,共计18个关键过程域,52个目标,300多个关键实践。每一个CMM等级评估周期(从准备到完成)约需12-30个月。每一级别的评估由美国卡内基梅隆大学的软件工程研究所授权的主任评估师领导一个评审小组进行,其成员大部分来自企业内部。评估过程包括员工培训(企业的高层领导也要参加)、问卷填写和统计、文档审查、数据分析、与企业的高层领导讨论和撰写评估报告等。评估结束由主任评估师签字生效。国外CMM等级评估生效,只需要主任评估师的签字,既没有某主管单位的批准,也没有盖上公章的证书。显然,国外更看重主任评估师及公司的信誉。

    取得主任评估师的资格的条件: § 首先要有10年以上的软件开发经验; § 其次要在美国卡内基梅隆大学的软件工程研究所接受培训,培训费用每人约需数万美元,非美国人加倍; § 第三要经过两次以上CMM评估的全过程实习; § 第四要得到已有主任评估师资格的人推荐。主任评估师的资格并非终身制,如要继续保持,每年至少要参加两次CMM评估。 目前全世界一共只有313个主任评估师,大部分在美国,而我国大陆还没有一个主任评估师。由于我国在CMM评估中要聘请外籍主任评估师,所以费用较高。据估计,要通过一个级别的CMM评估,费用是通过ISO9001认证的十多倍。
    作业
    1、请用图表的形式描述CMM的分级结构?
    2、软件过程性能和软件过程能力的主要区别是什么?
    3、关键实践的主要描述的是什么?
    4、CMM和CMMI的主要区别有哪些?
    5、假如你是SQA,你应该具有什么样的心态去看待CMM的评定?

     

    软件工程的七条基本原理

           自从1968年提出软件工程这一术语以来,研究软件工程的专家学者们陆续提出了100多条关于软件工程的准则或信条。美国著名的软件工程专家 Boehm 综合这些专家的意见,并总结了TRW公司多年的开
    发软件的经验,于1983年提出了软件工程的七条基本原理。

    Boehm
    认为,这七条原理是确保软件产品质量和开发效率的原理的最小集合。它们是相互独立的,是缺一不可的最小集合;同时,它们又是相当完备的。

    人们当然不能用数学方法严格证明它们是一个完备的集合,但是可以证明,在此之前已经提出的100多条软件工程准则都可以有这七条原理的任意组合蕴含或派生。

    下面简要介绍软件工程的七条原理:

    1
    用分阶段的生命周期计划严格管理

    这一条是吸取前人的教训而提出来的。统计表明,50%以上的失败项目是由于计划不周而造成的。在软件开发与维护的漫长生命周期中,需要完成许多性质各异的工作。这条原理意味着,应该把软件生命周期分成若干阶段,并相应制定出切实可行的计划,然后严格按照计划对软件的开发和维护进行管理。 Boehm 认为,在整个软件生命周期中应指定并严格执行6类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。

    2
    坚持进行阶段评审

    统计结果显示: 大部分错误是在编码之前造成的,大约占63%; <2> 错误发现的越晚,改正它要付出的代价就越大,要差23个数量级。 因此,软件的质量保证工作不能等到编码结束之后再进行,应坚持进行严格的阶段评审,以便尽早发现错误。

    3
    实行严格的产品控制

    开发人员最痛恨的事情之一就是改动需求。但是实践告诉我们,需求的改动往往是不可避免的。这就要求我们要采用科学的产品控制技术来顺应这种要求。也就是要采用变动控制,又叫基准配置管理。当需求变动时,其它各个阶段的文档或代码随之相应变动,以保证软件的一致性。

    4
    采纳现代程序设计技术

    从六、七时年代的结构化软件开发技术,到最近的面向对象技术,从第一、第二代语言,到第四代语言,人们已经充分认识到:方法大似气力。采用先进的技术即可以提高软件开发的效率,又可以减少软件维护的成本。

    5
    结果应能清楚地审查

    软件是一种看不见、摸不着的逻辑产品。软件开发小组的工作进展情况可见性差,难于评价和管理。为更好地进行管理,应根据软件开发的总目标及完成期限,尽量明确地规定开发小组的责任和产品标准,从而使所得到的标准能清楚地审查。

    6
    开发小组的人员应少而精

    开发人员的素质和数量是影响软件质量和开发效率的重要因素,应该少而精。这一条基于两点原因:高素质开发人员的效率比低素质开发人员的效率要高几倍到几十倍,开发工作中犯的错误也要少的多; 当开发小组为N人时,可能的通讯信道为N(N-1)/2, 可见随着人数N的增大,通讯开销将急剧增大。

    7
    承认不断改进软件工程实践的必要性

    遵从上述六条基本原理,就能够较好地实现软件的工程化生产。但是,它们只是对现有的经验的总结和归纳,并不能保证赶上技术不断前进发展的步伐。因此,Boehm提出应把承认不断改进软件工程实践的必要性作为软件工程的第七条原理。根据这条原理,不仅要积极采纳新的软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估新的软件技术的效果,也可以用来指明必须着重注意的问题和应该优先进行研究的工具和技术。

    常用的功能测试方法

    功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。常用的测试方法如下:

      1. 页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确。

      2. 相关性检查:删除/增加一项会不会对其他项产生影响,如果产生影响,这些影响是否都正确。

      3. 检查按钮的功能是否正确:如update, cancel, delete, save等功能是否正确。

      4. 字符串长度检查: 输入超出需求所说明的字符串长度的内容, 看系统是否检查字符串长度,会不会出错.

      5. 字符类型检查: 在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型,会否报错.

      6. 标点符号检查: 输入内容包括各种标点符号,特别是空格,各种引号,回车键.看系统处理是否正确.

      7. 中文字符处理: 在可以输入中文的系统输入中文,看会否出现乱码或出错.

      8. 检查带出信息的完整性: 在查看信息和update信息时,查看所填写的信息是不是全部带出.,带出信息和添加的是否一致

      9. 信息重复: 在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理.

      10. 检查删除功能:在一些可以一次删除多个信息的地方,不选择任何信息,”delete”,看系统如何处理,会否出错;然后选择一个和多个信息,进行删除,看是否正确处理.

      11. 检查添加和修改是否一致: 检查添加和修改信息的要求是否一致,例如添加要求必填的项,修改也应该必填;添加规定为整型的项,修改也必须为整型.

      12. 检查修改重名:修改时把不能重名的项改为已存在的内容,看会否处理,报错.同时,也要注意,会不会报和自己重名的错.

      13. 重复提交表单:一条已经成功提交的纪录,back后再提交,看看系统是否做了处理。

      14. 检查多次使用back键的情况: 在有back的地方,back,回到原来页面,back,重复多次,看会否出错.

      15. search检查: 在有search功能的地方输入系统存在和不存在的内容,search结果是否正确.如果可以输入多个search条件,可以同时添加合理和不合理的条件,看系统处理是否正确.

      16. 输入信息位置: 注意在光标停留的地方输入信息时,光标和所输入的信息会否跳到别的地方.

      17. 上传下载文件检查:上传下载文件的功能是否实现,上传文件是否能打开。对上传文件的格式有何规定,系统是否有解释信息,并检查系统是否能够做到。

      18. 必填项检查:应该填写的项没有填写时系统是否都做了处理,对必填项是否有提示信息,如在必填项前加*

      19. 快捷键检查:是否支持常用快捷键,如Ctrl+C Ctrl+V Backspace等,对一些不允许输入信息的字段,如选人,选日期对快捷方式是否也做了限制。

      20. 回车键检查: 在输入结束后直接按回车键,看系统处理如何,会否报错.

     

       此文是对我个人测试思想的一个总结,由于经验不够,知识浅薄,如果有什么不合理的地方请一笑了之。
    一、面向对象的概念

        所谓的面向对象是软件开发的一种重要的思维方式,是把软件开发过程中出现的事物,用一个个的对像来分析.一般一张数据表可以封装为一个对像。用个形象的比喻:我们现在要做一张桌子,首先我们考虑到的是我们要做的是什么?是桌子;桌子是用来干什么的呢?是用来吃饭、喝茶、看书、打麻将的;然后就要考虑桌子由哪些部分组成?由桌面和桌腿来组成;接着我们需要考虑我们采用什么材料呢?纸?不行...那可什么都干不成,OK,用木头;接着就可以开始把组成桌子的组件做为对象开始分析--桌面如何做是用刀砍的还是用刨子刨呢?桌腿又如何做
    ...
    一套完整的方法成形了就可以具体实现了,在做的过程中桌面要做多大,桌腿要做多长都要事先考虑到是不是要留出接口,这些就是我们给组成桌子的组件赋予的属性。OK,现在可以做出具体的实物了,做好实物组件(对象)以后就要将做好的桌面桌腿进行组装,由于我们事先考虑好了组件的属性,考虑到了必须预留接口,因此我们可以很轻易的组合成功,桌子做出来了。以上就是面向对象的思想的一个简要的比喻


    了解面向对象必须了解的几个名词:对象、方法、属性、继承、多态


    二、游戏测试

        游戏测试是整个软件测试行业中比较特殊的一部份,他有着大多数软件测试的共性,也具备自身的特性,而相对于许多通用软件的测试来说,游戏测试所具备的特性是非常明显的。现在就简要的说说上面提到的共性和特性。

    共性:

    1、测试的目的就是为了尽可能的发现软件存在和潜在的问题。

    2、测试都是需要测试人员按照产品行为描述来实施。产品行为描述可以是书面的规格说明书、需求文档、产品文件、或是用户手册、源代码、或是工作的可执行程序。

    3、每一种测试都需要产品运行于真实的或是模拟环境之下。

    4、每一种测试都要求以系统方法展示产品功能, 以证明测试结果是否有效, 以及发现其中出错的原因, 从而让程序人员进行改进。

        总之,软件测试就是对产品进行尽可能的全面检查,尽可能的发掘bug,提高软件质量,从而为企业创造利润。

    特性:

        网络游戏世界从某种意义上说是另一个人类社会,只是人们在网络游戏世界中进行着在被允许的范围内的活动,包括了修炼、交流、合作、经商、欺诈、情感、冲突等等。而在游戏制作时这些进行这些行为的部分就是一个个完整的功能,我们在进行测试的时候,需要考虑的不仅仅是能否实现功能,要考虑更多的是人们在进行操作时会如何做,可能有多少种做法,这些做法应该有什么样的响应,哪些做法是被禁止的,在进行了被禁止的操作后应该有什么的响应。因此这里就是涉及到了游戏世界的测试方法:

    1、游戏情节的测试,主要指游戏世界中的任务系统的组成, 有人也称为游戏世界的事件驱动, 我喜欢称为游戏情感世界的测试。

    2、游戏世界的平衡测试,主要表现在经济平衡,能力平衡( 包含技能, 属性等等),保证游戏世界竞争公平。

    3、游戏文化的测试,比如整个游戏世界的风格, 是中国文化主导,还是日韩风格等等,大到游戏整体,小到N P C( 游戏世界人物) 对话, 比如一个书生,他的对话就必需斯文, 不可以用江湖语言。


    以上陈述中关于游戏特性的部分概念是曾在金山公司的测试人陈卫俊提出来过的,在此引用


    三、如何用面向对象的思想进行测试

        上面了解了面向对象的概念以及游戏测试和通用软件测试的区别以后我们可以进入正题了---如何用面向对象的思想进行游戏测试
    ?
        首先,和所有通用软件以及硬件产品一样,我们的游戏是一个产品,是一个存在的实体,因此,我们把这个"实体"当做一个大的对象开始分析,整个游戏由哪些部分构成,而构成整个游戏的大的部分又由哪些组件构成,认真分析完这些以后就可以着手进行测试了,注意,这里说"可以进行测试了"意思不是马上就能进入测试,听我慢慢道来
    .
         "工欲善其事,必先利其器"---某位高人说的,我们做测试也是一样,分析完毕后,我们要做的还是分析 ^_^ 不过这里的分析和之前的分析有点点区别,这里我们需要分析的是具体功能的关键测试点和风险点,测试不能盲目,打蛇要打七寸.....在这里我们就是把某个具体的功能作为一个对象,我们要分析组成这个功能的是哪些因素,一共有哪些测试点,哪些测试点是关键点,哪些是高风险点,一一列举出来,这样我们就一目了然了,然后就是我们打算采用何种方式来进行测试,这里就是方法了.测试的方式可能有很多种(比如在不同的操作系统下进行测试等),因此我们也需要一一列举,此外我们需要分析的还有测试过程中我们需要用到的具体测试手法、具体的数值、特定的环境等等这些就是属性,当然这些我们也必须整理出来。

        将以上提到的对象、方法、属性整理成文档就是我们测试时所必须的测试用例了。当然,还是老话,测试用例的优劣是以覆盖面来评判的,这里就需要经验了,简单说就是靠累积以及学习。

         OK,测试用例我们完成了,剩下的就是实施测试了,实施测试时个人觉得一定要按照用例的描述去执行,如果在测试过程中觉得用例不完善可以先更新用例再进行测试,一定不要先测试再补用例!!

        接下来就是测试报告,报告中包含的应该有所有测试点的简述,包括了通过测试的部分和存在bug的部分。bug管理是很重要的一环,在这里不详述。

        关于测试流程在这里就不做具体说明,在这里希望阐述的是一种测试的思想,个人觉得测试除了要有扎实的相关基础知识以便更深入的了解产品以外,更重要的是测试思想,具备了完善的测试思想才能有计划的完成每一步测试,从而提高测试的效率,保证测试产出的质量,也更好的保证产品的质量。面向对象是一种思想,用面向对象的思想来组织、计划、实施测试工作,能让我们在测试工作中有很强的目的性,他能清楚地告诉我们今天要做什么,明天要做什么,我们要做的是哪些,说回游戏测试,游戏开发是一个迭带的开发模式,因此测试工作往往会有很大的随机性,因此当我们接到一个新功能时,首先要明确我们要测得这个功能是做什么的,有什么用,这个功能怎么使用。OK,我们了解了这个功能是什么,能做什么就可以开始细化分析了:这个功能共由哪些子功能组成,这些子功能是否有自己的子功能点,一层层的分析下去,然后就是从最底层的功能点分析:这个功能什么情况下要发挥其功效,发挥其功效的因素有哪些,怎么样去发挥具体的功效,该功能有没有相应的容错机制,这些就是我们的详细测试点和测试手法。然后向上一层一层分析,一直到最顶层就是我们的功能完整的测试方针。这样我们就把面向对象的思想完全用到了测试中。当然,在分析的过程中我们必须考虑到,与游戏情节、游戏风格、游戏平衡、玩家的易用性是否冲突等等因素,适时地给策划提出正确的建议。

         
        以上陈述的种种,无非是想将面向对象的思想用到测试中的好处列举出来,或许经验浅薄说的有些苍白,但是我坚信一点,测试是一种思想,是一种绝对不亚于开发思想的学问,要想做好测试就需要具备良好的测试思想,或者良好的测试思想不是一天两天能够形成的但是相信只要把测试当做一种职业,当作一种事业来做,把自己真正当成保证产品质量的最后一道关卡,成为一个BT(BestTester)就指日可待了!

    软件测试用例的认识误区

    软件测试用例是为了有效发现软件缺陷而编写的包含测试目的、测试步骤、期望测试结果的特定集合。正确认识和设计软件测试用例可以提高软件测试的有效性,便于测试质量的度量,增强测试过程的可管理性。

    在实际软件项目测试过程中,由于对软件测试用例的作用和设计方法的理解不同,测试人员(特别是刚从事软件测试的新人)对软件测试用例存在不少错误的认识,给实际软件测试带来了负面影响,本文对这些认识误区进行列举和剖析。

    误区之一:测试输入数据设计方法等同于测试用例设计方法

    现在一些测试书籍和文章中讲到软件测试用例的设计方法,经常有这样的表述:测试用例的设计方法包括:等价类、边界值、因果图、错误推测法、场景设计法等。这种表述是很片面的,这些方法只是软件功能测试用例设计中如何确定测试输入数据的方法,而不是测试用例设计的全部内容。

    这种认识的不良影响可能会使不少人认为测试用例设计就是如何确定测试的输入数据,从而掩盖了测试用例设计内容的丰富性和技术的复杂性。如果测试用例设计人员把这种认识拿来要求自己,则害了自己;拿来教人,则害了别人;拿来指导测试,则害了测试团队。听起来似乎是小题大做,但是绝不是危言耸听

    无疑,对于软件功能测试和性能测试,确定测试的输入数据很重要,它决定了测试的有效性和测试的效率。但是,测试用例中输入数据的确定方法只是测试用例设计方法的一个子集,除了确定测试输入数据之外,测试用例的设计还包括如何根据测试需求、设计规格说明等文档确定测试用例的设计策略、设计用例的表示方法和组织管理形式等问题。

    在设计测试用例时,需要综合考虑被测软件的功能、特性、组成元素、开发阶段(里程碑)、测试用例组织方法(是否采用测试用例的数据库管理)等内容。具体到设计每个测试用例而言,可以根据被测模块的最小目标,确定测试用例的测试目标;根据用户使用环境确定测试环境;根据被测软件的复杂程度和测试用例执行人员的技能确定测试用例的步骤;根据软件需求文档和设计规格说明确定期望的测试用例执行结果。

    误区之二:强调测试用例设计得越详细越好

    在确定测试用例设计目标时,一些项目管理人员强调测试用例越详细越好。具体表现在两个方面:尽可能设计足够多的设计用例,测试用例的数量阅读越好;测试用例尽可能包括测试执行的详细步骤,达到任何一个人都可以根据测试用例执行测试,追求测试用例越详细越好。

    这种做法和观点最大的危害就是耗费了很多的测试用例设计时间和资源,可能等到测试用例设计、评审完成后,留给实际执行测试的时间所剩无几了。因为当前软件公司的项目团队在规划测试阶段,分配给测试的时间和人力资源是有限的,而软件项目的成功要坚持质量、时间、成本的最佳平衡,没有足够多的测试执行时间,就无法发现更多的软件缺陷,测试质量更无从谈起了。

    编写测试用例的根本目的是有效地找出软件可能存在的缺陷,为了达到这个目的,需要分析被测试软件的特征,运用有效的测试用例设计方法,尽量使用较少的测试用例,同时满足合理的测试需求覆盖,从而达到少花时间多办事的效果。

    测试用例中的测试步骤需要详细到什么程度,主要取决于测试用例的最终用户(即执行这些测试用例的人员),以及测试用例执行人员的技能和产品熟悉程度。如果编写测试用例的人员也是测试用例执行人员,或者测试用例的执行人员深刻了解被测软件,测试用例就没有必要太详细。而如果是测试新人执行测试用例,或者软件测试外包给独立的第三方公司,那么测试用例的执行步骤最好足够详细。

    误区之三:追求测试用例设计一步到位

    现在软件公司都意识到了测试用例设计的重要性了,但是一些人认为设计测试用例是一次性投入,测试用例设计一次就万事大吉了,片面追求测试设计的一步到位

    这种认识造成的危害性使设计出的测试用例缺乏实用性,或者误导测试用例执行人员,误报很多不是软件缺陷的“Bug”,这样的测试用例在测试执行过程中形同虚设,难免沦为垃圾文档的地步。

    唯一不变的是变化。任何软件项目的开发过程都处于不断变化过程中,用户可能对软件的功能提出新需求,设计规格说明相应地更新,软件代码不断细化。设计软件测试用例与软件开发设计并行进行,必须根据软件设计的变化,对软件测试用例进行内容的调整,数量的增减,增加一些针对软件新增功能的测试用例,删除一些不再适用的测试用例,修改那些模块代码更新了的测试用例。

    软件测试用例设计只是测试用例管理的一个过程,除此之外,还要对其进行评审、更新、维护,以便提高测试用例的新鲜度,保证可用性。因此,软件测试用例也要坚持与时俱进的原则。

    误区之四:让测试新人设计测试用例

    在与测试同行交流的过程中,不少刚参加测试工作的测试新人经常询问的一个问题是:怎么才能设计好测试用例?。因为他(她)们以前从来没有设计过测试用例,面对大型的被测试软件感到老虎吃天,无从下口

    让测试新人设计测试用例是一种高风险的测试组织方式,它带来的不利后果是设计出的测试用例对软件功能和特性的测试覆盖性不高,编写效率低,审查和修改时间长,可重用性差。

    软件测试用例设计是软件测试的中高级技能,不是每个人(尤其是测试新人)都可以编写的,测试用例编写者不仅要掌握软件测试的技术和流程,而且要对被测软件的设计、功能规格说明、用户试用场景以及程序/模块的结构都有比较透彻的理解。

    因此,实际测试过程中,通常安排经验丰富的测试人员进行测试用例设计,测试新人可以从执行测试用例开始,随着项目进度的不断进展,测试人员的测试技术和对被测软件的不断熟悉,可以积累测试用例的设计经验,编写测试用例。


     

    使用面向对象的思想进行测试(游戏测试相关)
    展开全文
  • 分配多值4. 输出变量5. 全局变量 前言一定要看 python能干什么?有什么用?好处在哪?不要我讲了,这不是我在博客该讲的,言简意赅就是:通俗易懂,上手快,实用强。我会根据自己个人理解以及国外官网翻译为中文...
  • 大数据经过10年发展,现在已经到了一重要的分水岭阶段:通用性和兼容性能力成为大数据发展主流,运行的稳定可靠和使用的简捷、易开发、易维护成为产品发展的驱动力,而这正是 Hadoop/Spark 这类积木式模块框架无法...
  • Android增量代码测试覆盖率工具

    千次阅读 2018-04-23 17:16:27
    Android增量代码测试覆盖率工具 前言 美团点评业务快速发展,新项目新业务不断出现,在项目开发和测试人员不足、开发同学粗心的情况下,难免会出现少测漏测的情况,如何保证新增代码有足够的测试覆盖率是我们...
  • Jacoco增量代码覆盖

    千次阅读 2020-10-27 18:56:18
    jacoco增量代码覆盖率 作者:兰绿,荣荣 文章结构 背景 Jacoco简介 Jacoco 增量代码覆盖率设计方案 Jacoco增量代码覆盖率+持续交付 总结 一、背景 需求测试过程中,测试主要依靠需求及一些测试经验来主观保证质量...
  • 全球最新的土地覆盖数据在这里!

    千次阅读 2020-09-21 16:57:15
    前不久自然资源部更新了2020年的土地覆盖数据,地址就在这里:http://www.globallandcover.com/home.html今天就来介绍一下这数据吧。 30米全球地表覆盖数据GlobeLand30是中国研制的30米空间分辨率全球地表覆盖...
  • 嵌入式软件的覆盖测试

    千次阅读 2006-12-27 22:51:00
    嵌入式软件的覆盖测试作者: 佚名 (来自18show) 摘要:覆盖测试是验证软件功能结构正确性以及查找问题的非常重要的方法和手段,它要借助一定的工具才能取得较好的效果,满足软件在质量和时间上的双重要求(纯粹的...
  • 首先弄明白两概念-大概说一下,具体的网上都有: 覆盖索引-select b,c,d from t1 ; select b,c,d from t1 where b=1 and c =1 and d=1 ; select a,b,c,d from t1 where b=1 and c =1 and d=1; 【a是主键,给bcd...
  •  土地覆盖制图中,数据处理技术、信息提取过程是一系统工程,包括系列基础流程和关键技术。每一处理过程都会影响到信息提取的准确度和精度。MRLC项目系列数据处理过程包括分类分区方法、数据选取、处理、转换、...
  • 在前面四篇文章的当中,我们已经学习了Glide的基本用法、Glide的工作原理和执行流程、Glide的缓存机制、以及Glide的回调机制等内容。如果你能将前面的四篇文章都掌握好了,那么恭喜你,现在你已经是一名Glide好手了...
  • 马蜂窝技术原创内容,更多干货请关注公众号:mfwtech 测试覆盖率常被用来衡量测试的充分性和完整性,也是测试有效性的一度量。「敏捷开发」的大潮之下,如何在快速迭代的同时保证对被测代码的覆盖度和产品质量,...
  • 此外,真实的文本内容安全系统也不是几模型就能搞定的,它是一套成熟的解决方案,使用丰富的检测手段分别覆盖不同的场景,保证较高的检测率。 参考文献 https://www.aclweb.org/anthology/D14-1181 ...
  • 史上最的中高级JAVA工程师-面试题汇总

    万次阅读 多人点赞 2019-10-15 18:58:32
    史上最的java工程师面试题汇总,纯个人总结,精准无误。适合中高级JAVA工程师。
  • 牛逼!Java 从入门到精通,超汇总版

    万次阅读 多人点赞 2021-05-06 19:40:33
    就这一张图,如果你能把图中内容都理解的差不多,那你就可以说是入门 Java 了,但是这里要注意一概念,这并不等于说你是一合格的初级 Java 程序员了,因为要想达到初级 Java 程序员的水平,你要会能干活,能...
  • 上周的原理篇简单介绍了JaCoCo其生成覆盖率的基本原理,这周的实践篇的主要内容就是将原理应用到实践中,本篇内容全部都是具体的项目使用实战经验,这里分享给大家,共勉~
  • JavaScript基础知识总结

    万次阅读 多人点赞 2019-04-11 10:37:31
    通俗的讲:可以显示页面的一软件, 国内网民计算机上常见的网页浏览器有,QQ浏览器、Internet Explorer、Firefox、Safari,Opera、Google Chrome、百度浏览器、搜狗浏览器、猎豹浏览器、360浏览器、UC浏览器、傲游...
  • 如何保证手机APP兼容性覆盖测试

    千次阅读 2020-01-18 10:42:08
    众所周知,APP兼容性覆盖测试一直以来被认为是一高成本、耗时低效、耗人力的测试工作,且兼容性测试是一项必须要进行的测试项目,因为有不同的机型、系统平台、分辨率、网络、厂商、数据兼容以及不同兼容问题场景...
  • 二级C语言考试知识点(很

    万次阅读 多人点赞 2018-11-30 01:38:14
    二级公共基础知识作为必考内容出现,出题形式为选择题前10道,占考试总分的10%。 考试其它比重: 1、C语言程序的结构 占总分1% 2、数据类型及其运算 占总分4% 3、选择结构程序设计 占比分的3% 4、循环结构 占比分的5...
  • 数据库面试考题一览(全面覆盖

    万次阅读 2020-04-01 22:56:13
    属性可以为作为一超键,多属性组合在一起也可以作为一超键。超键包含候选键和主键。 候选键:是最小超键,即没有冗余元素的超键。 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的...
  • PowerDesigner 使用教程(很具体,很实用)

    万次阅读 多人点赞 2018-07-07 16:04:55
    1、PowerDesigner 使用教程 从今日开始,每天一部分内容,在每工作日,争取让大家天天都有的看,每天内容不会太多。 有错误的地方还请大家指正。 PowerDesigner简
  • WellDo关注 0.2472018.09.18 12:07:44字数 1,878阅读 12,839 1. 基于 jacoco 的功能测试代码覆盖率实践 1.1 目前主流代码覆盖率统计工具...Jacoco 是一开源的覆盖率工具。Jacoco 可以嵌入到 Ant 、Maven 中,并...
  • 2.创建具体的项目 3.gtest自带十例子 二、使用gtest+vs2015,并且输出测试覆盖率 1.使用vs 2015企业版 2.使用OpenCppCoverage +vs 2015(企业版,社区版都可以) 三、使用cmake生成项目,构建+gtest进行单元...
  • 浅谈:怎么提高测试用例覆盖

    千次阅读 2020-05-13 15:28:29
    但是在实际的测试过程中,你会发现,这些面真的是太广了,也太大了,不知道该如何下手,今天咱们就来说一说,具体从哪些方面考虑可以使我们的测试用例设计的更完善些呢。 (尽量我们在测试开始之前能够让开发进行...
  • 怎么保证测试用例的覆盖

    千次阅读 2019-10-07 05:01:13
    但实际上我们不可能去做全覆盖。所以设计这类用例时,最好有一张草稿,将所有相关功能按业务流程逐一列示,然后再将每功能可能出现的特定数据一一标上,最后将图中最可能出现的、最可能出错的、最核心的数据取出来...
  • 星下点轨迹图三、BDS3和GPS主要城市覆盖性及GDOP值分析(具体操作后续添加)BDS3 全球DOP值分析结果如下:GPS全球DOP值分析结果如下:主要城市覆盖性和GDOP值对比表(城市经纬度坐标按照四舍入进行定位):总结 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,373
精华内容 45,749
关键字:

五个全覆盖具体内容