发布新日志

  • 公司

    2008-10-14 14:33:37

    公司好热啊!没有心情工作了,心里好烦啊!
  • 测试用例设计与管理思路经验总结

    2008-08-07 11:27:55


    已经很久没有写过case了,结合以前编写用例的一些经验,其实觉得编写用例也还是有流程可走的(当然不是按照教科书上说的那样进行用例设计,姑且不说有多少企业会有那么详细的需求书,会有多少时间让你去写完善,非常详细的测试用例,反正我是感觉项目中写用例的时间非常短),总结自己的一些经验,不单单是用例设计,还涉及到一些其他方面。

     

    简单7个步骤:

     

    1、理清模块需求:

       ----由于项目需求说明书不详细,而且没有进行需求评审的情况下,在拿到上级lead给的测试任务后,一拿到先别着急去写测试用例,首先你应该做的是,根据有限的模块需求说明进行深入理解模块的功能,流程,以及涉及到的其他功能,记录下来。发送给该模块的开发人员,询问他你理解的是否和他设计的有差错,虽然说开发人员可能对整个需求不情况,但是对自己要开发的模块肯定还是能说出个大概来。

     

    2测试需求提起

     

    -----在经过和相对应的开发人员简单交流后,就可以根据得到文档进行测试需求提起了,原则是从大到小,大模块一直分解到最小部分模块。整理一份模块测试需求书

     

    3、设计测试思路

     

    -----测试需求书完成后,就可以设计测试思路,这里的设计思路并不是说写测试用例,而是一个总的思路说明;

    举个例子:

    如大家都熟悉的软件升级功能,可以向下面一样简单列出测试思路

    正常情况:

    1、软件在网络链接好的情况下升级正常

    2、最新版本的软件不能进行升级,升级会有提示

    3、试用期的软件不能升级

    4、升级过程中能正常取消,而且不会影响到软件

     

     

    异常情况:

    1、在网络速度非常缓慢情况下的升级

    2、在网络时断时续情况下进行升级

    3、系统电脑系统资源消耗严重情况下升级

    4、升级过程中进行断电,断网,关机等操作

    5、下载过程中强制推出软件

    6、多个客户同时进行升级,查看升级服务器的性能

     

    上面只是简单列出一些思路,还有很多。在列出测试思路后,如果时间的话可以组织测试人员和开发人员进行头脑风暴,因为一个人的思路是有限的,开发人员可以从开发的角度考虑有那些地方需要重点考虑的,其他人员也会有自己的想法。

    在上面的例子中,我们还可以想到,网络是代理的情况,下载的文件大小情况,服务器支持的最大用户同时升级,软件下载是否支持断点续传等,,

     

    4、测试用例编写

     

    ----头脑风暴完成后,就可以整理出一份测试思路,最好在设计测试用例模板时考虑到这点,只有把思路记录下来,在后面的详细用例编写中才不会忘记,在后期的维护用例中也可以快速掌握用例情况。后面会有一份测试用例模板

     

    对于测试用例编写,本人用的是自己归纳的一个通用模式

    解释上面的图:

    由于本人测试的程序是C/S结构的,大部分都是在这三个操作系统下进行。如果产品是B/S结构的话,可能在winxp,win2000win2003后面还要增加一列,就是各种不同的浏览器,

    这样编写用例的好处就是层次分明,比如后面产品需要修改界面而不涉及到功能时,就可以快速找到进行用例修改。模块功能的用例大部分就是来自第三点的测试思路,只是进行扩充编写吧了。

    其他的详细编写用例技巧就不说了,网络上很多资料,肯定比我写的好。我的宗旨就是用例编写前先要做到层次分明,心中有数写那些方面。其他就是慢慢扩充。

     

    5、测试用例评审

     

    ---------这一步就不说了,如果有时间的话最好做详细的用例评审,没有时间的话也要进行测试内部人员相互查看各自的用例,提出各自的意见。

     

    6、执行用例

     

    --------这一步是最好检验测试用例编写的水平了,交叉进行用例执行。

     

    7、用例效率计算

     

    -------这一步对有很好测试管理工具的公司来说,可能没有用处。这里是根据公司进行设计的,由于公司不是很大,也没有用大型商业测试管理工具,所以一下用例效率都可能必须手动,公司用JIRA管理BUG,用例和需求都是通过EXECL进行管理。在需求与用例之间暂时没有想到好的方法,用例与BUG对应已经想出方法了,在下面的的用例模板中有。

    虽然说对应比较简单,但是比较实用,能够快速反应出用例设计的质量,以及用例是否遗漏了。

     

    这份文档写完了,既不能算是测试用例的管理,也不能算是用例设计技巧,管他呢?当作自己的总结。


    测试用例模板


     

  • 进程与线程的区别

    2008-08-07 11:12:12

    线程是指进程内的一个执行单元,也是进程内的可调度实体.
    与进程的区别:
    (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
    (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
    (3)线程是处理器调度的基本单位,但进程不是.
    4)二者均可并发执行.

    进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

    简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
    线程的划分尺度小于进程,使得多线程程序的并发性高。
    另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
    线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
    从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
    线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
    一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

     

  • TD

    2008-07-14 17:42:23

    Mercury TestDirector 8.0安装配置手册

    一、安装前需知





    1.      
    安装前环境配置

    TD
    WEB服务容器为IIS,必须得先安装IIS环境

    TD
    的后台数据库默认为Access以选择使用Sybase MS-SQL Server Oracle

    TD
    也支持邮件服务,可以选择安装邮件服务或则暂时不安装。如果需要安装则在安装前做好邮件服务器的相关配置。



    2.      
    安装事项

    在安装时,要对系统进行一些安装设置,以下对一些关键设置进行简单解释。

    1
    )数据库连接设置

    设置数据库连接时,Access为默认必选,可以选择另外一种合适的数据库做为TD的连接数据库,该数据库可以在创建TD项目时,选择作为项目的数据库。

    2
    )虚拟目录设置

    其中的虚拟目录名TDBIN下将保存TD的一些运行文件。





    3.      
    安装注意

    安装TD时,系统资源消耗比较大,容易造成安装失败或错误,所以在安装时,尽量不要进行其他的系统操作,等待安装完成。



    4.      
    安装后配置

    1
      汉化

    在安装目录TDBIN/Install/下存放的是一些为连接服务的客户端加载的系统文件。其中的tdclientui80.xco文件,该文件会自动加载到客户端的C:\Program Files\Common Files\Mercury Interactive\TD2000_80目录下,并生成为tdclientui80.ocx文件。

    注意其中两个文件的后缀名区别。文件后缀可通过更改方式变换为OCXXCO

    由于Mercury并为发行官方的汉化包,所以采用第三方的资源包进行汉化。汉化方式,把得到的汉化资源dclientui80.xco文件粘贴到服务器TDBIN/Install/目录下,覆盖掉原文件即可。

    在之前访问过服务器的客户端,在下次连接时由于不再加载更新后的数据,所以必须得删除客户端下的C:\Program Files\Common Files\Mercury Interactive\TD2000_80目录下覆盖tdclientui80.ocx文件,使再次访问时自动加载汉化后的新组件。

    也可以通过在客户端C:\Program Files\Common Files\Mercury Interactive\TD2000_80目录下覆盖tdclientui80.ocx文件达到汉化的目的。



    2
      设置MS-SQL的数据库连接

    对数据库的客户端网络实用工具进行配置。选择协议Named PipesTCP/IP,别名设置最好选择本机计算机名。

    对数据库的安全性设置--身份验证,设置为SQL ServerWINDOWS

    设置后,在后台PING连接数据库,如果成功,则可正常创建该类数据库的项目。



    3
      IE7.0兼容性

    安装TD后,并不能顺利支持IE7.0的客户端浏览器。此时可以用记事本等打开服务器TDBIN/目录下的
    SiteAdmin.htmstart_a.htm源文件,然后进行编辑。

    查找” var fMSIE3456”


    然后在该行的末尾处分号前添加一段语句”|| (ua.lastIndexOf('MSIE 7.0') != -1)”

    保存即可。



    4
    TD系统信息修改

    C:\Program Files\Common Files\Mercury Interactive\目录中的DomsInfo文件夹,该文件夹中保存TD系统的关键信息,其中有TD系统配置信息的数据库doms.mdb文件,该数据库文件已默认被加密,密码为tdtdtd。在Templates文件夹中的文件为初始化生成的项目模板文件,包括TestDir.mdb,该文件为生成项目的初始数据库表。这样的话我们,就可以在每次创建项目时初试化出我们想要的,预定好的数据库表和相关数据来。就可以避免每次创建项目时重复的手工定义字段了,我们可以定制自己的项目数据库模板。





    如当遗忘ADMIN的密码时,可以通过往doms.mdbADMIN表中的ADMIN_PSWD字段更换写入“456711”,登陆时输入密码test即可进入。

  • 我辞职了

    2008-07-02 13:58:22

    提出辞职两天了,提出辞职在公司是最轻松的!但在轻松之极又会有一点担忧!我要是不在我交接工作之间找到工作我就面临着失业了。心情也焦虑了!不知道8月份会是什么样子呢?公司还会找聘吗?
  • 测试用例

    2008-06-26 15:26:56

    测试用例

    因业务需要,“中科永联”正式更名为“中程在线”,欢迎大家浏览新网站“中程在线信息产业培训网

    中科永联高级技术培训中心(www.itisedu.com

    测试用例Test Case)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求

    测试用例(Test Case)目前没有经典的定义。比较通常的说法是:指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。

    不同别的软件,测试用例是不同的。不同于诸如系统、工具、控制、游戏软件,管理软件的用户需求更加不统一,变化更大、更快。笔者主要从事企业管理软件的测试。因此我们的做法是把测试数据和测试脚本从测试用例中划分出来。测试用例更趋于是针对软件产品的功能、业务规则和业务处理所设计的测试方案。对软件的每个特定功能或运行操作路径的测试构成了一个个测试用例。

    随着中国软件业的日益壮大和逐步走向成熟,软件测试也在不断发展。从最初的由软件编程人员兼职测试到软件公司组建独立专职测试部门。测试工作也从简单测试演变为包括:编制测试计划、编写测试用例、准备测试数据、编写测试脚本、实施测试、测试评估等多项内容的正规测试。测试方式则由单纯手工测试发展为手工、自动兼之,并有向第三方专业测试公司发展的趋势。

    要使最终用户对软件感到满意,最有力的举措就是对最终用户的期望加以明确阐述,以便对这些期望进行核实并确认其有效性。测试用例反映了要核实的需求。然而,核实这些需求可能通过不同的方式并由不同的测试员来实施。例如,执行软件以便验证它的功能和性能,这项操作可能由某个测试员采用自动测试技术来实现;计算机系统的关机步骤可通过手工测试和观察来完成;不过,市场占有率和销售数据(以及产品需求),只能通过评测产品和竞争销售数据来完成。

    既然可能无法(或不必负责)核实所有的需求,那么是否能为测试挑选最适合或最关键的需求则关系到项目的成败。选中要核实的需求将是对成本、风险和对该需求进行核实的必要性这三者权衡考虑的结果。

    确定测试用例之所以很重要,原因有以下几方面。

    测试用例构成了设计和制定测试过程的基础。
    测试的“深度”与测试用例的数量成比例。由于每个测试用例反映不同的场景、条件或经由产品的事件流,因而,随着测试用例数量的增加,您对产品质量和测试流程也就越有信心。
    判断测试是否完全的一个主要评测方法是基于需求的覆盖,而这又是以确定、实施和/或执行的测试用例的数量为依据的。类似下面这样的说明:“95 % 的关键测试用例已得以执行和验证”,远比“我们已完成 95 % 的测试”更有意义。
    测试工作量与测试用例的数量成比例。根据全面且细化的测试用例,可以更准确地估计测试周期各连续阶段的时间安排。
    测试设计和开发的类型以及所需的资源主要都受控于测试用例。
    测试用例通常根据它们所关联关系的测试类型或测试需求来分类,而且将随类型和需求进行相应地改变。最佳方案是为每个测试需求至少编制两个测试用例:

    ·一个测试用例用于证明该需求已经满足,通常称作正面测试用例;
    ·另一个测试用例反映某个无法接受、反常或意外的条件或数据,用于论证只有在所需条件下才能够满足该需求,这个测试用例称作负面测试用例。


    一、测试用例是软件测试的核心

    软件测试的重要性是毋庸置疑的。但如何以最少的人力、资源投入,在最短的时间内完成测试,发现软件系统的缺陷,保证软件的优良品质,则是软件公司探索和追求的目标。每个软件产品或软件开发项目都需要有一套优秀的测试方案和测试方法。

    影响软件测试的因素很多,例如软件本身的复杂程度、开发人员(包括分析、设计、编程和测试的人员)的素质、测试方法和技术的运用等等。因为有些因素是客观存在的,无法避免。有些因素则是波动的、不稳定的,例如开发队伍是流动的,有经验的走了,新人不断补充进来;一个具体的人工作也受情绪等影响,等等。如何保障软件测试质量的稳定?有了测试用例,无论是谁来测试,参照测试用例实施,都能保障测试的质量。可以把人为因素的影响减少到最小。即便最初的测试用例考虑不周全,随着测试的进行和软件版本更新,也将日趋完善。

    因此测试用例的设计和编制是软件测试活动中最重要的。测试用例是测试工作的指导,是软件测试的必须遵守的准则。更是软件测试质量稳定的根本保障。

    二、编制测试用例

    着重介绍一些编制测试用例的具体做法。

    1、测试用例文档

    编写测试用例文档应有文档模板,须符合内部的规范要求。测试用例文档将受制于测试用例管理软件的约束。
    软件产品或软件开发项目的测试用例一般以该产品的软件模块或子系统为单位,形成一个测试用例文档,但并不是绝对的。

    测试用例文档由简介和测试用例两部分组成。简介部分编制了测试目的、测试范围、定义术语、参考文档、概述等。测试用例部分逐一列示各测试用例。每个具体测试用例都将包括下列详细信息:用例编号、用例名称、测试等级、入口准则、验证步骤、期望结果(含判断标准)、出口准则、注释等。以上内容涵盖了测试用例的基本元素:测试索引,测试环境,测试输入,测试操作,预期结果,评价标准。

    2、测试用例的设置

    我们早期的测试用例是按功能设置用例。后来引进了路径分析法,按路径设置用例。目前演变为按功能、路径混合模式设置用例。

    功能测试是最简捷的,按用例规约遍历测试每一功能。

    对于复杂操作的程序模块,其各功能的实施是相互影响、紧密相关、环环相扣的,可以演变出数量繁多的变化。没有严密的逻辑分析,产生遗漏是在所难免。路径分析是一个很好的方法,其最大的优点是在于可以避免漏测试。

    但路径分析法也有局限性。在一个非常简单字典维护模块就存在十余条路径。一个复杂的模块会有几十到上百条路径是不足为奇的。笔者以为这是路径分析比较合适的使用规模。若一个子系统有十余个或更多的模块,这些模块相互有关联。再采用路径分析法,其路径数量成几何级增长,达5位数或更多,就无法使用了。那么子系统模块间的测试路径或测试用例还是要靠传统方法来解决。这是按功能、路径混合模式设置用例的由来。

    3、设计测试用例

    测试用例可以分为基本事件、备选事件和异常事件。设计基本事件的用例,应该参照用例规约(或设计规格说明书),根据关联的功能、操作按路径分析法设计测试用例。而对孤立的功能则直接按功能设计测试用例。基本事件的测试用例应包含所有需要实现的需求功能,覆盖率达100%。

    设计备选事件和异常事件的用例,则要复杂和困难得多。例如,字典的代码是唯一的,不允许重复。测试需要验证:字典新增程序中已存在有关字典代码的约束,若出现代码重复必须报错,并且报错文字正确。往往在设计编码阶段形成的文档对备选事件和异常事件分析描述不够详尽。而测试本身则要求验证全部非基本事件,并同时尽量发现其中的软件缺陷

    可以采用软件测试常用的基本方法:等价类划分法、边界值分析法、错误推测法、因果图法、逻辑覆盖法等设计测试用例。视软件的不同性质采用不同的方法。如何灵活运用各种基本方法来设计完整的测试用例,并最终实现暴露隐藏的缺陷,全凭测试设计人员的丰富经验和精心设计。

    三、测试用例在软件测试中的作用

    1、指导测试的实施

    测试用例主要适用于集成测试系统测试回归测试。在实施测试时测试用例作为测试的标准,测试人员一定要按照测试用例严格按用例项目和测试步骤逐一实施测试。并对测试情况记录在测试用例管理软件中,以便自动生成测试结果文档。

    根据测试用例的测试等级,集成测试应测试那些用例,系统测试和回归测试又该测试那些用例,在设计测试用例时都已作明确规定,实施测试时测试人员不能随意作变动。

    2、规划测试数据的准备

    在我们的实践中测试数据是与测试用例分离的。按照测试用例配套准备一组或若干组测试原始数据,以及标准测试结果。尤其象测试报表之类数据集的正确性,按照测试用例规划准备测试数据是十分必须的。
    除正常数据之外,还必须根据测试用例设计大量边缘数据和错误数据。

    3、编写测试脚本的"设计规格说明书"

    为提高测试效率,软件测试已大力发展自动测试。自动测试的中心任务是编写测试脚本。如果说软件工程中软件编程必须有设计规格说明书,那么测试脚本的设计规格说明书就是测试用例。

    4、评估测试结果的度量基准

    完成测试实施后需要对测试结果进行评估,并且编制测试报告。判断软件测试是否完成、衡量测试质量需要一些量化的结果。例:测试覆盖率是多少、测试合格率是多少、重要测试合格率是多少,等等。以前统计基准是软件模块或功能点,显得过于粗糙。采用测试用例作度量基准更加准确、有效。

    5、分析缺陷的标准

    通过收集缺陷,对比测试用例和缺陷数据库,分析确证是漏测还是缺陷复现。漏测反映了测试用例的不完善,应立即补充相应测试用例,最终达到逐步完善软件质量。而已有相应测试用例,则反映实施测试或变更处理存在问题。

    四、相关问题

    1、测试用例的评审

    测试用例是软件测试的准则,但它并不是一经编制完成就成为准则。测试用例在设计编制过程中要组织同级互查。完成编制后应组织专家评审,需获得通过才可以使用。评审委员会可由项目负责人、测试、编程、分析设计等有关人员组成,也可邀请客户代表参加。

    2、测试用例的修改更新

    测试用例在形成文档后也还需要不断完善。主要来自三方面的缘故:第一、在测试过程中发现设计测试用例时考虑不周,需要完善;第二、在软件交付使用后反馈的软件缺陷,而缺陷又是因测试用例存在漏洞造成;第三、软件自身的新增功能以及软件版本的更新,测试用例也必须配套修改更新。

    一般小的修改完善可在原测试用例文档上修改,但文档要有更改记录。软件的版本升级更新,测试用例一般也应随之编制升级更新版本。

    3、测试用例的管理软件

    运用测试用例还需配备测试用例管理软件。它的主要功能有三个:第一、能将测试用例文档的关键内容,如编号、名称等等自动导入管理数据库,形成与测试用例文档完全对应的记录;第二、可供测试实施时及时输入测试情况;第三、最终实现自动生成测试结果文档,包含各测试度量值,测试覆盖表和测试通过或不通过的测试用例清单列表。

    有了管理软件,测试人员无论是编写每日的测试工作日志、还是出软件测试报告,都会变得轻而易举。

    五、测试用例的设计

    (一)白盒技术

    白盒测试结构测试,所以被测对象基本上是源程序,以程序的内部逻辑为基础设计测试用例。
    1、逻辑覆盖
    程序内部的逻辑覆盖程度,当程序中有循环时,覆盖每条路径是不可能的,要设计使覆盖程度较高的或覆盖最有代表性的路径的测试用例。下面根据图7-1所示的程序,分别讨论几种常用的覆盖技术。
    (1)语句覆盖。
    为了个提高发现错误的可能性,在测试时应该执行到程序中的每一个语句。语句覆盖是指设计足够的测试用例,使被测试程序中每个语句至少执行一次。
    如图7-1是一个被测试程序流程图:


    (2)判定覆盖。
    判定覆盖指设计足够的测试用例,使得被测程序中每个判定表达式至少获得一次“真”值和“假”值,从而使程序的每一个分支至少都通过一次,因此判定覆盖也称分支覆盖。
    (3)条件覆盖。
    条件覆盖是指设计足够的测试用例,使得判定表达式中每个条件的各种可能的值至少出现一次。
    (4)判定/条件测试。
    该覆盖标准指设计足够的测试用例,使得判定表达式的每个条件的所有可能取值至少出现一次,并使每个判定表达式所有可能的结果也至少出现一次。
    (5)条件组合覆盖。
    条件组合覆盖是比较强的覆盖标准,它是指设计足够的测试用例,使得每个判定表达式中条件的各种可能的值的组合都至少出现一次。
    (6)路径覆盖。
    路径覆盖是指设计足够的测试用例,覆盖被测程序中所有可能的路径。
    在实际的逻辑覆盖测试中,一般以条件组合覆盖为主设计测试用例,然后再补充部分用例,以达到路径覆盖测试标准。
    2.循环覆盖
    3.基本路径测试


    (二)黑盒技术

    1.等价类划分
    (1)划分等价类。
    ①如果某个输入条件规定了取值范围或值的个数。则可确定一个合理的等价类(输入值或数在此范围内)和两个不合理等价类(输入值或个数小于这个范围的最小值或大于这个范围的最大值)。
    ②如果规定了输入数据的一组值,而且程序对不同的输入值做不同的处理,则每个允许输入值是一个合理等价类,此处还有一个不合理等价类(任何一个不允许的输入值)。
    ③如果规定了输入数据必须遵循的规则,可确定一个合理等价类(符合规则)和若干个不合理等价类(从各种不同角度违反规则)。
    ④如果已划分的等价类中各元素在程序中的处理方式不同,则应将此等价类进一步划分为更小的等价类。
    (2)确定测试用例。
    ①为每一个等价类编号。
    ②设计一个测试用例,使其尽可能多地覆盖尚未被覆盖过的合理等价类。重复这步,直到所有合理等价类被测试用例覆盖。
    ③设计一个测试用例,使其只覆盖一个不合理等价类。
    2.边界值分析
    使用边界值分析方法设计测试用例时一般与等价类划分结合起来。但它不是从一个等价类中任选一个例子作为代表,而是将测试边界情况作为重点目标,选取正好等于、刚刚大于或刚刚小于边界值的测试数据。
    (1)如果输入条件规定了值的范围,可以选择正好等于边界值的数据作为合理的测试用例,同时还要选择刚好越过边界值的数据作为不合理的测试用例。如输入值的范围是[1,100],可取0,1,100,101等值作为测试数据。
    (2)如果输入条件指出了输入数据的个数,则按最大个数、最小个数、比最小个数少1、比最大个数多1等情况分别设计测试用例。如,一个输入文件可包括1--255个记录,则分别设计有1个记录、255个记录,以及0个记录的输入文件的测试用例。
    (3)对每个输出条件分别按照以上原则(1)或(2)确定输出值的边界情况。如,一个学生成绩管理系统规定,只能查询95--98级大学生的各科成绩,可以设计测试用例,使得查询范围内的某一届或四届学生的学生成绩,还需设计查询94级、99级学生成绩的测试用例(不合理输出等价类)。
    由于输出值的边界不与输入值的边界相对应,所以要检查输出值的边界不一定可能,要产生超出输出值之外的结果也不一定能做到,但必要时还需试一试。
    (4)如果程序的规格说明给出的输入或输出域是个有序集合(如顺序文件、线形表、链表等),则应选取集合的第一个元素和最后一个元素作为测试用例。
    3.错误推测
    在测试程序时,人们可能根据经验或直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的测试用例,这就是错误推测法。
    4.因果图
    等价类划分和边界值方法分析方法都只是孤立地考虑各个输入数据的测试功能,而没有考虑多个输入数据的组合引起的错误。
    5.综合策略
    每种方法都能设计出一组有用例子,用这组例子容易发现某种类型的错误,但可能不易发现另一类型的错误。因此在实际测试中,联合使用各种测试方法,形成综合策略,通常先用黑盒法设计基本的测试用例,再用白盒法补充一些必要的测试用例。

    六、测试用例设计的误区
    (来源:关河测试网)

    ·能发现到目前为止没有发现的缺陷的用例是好的用例;

    首先要申明,其实这句话是十分有道理的,但我发现很多人都曲解了这句话的原意,一心要设计出发现“难于发现的缺陷”而陷入盲目的片面中去,忘记了测试的目的所在,这是十分可怕的。我倾向于将测试用例当作一个集合来认识,对它的评价也只能对测试用例的集合来进行,测试本身是一种“V&V”的活动,测试 需要保证以下两点:

    程序做了它应该做的事情
    程序没有做它不该做的事情
    因此,作为测试实施依据的测试用例,必须要能完整覆盖测试需求,而不应该针对单个的测试用例去评判好坏。

    ·测试用例应该详细记录所有的操作信息,使一个没有接触过系统的人员也能进行测试;

    不知道国内有没有公司真正做到这点,或者说,不知道有国内没有公司能够将每个测试用例都写得如此详细。在我的测试经历中,对测试用例描述的详细和复杂程度 也曾有过很多的彷徨。写得太简单吧,除了自己没人能够执行,写得太详细吧,消耗在测试用例维护(别忘了,测试用例是动态的,一旦测试环境、需求、设计、实 现发生了变化,测试用例都需要相应发生变化)上的时间实在是太惊人,在目前国内大部分软件公司的测试资源都不足的情况下,恐怕很难实现。但我偏偏就能遇到 一些这样的老总或者是项目负责人,甚至是测试工程师本身,全然不顾实际的资源情况,一定要写出“没有接触过系统的人员也能进行测试”的用例。

    在讨论这个问题之前,我们可以先考虑一下测试的目的。测试的目的是尽可能发现程序中存在的缺陷,测试活动本身也可以被看作是一个Project,也需要在 给定的资源条件下尽可能达成目标,根据我个人的经验,大部分的国内软件公司在测试方面配备的资源都是不足够的,因此我们必须在测试计划阶段明确测试的目 标,一切围绕测试的目标进行。

    除了资源上的约束外,测试用例的详细程度也需要根据需要确定。如果测试用例的执行者、测试用例设计者、测试活动相关人对系统了解都很深刻,那测试用例就没有必要太详细了,文档的作用本来就在于沟通,只要能达到沟通的目的就OK。在我担任测试经理的项目中,在测试计划阶段,一般给予测试设计30% - 40%左右的时间,测试设计工程师能够根据项目的需要自行确定用例的详细程度,在测试用例的评审阶段由参与评审的相关人对其把关。

    ·测试用例设计是一劳永逸的事情;

    这句话摆在这里,我想没有一个人会认可,但在实际情况中,却经常能发现这种想法的影子。我曾经参与过一个项目,软件需求和设计已经变更了多次,但测试用例 却没有任何修改。导致的直接结果是新加入的测试工程师在执行测试用例时不知所措,间接的后果是测试用例成了废纸一堆,开发人员在多次被无效的缺陷报告打扰 后,对测试人员不屑一顾。

    这个例子可能有些极端,但测试用例与需求和设计不同步的情况在实际开发过程中确是屡见不鲜的,测试用例文档是“活的”文档,这一点应该被测试工程师牢记。

    ·测试用例不应该包含实际的数据;

    测试用例是“一组输入、执行条件、预期结果”、毫无疑问地应该包括清晰的输入数据和预期输出,没有测试数据的用例最多只具有指导性的意义,不具有可执行 性。当然,测试用例中包含输入数据会带来维护、与测试环境同步之类的问题,关于这一点,《Effective Software Test》一书中提供了详细的测试用例、测试数据的维护方法,可以参考。

    ·测试用例中不需要明显的验证手段;

    我见过很多测试工程师编写的测试用例中,“预期输出”仅描述为程序的可见行为,其实,“预期结果”的含义并不只是程序的可见行为。例如,对一个订货系统, 输入订货数据,点击“确定”按钮后,系统提示“订货成功”,这样是不是一个完整的用例呢?是不是系统输出的“订货成功”就应该作为我们唯一的验证手段呢? 显然不是。订货是否成功还需要查看相应的数据记录是否更新,因此,在这样的一个用例中,还应该包含对测试结果的显式的验证手段:在数据库中执行查询语句进行查询,看查询结果是否与预期的一致。

    七、从用例中生成测试用例


    用于功能性测试的测试用例来源于测试目标的用例。应该为每个用例场景编制测试用例。用例场景要通过描述流经用例的路径来确定,这个流经过程要从用例开始到结束遍历其中所有基本流和备选流。

    例如,下图中经过用例的每条不同路径都反映了基本流和备选流,都用箭头来表示。基本流用直黑线来表示,是经过用例的最简单的路径。每个备选流自基本流开始,之后,备选流会在某个特定条件下执行。备选流可能会重新加入基本流中(备选流 1 和 3),还可能起源于另一个备选流(备选流 2),或者终止用例而不再重新加入某个流(备选流 2 和 4)。


    用例的事件流示例

    遵循上图中每个经过用例的可能路径,可以确定不同的用例场景。从基本流开始,再将基本流和备选流结合起来,可以确定以下用例场景:

    场景 1 基本流
    场景 2 基本流 备选流 1
    场景 3 基本流 备选流 1 备选流 2
    场景 4 基本流 备选流 3
    场景 5 基本流 备选流 3 备选流 1
    场景 6 基本流 备选流 3 备选流 1 备选流 2
    场景 7 基本流 备选流 4
    场景 8 基本流 备选流 3 备选流 4

    注:为方便起见,场景 5、6 和 8 只描述了备选流 3 指示的循环执行一次的情况。

    生成每个场景的测试用例是通过确定某个特定条件来完成的,这个特定条件将导致特定用例场景的执行。

    例如,假定上图描述的用例对备选流 3 规定如下:

    “如果在上述步骤 2‘输入提款金额’中输入的美元量超出当前帐户余额,则出现此事件流。系统将显示一则警告消息,之后重新加入基本流,再次执行上述步骤 2‘输入提款金额’,此时银行客户可以输入新的提款金额。”

    据此,可以开始确定需要用来执行备选流 3 的测试用例:

    测试用例 ID 场景 条件 预期结果
    TC x 场景 4 步骤 2 - 提款金额 > 帐户余额 在步骤 2 处重新加入基本流
    TC y 场景 4 步骤 2 - 提款金额 < 帐户余额 不执行备选流 3,执行基本流
    TC z 场景 4 步骤 2 - 提款金额 = 帐户余额 不执行备选流 3,执行基本流

    注:由于没有提供其他信息,以上显示的测试用例都非常简单。测试用例很少如此简单。

    下面是一个由用例生成测试用例的更符合实际情况的示例。


    示例:

    一台 ATM 机器的主角和用例。

    下表包含了上图中提款用例的基本流和某些备用流:

    本用例的开端是 ATM 处于准备就绪状态。
    1. 准备提款 - 客户将银行卡插入 ATM 机的读卡机。
       
    2. 验证银行卡 - ATM 机从银行卡的磁条中读取帐户代码,并检查它是否属于可以接收的银行卡。
       
    3. 输入 PIN - ATM 要求客户输入 PIN 码(4 位)
       
    4. 验证帐户代码和 PIN - 验证帐户代码和 PIN 以确定该帐户是否有效以及所输入的 PIN 对该帐户来说是否正确。对于此事件流,帐户是有效的而且 PIN 对此帐户来说正确无误。
       
    5. ATM 选项 - ATM 显示在本机上可用的各种选项。在此事件流中,银行客户通常选择“提款”。
       
    6. 输入金额 - 要从 ATM 中提取的金额。对于此事件流,客户需选择预设的金额(10 美元、20 美元、50 美元或 100 美元)。
       
    7. 授权 - ATM 通过将卡 ID、PIN、金额以及帐户信息作为一笔交易发送给银行系统来启动验证过程。对于此事件流,银行系统处于联机状态,而且对授权请求给予答复,批准完成提款过程,并且据此更新帐户余额。
       
    8. 出钞 - 提供现金。
       
    9. 返回银行卡 - 银行卡被返还。
       
    10. 收据 - 打印收据并提供给客户。ATM 还相应地更新内部记录。

    用例结束时 ATM 又回到准备就绪状态。
     

    备选流 1 - 银行卡无效 在基本流步骤 2 中 - 验证银行卡,如果卡是无效的,则卡被退回,同时会通知相关消息。
    备选流 2 - ATM 内没有现金 在基本流步骤 5 中 - ATM 选项,如果 ATM 内没有现金,则“提款”选项将无法使用。
    备选流 3 - ATM 内现金不足 在基本流步骤 6 中- 输入金额,如果 ATM 机内金额少于请求提取的金额,则将显示一则适当的消息,并且在步骤 6 - 输入金额处重新加入基本流。
    备选流 4 - PIN 有误 在基本流步骤 4 中- 验证帐户和 PIN,客户有三次机会输入 PIN。

    如果 PIN 输入有误,ATM 将显示适当的消息;如果还存在输入机会,则此事件流在步骤 3 - 输入 PIN 处重新加入基本流。

    如果最后一次尝试输入的 PIN 码仍然错误,则该卡将被 ATM 机保留,同时 ATM 返回到准备就绪状态,本用例终止。
    备选流 5 - 帐户不存在 在基本流步骤 4 中 - 验证帐户和 PIN,如果银行系统返回的代码表明找不到该帐户或禁止从该帐户中提款,则 ATM 显示适当的消息并且在步骤 9 - 返回银行卡处重新加入基本流。
    备选流 6 - 帐面金额不足 在基本流步骤 7 - 授权中,银行系统返回代码表明帐户余额少于在基本流步骤 6 - 输入金额内输入的金额,则 ATM 显示适当的消息并且在步骤 6 - 输入金额处重新加入基本流。
    备选流 7 - 达到每日最大的提款金额 在基本流步骤 7 - 授权中,银行系统返回的代码表明包括本提款请求在内,客户已经或将超过在 24 小时内允许提取的最多金额,则 ATM 显示适当的消息并在步骤 6 - 输入金额上重新加入基本流。
    备选流 x - 记录错误 如果在基本流步骤 10 - 收据中,记录无法更新,则 ATM 进入“安全模式”,在此模式下所有功能都将暂停使用。同时向银行系统发送一条适当的警报信息表明 ATM 已经暂停工作。
    备选流 y - 退出 客户可随时决定终止交易(退出)。交易终止,银行卡随之退出。
    备选流 z - “翘起” ATM 包含大量的传感器,用以监控各种功能,如电源检测器、不同的门和出入口处的测压器以及动作检测器等。在任一时刻,如果某个传感器被激活,则警报信号将发送给警方而且 ATM 进入“安全模式”,在此模式下所有功能都暂停使用,直到采取适当的重启/重新初始化的措施


    在第一次迭代中,根据迭代计划,我们需要核实提款用例已经正确地实施。此时尚未实施整个用例,只实施了下面的事件流:

    • 基本流 - 提取预设金额(10 美元、20 美元、50 美元、100 美元)
    • 备选流 2 - ATM 内没有现金
    • 备选流 3 - ATM 内现金不足
    • 备选流 4 - PIN 有误
    • 备选流 5 - 帐户不存在/帐户类型有误
    • 备选流 6 - 帐面金额不足

    可以从这个用例生成下列场景

    场景 1 - 成功的提款 基本流
    场景 2 - ATM 内没有现金 基本流 备选流 2
    场景 3 - ATM 内现金不足 基本流 备选流 3
    场景 4 - PIN 有误(还有输入机会) 基本流 备选流 4
    场景 5 - PIN 有误(不再有输入机会) 基本流 备选流 4
    场景 6 - 帐户不存在/帐户类型有误 基本流 备选流 5
    场景 7 - 帐户余额不足 基本流 备选流 6

    注:为方便起见,备选流 3 和 6(场景 3 和 7)内的循环以及循环组合未纳入上表。

    对于这 7 个场景中的每一个场景都需要确定测试用例。可以采用矩阵或决策表来确定和管理测试用例。下面显示了一种通用格式,其中各行代表各个测试用例,而各列则代表测试用例的信息。本示例中,对于每个测试用例,存在一个测试用例 ID、条件(或说明)、测试用例中涉及的所有数据元素(作为输入或已经存在于数据库中)以及预期结果。

    通过从确定执行用例场景所需的数据元素入手构建矩阵。然后,对于每个场景,至少要确定包含执行场景所需的适当条件的测试用例。例如,在下面的矩阵中,V(有效)用于表明这个条件必须是 VALID(有效的)才可执行基本流,而 I(无效)用于表明这种条件下将激活所需备选流。下表中使用的“n/a”(不适用)表明这个条件不适用于测试用例。

    TC(测试用例)ID 号 场景/条件 PIN

     

    帐号

     

    输入的金额

    (或选择的金额)

     

    帐面金额

     

    ATM 内的金额

     

    预期结果
    CW1. 场景 1 - 成功的提款 V V V V V 成功的提款。
    CW2. 场景 2 - ATM 内没有现金 V V V V I 提款选项不可用,用例结束
    CW3. 场景 3 - ATM 内现金不足 V V V V I 警告消息,返回基本流步骤 6 - 输入金额
    CW4. 场景 4 - PIN 有误(还有不止一次输入机会)

     

    V n/a V V 警告消息,返回基本流步骤 4,输入 PIN
    CW5. 场景 4 - PIN 有误(还有一次输入机会)

     

    V n/a V V 警告消息,返回基本流步骤 4,输入 PIN
    CW6. 场景 4 - PIN 有误(不再有输入机会)

     

    V n/a V V 警告消息,卡予保留,用例结束

    在上面的矩阵中,六个测试用例执行了四个场景。对于基本流,上述测试用例 CW1 称为正面测试用例。它一直沿着用例的基本流路径执行,未发生任何偏差。基本流的全面测试必须包括负面测试用例,以确保只有在符合条件的情况下才执行基本流。这些负面测试用例由 CW2 至 6 表示(阴影单元格表明这种条件下需要执行备选流)。虽然 CW2 至 6 对于基本流而言都是负面测试用例,但它们相对于备选流 2 至 4 而言是正面测试用例。而且对于这些备选流中的每一个而言,至少存在一个负面测试用例(CW1 - 基本流)。   

    每个场景只具有一个正面测试用例和负面测试用例是不充分的,场景 4 正是这样的一个示例。要全面地测试场景 4 - PIN 有误,至少需要三个正面测试用例(以激活场景 4):

    • 输入了错误的 PIN,但仍存在输入机会,此备选流重新加入基本流中的步骤 3 - 输入 PIN。
    • 输入了错误的 PIN,而且不再有输入机会,则此备选流将保留银行卡并终止用例。
    • 最后一次输入时输入了“正确”的 PIN。备选流在步骤 5 - 输入金额处重新加入基本流。

    注:在上面的矩阵中,无需为条件(数据)输入任何实际的值。以这种方式创建测试用例矩阵的一个优点在于容易看到测试的是什么条件。由于只需要查看 V 和 I(或此处采用的阴影单元格),这种方式还易于判断是否已经确定了充足的测试用例。从上表中可发现存在几个条件不具备阴影单元格,这表明测试用例还不完全,如场景 6 - 不存在的帐户/帐户类型有误和场景 7 - 帐户余额不足就缺少测试用例。

    一旦确定了所有的测试用例,则应对这些用例进行复审和验证以确保其准确且适度,并取消多余或等效的测试用例。

    测试用例一经认可,就可以确定实际数据值(在测试用例实施矩阵中)并且设定测试数据

    TC(测试用例)ID 号 场景/条件 PIN

     

    帐号

     

    输入的金额

    (或选择的金额)

     

    帐面金额

     

    ATM 内的金额

     

    预期结果
    CW1. 场景 1 - 成功的提款 4987 809 - 498 50.00 500.00 2,000 成功的提款。帐户余额被更新为 450.00
    CW2. 场景 2 - ATM 内没有现金 4987 809 - 498 100.00 500.00 0.00 提款选项不可用,用例结束
    CW3. 场景 3 - ATM 内现金不足 4987 809 - 498 100.00 500.00 70.00 警告消息,返回基本流步骤 6 - 输入金额
    CW4. 场景 4 - PIN 有误(还有不止一次输入机会) 4978 

     

    809 - 498 n/a 500.00 2,000 警告消息,返回基本流步骤 4,输入 PIN
    CW5. 场景 4 - PIN 有误(还有一次输入机会) 4978

     

    809 - 498 n/a 500.00 2,000 警告消息,返回基本流步骤 4,输入 PIN
    CW6. 场景 4 - PIN 有误(不再有输入机会) 4978 

     

    809 - 498 n/a 500.00 2,000 警告消息,卡予保留,用例结束

    以上测试用例只是在本次迭代中需要用来验证提款用例的一部分测试用例。需要的其他测试用例包括:

    • 场景 6 - 帐户不存在/帐户类型有误:未找到帐户或帐户不可用
    • 场景 6 - 帐户不存在/帐户类型有误:禁止从该帐户中提款
    • 场景 7 - 帐户余额不足:请求的金额超出帐面金额

    在将来的迭代中,当实施其他事件流时,在下列情况下将需要测试用例:

    • 无效卡(所持卡为挂失卡、被盗卡、非承兑银行发卡、磁条损坏等)
    • 无法读卡(读卡机堵塞、脱机或出现故障)
    • 帐户已消户、冻结或由于其他方面原因而无法使用
    • ATM 内的现金不足或不能提供所请求的金额(与 CW3 不同,在 CW3 中只是一种币值不足,而不是所有币值都不足)
    • 无法联系银行系统以获得认可
    • 银行网络离线或交易过程中断电

    在确定功能性测试用例时,确保满足下列条件:

    • 已经为每个用例场景确定了充足的正面和负面测试用例。 
    • 测试用例可以处理用例所实施的所有业务规则,确保对于业务规则,无论是在内部、外部还是在边界条件/值上都存在测试用例。
    • 测试用例可以处理所有事件或动作排序(如在设计模型序列图中确定的内容),还应能处理用户界面对象状态或条件。
    • 测试用例可以处理为用例所指定的任何特殊需求,如最佳/最差性能,有时这些特殊需求会与用例执行过程中的最小/最大负载或数据容量组合在一起。

    八、从补充规约中生成测试用例

    并不是所有的测试目标需求都将在用例中有所反映。非功能性需求(如性能、安全性和访问控制)以及配置要求等将会说明测试目标的其他行为或特征。补充规约是为其他行为生成测试用例的主要来源。

    关于如何生成这些其他测试用例的指南说明如下:

    • 性能测试生成测试用例
    • 为安全性/访问控制测试生成测试用例
    • 为配置测试生成测试用例
    • 为安装测试生成测试用例
    • 为其他非功能性测试生成测试用例

    为性能测试生成测试用例

    性能测试用例的主要输入是补充规约,补充规约中包含了非功能性需求(请参见工件:补充规约)。为性能测试生成测试用例时,请使用下列指南:

    • 对于补充规约内阐明性能标准的各条说明都应确保至少要确定一个测试用例。性能标准通常表示为时间/事务、事务量/用户或百分数的形式。
    • 对每个关键用例,都应确保至少要确定一个测试用例。关键用例是在上述说明中和/或在工作量分析文档中确定的、必须采用性能评测方法来评估的用例(请参见工件:工作量分析文档)。

    与功能性测试的测试用例类似,通常对于每个用例/需求都会存在不止一个测试用例。常见的情况是:存在一个低于性能阈值的测试用例、一个处于阈值上的测试用例,还有一个测试用例高于阈值。

    除了以上性能标准以外,确保已确定影响响应时间的特定条件,包括:

    • 数据库的大小 - 存在多少个记录?
    • 工作量 - 同时执行操作的最终用户的数量和类型,以及要同时执行的事务的数量和类型
    • 环境特征(硬件、网件以及软件配置)

    将用于性能测试的测试用例记录在类似于功能测试所使用的矩阵中。

    以下是各种性能测试的一些示例:

    对于负载测试:

    TC(测试用例)ID 号 工作量 条件

     

    预期结果
    PCW1.

    1

    (单个 ATM)

    完成提款交易

    全部交易(不依赖于主角的时间)在 20 秒之内完成
    PCW2.

    2

    (1,000 个同时运行的 ATM)

    完成提款交易

    全部交易(不依赖于主角的时间)在 30 秒之内完成
    PCW3.

    3

    (10.000 个同时运行的 ATM)

    完成提款交易

    全部交易(不依赖于主角的时间)在 50 秒之内完成

    对于强度测试:

    TC(测试用例)ID 号 工作量 条件

     

    预期结果
    SCW1.

    2

    (1,000 个同时运行的 ATM)

    数据库锁定 - 2 个 ATM 请求同一帐户

    ATM 请求排成队列
    SCW2.

    2

    (1,000 个同时运行的 ATM)

    无法实现银行系统的通信

    交易排成队列或超时
    SCW3.

    2

    (1,000 个同时运行的 ATM)

    在交易过程中,银行系统通信被终止

    显示警告消息

    为安全性/访问控制测试生成测试用例

    主角和用例一同说明系统外部用户与系统所执行的动作之间的交互,以便为特定主角生成测试结果。复杂系统包含许多主角,所以我们编制测试用例时必须确保只有指定执行用例的主角可以进行此操作,这一点非常关键。在基于主角类型的用例事件流存在差别时,尤其如此。

    例如,在 ATM 用例中,如果主角“银行客户”的卡和帐户有的属于拥有这个 ATM 机的银行,有的是竞争银行的银行卡(和帐户),或是企图使用该 ATM 不支持的银行卡,则将对该主角“银行客户”执行不同的用例事件流。

    对于功能性测试用例,请同样遵循上面列举的指南。

    关于安全性和访问控制测试用例的示例:

    TC(测试用例)ID 号 条件

    (V 表明卡有效)

    读卡机

    (V 表明读卡机工作正常)

    银行的网络 预期结果
    ACW1. 在银行网络之内 V V V 所有用例都可用
    ACW2. 银行网络之外 V V I 只有提款用例可用
    ACW3. 无法读卡 I V V 警告消息,卡被退出
    ACW4. 因被盗,卡已挂失 I V V 警告消息,卡予保留
    ACW5. 卡已过期 I V V 警告消息,卡予保留

    为配置测试生成测试用例

    在典型的分布式系统中,允许存在许多种受支持的硬件和软件组合。为了核实测试目标在不同的配置情况下(如不同的操作系统、浏览器或 CPU 的速度)能否正常工作或执行,应该对此进行测试。此外,测试还应涵盖构件的组合,以便检测在不同构件的交互中产生的缺陷。例如,确保由应用程序安装的 DDL 版本不会与另一个应用程序需要的相同 DDL 的版本发生冲突。

    采用下列指南来生成用于配置测试的测试用例:

    • 确保对每个关键配置,应至少存在一个测试用例可用于对其进行确定。这是通过确定测试目标的环境所要求的硬件和软件配置以及确定这些配置的优先级来完成的。应确保最先测试最常见的配置,包括:
      • 打印机支持
      • 网络连接 - 局域网和广域网
      • 服务器配置 - 服务器驱动程序、服务器硬件
      • 台式机和/或服务器上安装的其他软件
      • 所有已安装软件的软件版本
    • 确保对于每个可能有问题的配置至少存在一个测试用例。这些配置可能包括:
      • 具有最低性能的硬件。
      • 历史上存在兼容性问题的共驻内存的软件。
      • 通过最慢的 LAN/WAN 连接访问服务器的客户机。
      • 资源不足(缓慢的 CPU 速度、最小的内存或分辨率,磁盘空间不足等等)

    为安装测试生成测试用例

    安装测试需要核实测试目标可以在所有可能的安装情况下安装。安装情况可以指首次安装测试目标,或是在装有较早版本的机器上安装测试目标的某个较新的版本或工作版本。安装测试还应确保在遇到异常情况时(如磁盘空间不足),测试目标的执行情况仍可接受。

    测试用例应包含以下各种软件的安装情况:

    • 分发介质,例如磁盘、CD-ROM 或文件服务器。
    • 首次安装。
    • 完全安装。
    • 自定义安装。
    • 升级安装。

    客户机服务器软件的安装程序具备一组特定的测试用例。不同于基于主机的系统,服务器和客户机上的安装程序是有所不同的。因而,安装测试应执行构成测试目标的所有构件的安装,包括客户机、中间层以及服务器,这一点至关重要。

    为其他非功能性测试生成测试用例

    理论上,应找到所有必需的输入来生成测试用例模型、设计模型以及补充规约工件的测试用例。不过,如果此时您需要补充已有的输入,那也不足为奇。

    示例如下:

    • 操作测试(用以检验在某次故障发生后以及在下一次故障发生前“较长时间”内软件的运行情况)的测试用例。
    • 对性能瓶颈、系统容量或测试目标的强度承受能力进行调查的测试用例。

    大多数情况下,您可以通过先前所确定的测试用例生成的某些测试用例来构建其变体或聚合关系体,借此来查找测试用例。


     

    九、为单元测试生成测试用例

    单元测试要求既测试单元的内部结构同时还要测试其行为特征。测试内部结构要求了解实施单元的方式,基于这种了解的测试被称为白盒测试。对单元行为特征的测试侧重于从外部可观察的单元行为,而不需要了解或考虑其实施方式。基于这种方法的测试称为黑盒测试。基于这两种方法所生成的测试用例的说明如下。

    白盒测试

    理论上,应通过代码测试每一条可能的路径。在所有这些非常简单的单元内实现这样的目标是不切实际或几乎是不可能的。作为最基本的测试,应将每个决定到决定路径(DD 路径)测试至少一次,这样可确保将所有语句至少执行一次。决定通常是指 if 语句,而 DD 路径是两个决定之间的路径。

    要达到这种程度的测试覆盖,建议您在选择测试数据时应使每个决定都可以用每种可能的方法来评估。为达到上述目标,测试用例应确保:

    每个布尔表达式的求值结果为 true 和 false。例如,表达式 (a<3) OR (b>4) 的求值结果为 true/false 的四种组合
    每一个无限循环至少要执行零次、一次和一次以上。
    可使用代码覆盖工具来确定白盒测试未测试到的代码。在进行白盒测试的同时应进行可靠性测试。

    示例:

    假设您对类 Set of Integers 中的 member 函数执行结构测试。该测试在二进制搜索的帮助下,将检查该集合是否包含了某个指定的整数。

    成员 (member) 函数以及相应的流程图。虚线箭头指示出如何通过采用两个测试用例将所有语句至少执行一次。

    理论上,对于彻底测试的某个操作,测试用例应遍历代码内路径的所有组合情况。在 member 函数的 while-loop 中存在三个可选择的路径。测试用例可以多次遍历该循环,或是根本就不遍历。如果测试用例根本就没有遍历循环,则在代码中只能找到一条路径。如果遍历循环一次,您将发现有三条路径。如果遍历两次,则您将发现存在六条路径,如此类推。因而,路径的总数应该是:1+3+6+12+24+48+...,在实际情况中,这个路径组合总数根本无法无法处理。这就是为什么必须选择所有这些路径的子集的原因。本示例中,可以采用两个测试用例来执行所有的语句。其中一个测试用例中,您可以选择 Set of Integers = {1,5,7,8,11},而且测试数据 t = 3。在另一个测试用例中,您可以选择 Set of Integers = {1,5,7,8,11},且 t = 8。

    黑盒测试

    黑盒测试的目的是为了在不了解单元将如何实施指定行为的情况下,对指定行为进行验证。黑盒测试侧重并依赖于单元的输入和输出。

    等价类划分是一种用来减少所需测试数量的技术。对于每一个操作都应确定参数和对象状态的等价类。等价类是一组值的集合,对这组值来说,对象的行为应类似。例如,一个集合可有三个等价类:空、若干元素以及满。

    可使用代码覆盖工具来确定白盒测试未测试到的代码。在进行黑盒测试的同时应进行可靠性测试。

    接下来的两个小节说明了如何通过选择特定参数的测试数据来确定测试用例。

    基于输入参数的测试用例
    输入参数是由某个操作使用的参数。对于以下每个输入条件,都应通过使用每个操作的输入参数来编制测试用例: 

    每个等价类的正常值。
    每个等价类的边界值。
    等价类之外的值。
    非法值。
    请记住要将对象状态视作输入参数。例如:如果在对集合这个对象测试添加操作,您必须使用集合内所有等价类的值来测试添加操作。所有等价类的值指的是:充满元素的集合、有若干元素的集合、以及空集合。

    基于输出参数的测试用例
    输出参数是某个操作所改变的参数。某个参数既可以是输入参数也可以是输出参数。根据以下每个条件选择输入,以便获得输出。

    每个等价类的正常值。
    每个等价类的边界值。
    等价类之外的值。
    非法值。
    请记住将对象状态视为输出参数。例如,假设您对某个列表测试删除操作,您必须选择输入值以便执行操作之后,列表为充满状态、具有若干元素或为空(采用它的所有等价类的值进行测试)。

    如果对象受状态控制(根据对象的状态产生不同的反应),您应利用状态矩阵,如下图所示:

    用于测试的状态矩阵。您可以在此矩阵的基础上测试激励和状态的所有组合。

    十、为产品验收测试生成测试用例


    产品验收测试是部署软件前的最后测试操作。验收测试的目标在于核实软件是否已经准备就绪,而且可以由最终用户按软件设计来执行功能和任务。产品验收测试通常不仅涉及执行软件以确认其是否准备就绪,还涉及交付给客户的所有产品工件,如培训、文档和包装。

    为软件工件生成测试用例是按上文中说明的方式实现的。测试用例可与上面确定的测试用例(正式)或某个子集(非正式)相同或类似,这取决于产品验收测试的正式程度。不管测试用例的深度如何,应该在实施和执行产品测试之前对测试用例和产品验收计划达成共识。

    对非软件工件的评估将随着被评估工件的不同而相去甚远。请参见每个特定非软件工件的指南以及核对清单,查看这些工件的评估内容和评估方式。

    十一、为回归测试编制测试用例

    回归测试比较同一测试目标的两个工作版本或版本,并将差异确定为潜在缺陷。据此可假定:新版本应该象早先版本一样操作,并确保并未因为版本的变化而带来缺陷。

    理想状态下,您可能希望一次迭代内的所有测试用例都能在后续迭代内使用。应遵照下列指导原则来确定、设计并实施测试用例,这些测试用例可以最大限度地发挥回归测试和复用的价值,同时将维护的成本减至最低:

    确保测试用例只确定关键的数据元素(创建/支持被测试的条件所需的数据元素)
    确保每个测试用例都说明或代表一个唯一的输入集或事件序列,其结果是独特的测试目标行为
    消除多余或等效的测试用例
    将具有相同的测试目标初始状态和测试数据状态的测试用例组合到一起

     


     

  • 全面介绍单元测试

    2008-06-26 14:38:31

    全面介绍单元测试

    2007-04-26 17:19:39 / 个人分类:study

    单元测试概述
    xH;[;C@9d196051  工厂在组装一台电视机之前,会对每个元件都进行测试,这,就是单元测试。
    :c'dOW-X4x196051  其实我们每天都在做单元测试。你写了一个函数,除了极简单的外,总是要执行一下,看看功能是否正常,有时还要想办法输出些数据,如弹出信息窗口什么的,这,也是单元测试,老纳把这种单元测试称为临时单元测试。只进行了临时单元测试的软件,针对代码的测试很不完整,代码覆盖率要超过70%都很困难,未覆盖的代码可能遗留大量的细小的错误,这些错误还会互相影响,当BUG暴露出来的时候难于调试,大幅度提高后期测试和维护成本,也降低了开发商的竞争力。可以说,进行充分的单元测试,是提高软件质量,降低开发成本的必由之路。
    h\V {s/Qh`196051  对于程序员来说,如果养成了对自己写的代码进行单元测试的习惯,不但可以写出高质量的代码,而且还能提高编程水平。
    !t.^6[ ivQZ'JV3V2]196051  要进行充分的单元测试,应专门编写测试代码,并与产品代码隔离。老纳认为,比较简单的办法是为产品工程建立对应的测试工程,为每个类建立对应的测试类,为每个函数(很简单的除外)建立测试函数。首先就几个概念谈谈老纳的看法。
    +k*f7w!}/v-q;D Y c196051  一般认为,在结构化程序时代,单元测试所说的单元是指函数,在当今的面向对象时代,单元测试所说的单元是指类。以老纳的实践来看,以类作为测试单位,复杂度高,可操作性较差,因此仍然主张以函数作为单元测试的测试单位,但可以用一个测试类来组织某个类的所有测试函数。单元测试不应过分强调面向对象,因为局部代码依然是结构化的。单元测试的工作量较大,简单实用高效才是硬道理。51Testing软件测试网~g hXc4Zua fE:S
      有一种看法是,只测试类的接口(公有函数),不测试其他函数,从面向对象角度来看,确实有其道理,但是,测试的目的是找错并最终排错,因此,只要是包含错误的可能性较大的函数都要测试,跟函数是否私有没有关系。对于C++来说,可以用一种简单的方法区隔需测试的函数:简单的函数如数据读写函数的实现在头文件中编写(inline函数),所有在源文件编写实现的函数都要进行测试(构造函数和析构函数除外)。
    j]9k9L'a;]H196051  什么时候测试?单元测试越早越好,早到什么程度?XP开发理论讲究TDD,即测试驱动开发,先编写测试代码,再进行开发。在实际的工作中,可以不必过分强调先什么后什么,重要的是高效和感觉舒适。从老纳的经验来看,先编写产品函数的框架,然后编写测试函数,针对产品函数的功能编写测试用例,然后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。所谓先编写产品函数的框架,是指先编写函数空的实现,有返回值的随便返回一个值,编译通过后再编写测试代码,这时,函数名、参数表、返回类型都应该确定下来了,所编写的测试代码以后需修改的可能性比较小。
    J&uH4K2sxw196051  由谁测试?单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成,也就是说,经过了单元测试的代码才是已完成的代码,提交产品代码时也要同时提交测试代码。测试部门可以作一定程度的审核。
    8iNxq'V~4{"~196051  关于桩代码,老纳认为,单元测试应避免编写桩代码。桩代码就是用来代替某些代码的代码,例如,产品函数或测试函数调用了一个未编写的函数,可以编写桩函数来代替该被调用的函数,桩代码也用于实现测试隔离。采用由底向上的方式进行开发,底层的代码先开发并先测试,可以避免编写桩代码,这样做的好处有:减少了工作量;测试上层函数时,也是对下层函数的间接测试;当下层函数修改时,通过回归测试可以确认修改是否导致上层函数产生错误。51Testing软件测试网 nD5FQ@+Zt$x?
    51Testing软件测试网2tb?;`A9Km
    二 测试代码编写51Testing软件测试网b#oDH{~B9}
      多数讲述单元测试的文章都是以Java为例,本文以C++为例,后半部分所介绍的单元测试工具也只介绍C++单元测试工具。下面的示例代码的开发环境是VC6.0。
    /ND1`1F$Dx/_j _'k2f196051
    fn_,Q1D2td196051产品类:
    *k6X JT7A4|g196051class CMyClass
    kH^Y O&a%rVbz196051{51Testing软件测试网 M:\qVt7J$a^UC
    public:
    x,T*GOkS%R;J i196051    int Add(int i, int j);51Testing软件测试网b |kR j'V4@'D(A
        CMyClass();51Testing软件测试网9KI;VxX9C
        virtual ~CMyClass();
    #t.u)q_,i/~196051
    0RH"k6X }_196051private:51Testing软件测试网t;i6H0t n+o9? \
        int mAge;      //年龄51Testing软件测试网(pn*d%}0}w@
        CString mPhase; //年龄阶段,如"少年","青年"
    G6Po hY*YGp9w196051};51Testing软件测试网&}G} v`&[ ko@)CE(d |

    #@P6b5R-J)Q196051建立对应的测试类CMyClassTester,为了节约编幅,只列出源文件的代码:
    G ^z8k^*IV196051void CMyClassTester::CaseBegin()51Testing软件测试网7g^ zQY!g T
    {51Testing软件测试网H_9|2I#JAV4XX
        //pObj是CMyClassTester类的成员变量,是被测试类的对象的指针,
    #T9s,`v7e5|#q196051    //为求简单,所有的测试类都可以用pObj命名被测试对象的指针。51Testing软件测试网 L-UU.x `P7DG
        pObj = new CMyClass();51Testing软件测试网$w L p9e'B h^:yG'o0S2^
    }51Testing软件测试网aV&P|0R Z*H l!j

    sx}b]/WH196051void CMyClassTester::CaseEnd()
    Ko"Hd\6D~"c196051{
    w8[J4E$q)?{%d.g$? F196051    delete pObj;
    ({9K.b/@r0Ro196051}
    a1Fd;[,JOP6R&^0c C196051测试类的函数CaseBegin()和CaseEnd()建立和销毁被测试对象,每个测试用例的开头都要调用CaseBegin(),结尾都要调用CaseEnd()。
    |] A b$t4[ @4]19605151Testing软件测试网;V6Jzg2s7? qu `'_)[
    接下来,我们建立示例的产品函数:
    (K __Jr2w[196051int CMyClass::Add(int i, int j)51Testing软件测试网0}*^FxG,Vs{
    {
    QGux*HW6Y196051    return i+j;51Testing软件测试网/U#R!BLMg
    }
    ]B1^(LJle9V@196051和对应的测试函数:51Testing软件测试网@8V'_)dE*h"J4F
    void CMyClassTester::Add_int_int()51Testing软件测试网l&jW ANfM~
    {
    &}aMc?M196051}
    |G,V%{&G%P4M q196051把参数表作为函数名的一部分,这样当出现重载的被测试函数时,测试函数不会产生命名冲突。下面添加测试用例:
    0\]"FJ(V p z-xH196051void CMyClassTester::Add_int_int()51Testing软件测试网o T&y#T!OFW,n6RYp e
    {
    r(`:Q {?-Q-An196051    //第一个测试用例51Testing软件测试网(aMW.q&Ih`A
        CaseBegin();{              //1
    1Yv/MU4`;{196051    int i = 0;                //2
    $CPT2xsU196051    int j = 0;                //3
    4o6P0G'wUQ9v)Vjy196051    int ret = pObj->Add(i, j); //451Testing软件测试网"UmC-Z"r9A0`,@
        ASSERT(ret == 0);          //5
    'U?:{dR^'J t2P196051    }CaseEnd();                //6
    6X ~T9l$P [!x V196051}
    :E(Oc ]OVjtc3m196051第1和第6行建立和销毁被测试对象,所加的{}是为了让每个测试用例的代码有一个独立的域,以便多个测试用例使用相同的变量名。
    ];L!wfY Nv196051第2和第3行是定义输入数据,第4行是调用被测试函数,这些容易理解,不作进一步解释。第5行是预期输出,它的特点是当实际输出与预期输出不同时自动报错,ASSERT是VC的断言宏,也可以使用其他类似功能的宏,使用测试工具进行单元测试时,可以使用该工具定义的断言宏。
    '|n:L U MBtG196051
    z/d]L&s'LXox196051  示例中的格式显得很不简洁,2、3、4、5行可以合写为一行:ASSERT(pObj->Add(0, 0) == 0);但这种不简洁的格式却是老纳极力推荐的,因为它一目了然,易于建立多个测试用例,并且具有很好的适应性,同时,也是极佳的代码文档,总之,老纳建议:输入数据和预期输出要自成一块。51Testing软件测试网J`M&U` e$Bh,m _
      建立了第一个测试用例后,应编译并运行测试,以排除语法错误,然后,使用拷贝/修改的办法建立其他测试用例。由于各个测试用例之间的差别往往很小,通常只需修改一两个数据,拷贝/修改是建立多个测试用例的最快捷办法。
    4\&W;c+h;x5D5mLni19605151Testing软件测试网]f$e$I?*\
    三 测试用例51Testing软件测试网1@G)c%?0c4C5Ch G
      下面说说测试用例、输入数据及预期输出。输入数据是测试用例的核心,老纳对输入数据的定义是:被测试函数所读取的外部数据及这些数据的初始值。外部数据是对于被测试函数来说的,实际上就是除了局部变量以外的其他数据,老纳把这些数据分为几类:参数、成员变量、全局变量、IO媒体。IO媒体是指文件、数据库或其他储存或传输数据的媒体,例如,被测试函数要从文件或数据库读取数据,那么,文件或数据库中的原始数据也属于输入数据。一个函数无论多复杂,都无非是对这几类数据的读取、计算和写入。预期输出是指:返回值及被测试函数所写入的外部数据的结果值。返回值就不用说了,被测试函数进行了写操作的参数(输出参数)、成员变量、全局变量、IO媒体,它们的预期的结果值都是预期输出。一个测试用例,就是设定输入数据,运行被测试函数,然后判断实际输出是否符合预期。下面举一个与成员变量有关的例子:51Testing软件测试网A$Ic$t*w/S A Fb @"]
    产品函数:
    IE$S9m(bO196051void CMyClass::Grow(int years)51Testing软件测试网x/Px?.k1t
    {51Testing软件测试网.D'oqr"c QMX
        mAge += years;51Testing软件测试网S7l-`:BU{b:g

    4q%zAY%D9P2x u"}196051    if(mAge < 10)51Testing软件测试网Qi/\n*JWz
            mPhase = "儿童";
    6fm7r)T^Dv Qp{196051    else if(mAge <20)51Testing软件测试网geL!n} q/b,Y3S
            mPhase = "少年";
    Rz'v@|ESf196051    else if(mAge <45)
    hP(X'Lo.O_196051        mPhase = "青年";51Testing软件测试网s&P%M&EtP*v2n Y F
        else if(mAge <60)51Testing软件测试网;|,O"@]AX
            mPhase = "中年";51Testing软件测试网{1k-t"?CA
        else
    W7xgx1V;R196051        mPhase = "老年";
    p4\&_s'D.~%q196051}51Testing软件测试网*T E-^$J(V.K
    51Testing软件测试网u;Hl.U6f^*L$L5{
    测试函数中的一个测试用例:
    :B@7W#].hE9smy196051    CaseBegin();{51Testing软件测试网_~fV zs\T
        int years = 1;
    %R;r9z*i?"h196051    pObj->mAge = 8;51Testing软件测试网-H%F U;{ j? |
        pObj->Grow(years);
    8c8n+N"kN&g u9h196051    ASSERT( pObj->mAge == 9 );
    "I(C5U0su4H196051    ASSERT( pObj->mPhase == "儿童" );
    5Km/PQ&Ea|L/W/T$\196051    }CaseEnd();
    rF k:{_4R_196051在输入数据中对被测试类的成员变量mAge进行赋值,在预期输出中断言成员变量的值。现在可以看到老纳所推荐的格式的好处了吧,这种格式可以适应很复杂的测试。在输入数据部分还可以调用其他成员函数,例如:执行被测试函数前可能需要读取文件中的数据保存到成员变量,或需要连接数据库,老纳把这些操作称为初始化操作。例如,上例中 ASSERT( ...)之前可以加pObj->OpenFile();。为了访问私有成员,可以将测试类定义为产品类的友元类。例如,定义一个宏:51Testing软件测试网GUP#qPns
    #define UNIT_TEST(cls) friend class cls##Tester;
    y'm3c"F`*Wy1h196051然后在产品类声明中加一行代码:UNIT_TEST(ClassName)。
    8Y4~$}9S3E!O19605151Testing软件测试网&y0v&i#o;g"I;b0Vi{9g#d
      下面谈谈测试用例设计。前面已经说了,测试用例的核心是输入数据。预期输出是依据输入数据和程序功能来确定的,也就是说,对于某一程序,输入数据确定了,预期输出也就可以确定了,至于生成/销毁被测试对象和运行测试的语句,是所有测试用例都大同小异的,因此,我们讨论测试用例时,只讨论输入数据。
    }7l:r$E-C196051  前面说过,输入数据包括四类:参数、成员变量、全局变量、IO媒体,这四类数据中,只要所测试的程序需要执行读操作的,就要设定其初始值,其中,前两类比较常用,后两类较少用。显然,把输入数据的所有可能取值都进行测试,是不可能也是无意义的,我们应该用一定的规则选择有代表性的数据作为输入数据,主要有三种:正常输入,边界输入,非法输入,每种输入还可以分类,也就是平常说的等价类法,每类取一个数据作为输入数据,如果测试通过,可以肯定同类的其他输入也是可以通过的。下面举例说明: 51Testing软件测试网 }FA5ZF0V0P%sb
      正常输入
    +QK*aD] i196051  例如字符串的Trim函数,功能是将字符串前后的空格去除,那么正常的输入可以有四类:前面有空格;后面有空格;前后均有空格;前后均无空格。51Testing软件测试网pjt'tz5b q
      边界输入
    o"vC7rP1se*m196051  上例中空字符串可以看作是边界输入。
    `!Tkr*[V"lYHR196051  再如一个表示年龄的参数,它的有效范围是0-100,那么边界输入有两个:0和100。
    1je0E/N8h@.e)n^196051  非法输入
    &PW%cVsy2v$~196051  非法输入是正常取值范围以外的数据,或使代码不能完成正常功能的输入,如上例中表示年龄的参数,小于0或大于100都是非法输入,再如一个进行文件操作的函数,非法输入有这么几类:文件不存在;目录不存在;文件正在被其他程序打开;权限错误。
    ?2Zhi E"b#G)EQ196051  如果函数使用了外部数据,则正常输入是肯定会有的,而边界输入和非法输入不是所有函数都有。一般情况下,即使没有设计文档,考虑以上三种输入也可以找出函数的基本功能点。实际上,单元测试与代码编写是“一体两面”的关系,编码时对上述三种输入都是必须考虑的,否则代码的健壮性就会成问题。51Testing软件测试网XE%VmkFc

    a kSje196051四 白盒覆盖51Testing软件测试网EM&x"Q1|'\
      上面所说的测试数据都是针对程序的功能来设计的,就是所谓的黑盒测试。单元测试还需要从另一个角度来设计测试数据,即针对程序的逻辑结构来设计测试用例,就是所谓的白盒测试。在老纳看来,如果黑盒测试是足够充分的,那么白盒测试就没有必要,可惜“足够充分”只是一种理想状态,例如:真的是所有功能点都测试了吗?程序的功能点是人为的定义,常常是不全面的;各个输入数据之间,有些组合可能会产生问题,怎样保证这些组合都经过了测试?难于衡量测试的完整性是黑盒测试的主要缺陷,而白盒测试恰恰具有易于衡量测试完整性的优点,两者之间具有极好的互补性,例如:完成功能测试后统计语句覆盖率,如果语句覆盖未完成,很可能是未覆盖的语句所对应的功能点未测试。
    VF]6OrG.Zq7|196051  白盒测试针对程序的逻辑结构设计测试用例,用逻辑覆盖率来衡量测试的完整性。逻辑单位主要有:语句、分支、条件、条件值、条件值组合,路径。语句覆盖就是覆盖所有的语句,其他类推。另外还有一种判定条件覆盖,其实是分支覆盖与条件覆盖的组合,在此不作讨论。跟条件有关的覆盖就有三种,解释一下:条件覆盖是指覆盖所有的条件表达式,即所有的条件表达式都至少计算一次,不考虑计算结果;条件值覆盖是指覆盖条件的所有可能取值,即每个条件的取真值和取假值都要至少计算一次;条件值组合覆盖是指覆盖所有条件取值的所有可能组合。老纳做过一些粗浅的研究,发现与条件直接有关的错误主要是逻辑操作符错误,例如:||写成&&,漏了写!什么的,采用分支覆盖与条件覆盖的组合,基本上可以发现这些错误,另一方面,条件值覆盖与条件值组合覆盖往往需要大量的测试用例,因此,在老纳看来,条件值覆盖和条件值组合覆盖的效费比偏低。老纳认为效费比较高且完整性也足够的测试要求是这样的:完成功能测试,完成语句覆盖、条件覆盖、分支覆盖、路径覆盖。做过单元测试的朋友恐怕会对老纳提出的测试要求给予一个字的评价:晕!或者两个字的评价:狂晕!因为这似乎是不可能的要求,要达到这种测试完整性,其测试成本是不可想象的,不过,出家人不打逛语,老纳之所以提出这种测试要求,是因为利用一些工具,可以在较低的成本下达到这种测试要求,后面将会作进一步介绍。51Testing软件测试网D:M/MMg%V7p @
      关于白盒测试用例的设计,程序测试领域的书籍一般都有讲述,普通方法是画出程序的逻辑结构图如程序流程图或控制流图,根据逻辑结构图设计测试用例,这些是纯粹的白盒测试,不是老纳想推荐的方式。老纳所推荐的方法是:先完成黑盒测试,然后统计白盒覆盖率,针对未覆盖的逻辑单位设计测试用例覆盖它,例如,先检查是否有语句未覆盖,有的话设计测试用例覆盖它,然后用同样方法完成条件覆盖、分支覆盖和路径覆盖,这样的话,既检验了黑盒测试的完整性,又避免了重复的工作,用较少的时间成本达到非常高的测试完整性。不过,这些工作可不是手工能完成的,必须借助于工具,后面会介绍可以完成这些工作的测试工具。
    'b'pN2Dg5h!u+r19605151Testing软件测试网 a!O/`6d?0R
    五 单元测试工具51Testing软件测试网 lr y6hQGAoE
      现在开始介绍单元测试工具,老纳只介绍三种,都是用于C++语言的。
    `0d_gS9Ak196051  首先是CppUnit,这是C++单元测试工具的鼻祖,免费的开源的单元测试框架。由于已有一众高人写了不少关于CppUnit的很好的文章,老纳就不现丑了,想了解CppUnit的朋友,建议读一下Cpluser 所作的《CppUnit测试框架入门》,网址是:http://blog.csdn.net/cpluser/archive/2004/09/21/111522.aspx。该文也提供了CppUnit的下载地址。
    /vM&S{.OY!o~B8cP"e196051  然后介绍C++Test,这是Parasoft公司的产品。[C++Test是一个功能强大的自动化C/C++单元级测试工具,可以自动测试任何C/C++函数、类,自动生成测试用例、测试驱动函数或桩函数,在自动化的环境下极其容易快速的将单元级的测试覆盖率达到100%]。[]内的文字引自http://www.superst.com.cn/softwares_testing_c_cpptest.htm,这是华唐公司的网页。老纳想写些介绍C++Test的文字,但发现无法超越华唐公司的网页上的介绍,所以也就省点事了,想了解C++Test的朋友,建议访问该公司的网站。华唐公司代理C++Test,想要购买或索取报价、试用版都可以找他们。老纳帮华唐公司做广告,不知道会不会得点什么好处?
    R+GU}A%Bq196051  最后介绍Visual Unit,简称VU,这是国产的单元测试工具,据说申请了多项专利,拥有一批创新的技术,不过老纳只关心是不是有用和好用。[自动生成测试代码 快速建立功能测试用例 程序行为一目了然 极高的测试完整性 高效完成白盒覆盖 快速排错 高效调试 详尽的测试报告]。[]内的文字是VU开发商的网页上摘录的,网址是:http://www.unitware.cn。前面所述测试要求:完成功能测试,完成语句覆盖、条件覆盖、分支覆盖、路径覆盖,用VU可以轻松实现,还有一点值得一提:使用VU还能提高编码的效率,总体来说,在完成单元测试的同时,编码调试的时间还能大幅度缩短。算了,不想再讲了,老纳显摆理论、介绍经验还是有兴趣的,因为可以满足老纳好为人师的虚荣心,但介绍工具就觉得索然无味了,毕竟工具好不好用,合不合用,要试过才知道,还是自己去开发商的网站看吧,可以下载演示版,还有演示课件。51Testing软件测试网+sT8C3T$QaG-E9M-c

  • TCP/IP的通讯协议 (xu)

    2008-06-26 14:12:27

    TCP/IP的通讯协议 (xu)

    2007-05-15 20:27:25 / 个人分类:study

    这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。 51Testing软件测试网#f J` Q.XgB/Z&T)M
    51Testing软件测试网.U-`-q(y.Jf)\8r uY
    TCP/IP整体构架概述 51Testing软件测试网$thT#}2|!Lnulo0y
    51Testing软件测试网#T!i.GhU5t
    TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:
    %Q3QR~n)|7dM196051
    1S'Vo-]6B.L196051应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。 51Testing软件测试网i3{ ptG\G~x

    3WT;q/_3|+BG8V196051传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
    /KK|D\|al {~19605151Testing软件测试网!V"x/r dP]
    互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
    h2Aw2k(O4Z,LMwp19605151Testing软件测试网%r [B1ny7]~2\
    网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。 51Testing软件测试网z"L1]W)AcOn0r

    ?2v1z7nJ196051TCP/IP中的协议 51Testing软件测试网!f7X!d(VCS3[C
    51Testing软件测试网:Ao o$f&S b!P-i
    以下简单介绍TCP/IP中的协议都具备什么样的功能,都是如何工作的:
    Vg)@1mX!s D&G;w196051
    d0[ G ?V^8g|1960511. IP 51Testing软件测试网&jg}2aFVLJ

    [u/G9UZRfp196051网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。
    N1L`?6e6v2n U7T196051
    o5l:\1?,x196051IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 51Testing软件测试网9a n(JA"Q

    9wIA^{)[QX/[196051高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。 51Testing软件测试网@lZ c s1\NDYnH

    FbQ0c b E1960512. TCP
    Z+hO6P4{pC196051
    8u^+rB+t2M6B196051如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
    5K;|4^%T/DV19605151Testing软件测试网8r+I"_$H W KSL
    TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。 51Testing软件测试网 V ze;T1z*qF
    51Testing软件测试网?t:af$L,D%m p
    面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。
    d)GhP!t19605151Testing软件测试网PcrH]9E0F u
    3.UDP 51Testing软件测试网$}4z(nF^.S
    51Testing软件测试网2[y.} XYl
    UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。 51Testing软件测试网,Y I;`5oz~"}H3MN*G
    51Testing软件测试网-R){2p z-J,z$Py
    欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。 51Testing软件测试网$n.ob*PK.[/x,S#Y

    3r6J,D4HX-b1960514.ICMP
    (C.{tWm ~(g19605151Testing软件测试网y1[6u*qp8zA2S
    ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。
    K,TpA&tzc]196051
    Tuo$eO?|J1960515. TCP和UDP的端口结构 51Testing软件测试网b,^+t _+M/v8V2{M
    51Testing软件测试网&B)OLmy iOx
    TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。 51Testing软件测试网Km W&b(}(})y7l7g

    XQ!M|[$I3M L2A196051两个系统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认: 51Testing软件测试网^4sl$]s/]A)~$Y

    'R2S*~L}&R"U5PT196051源IP地址 发送包的IP地址。
    ,t,i7{'WhG0oBb196051
    eP9j9]~gn196051目的IP地址 接收包的IP地址。 51Testing软件测试网6i'TIp;V

    B nm j em196051源端口 源系统上的连接的端口。
    s@zR1i#qh/l19605151Testing软件测试网:P;n"F e8w fC
    目的端口 目的系统上的连接的端口。
    q8[2XYFJH!`R19605151Testing软件测试网(NYjRdaR)s"@
    端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows使用6000。这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯。
  • TCP/IP协议简介

    2008-06-26 12:47:57

    TCP/IP协议简介

    2007-03-31 22:20:33 / 个人分类:study

    什么是TCP/IP?
    k(xn8uz"x0_E196051TCP协议和IP协议指两个用在Internet上的网络协议(或数据传输的方法)。它们分别是传输控制协议和互连网协议。这两个协议属于众多的TCP/IP 协议组中的一部分。51Testing软件测试网K(UplM`,b5Az O
    TCP/IP协议组中的协议保证Internet上数据的传输,提供了几乎现在上网所用到的所有服务。这些服务包括:电子邮件的传输  文件传输  新闻组的发布  访问万维网51Testing软件测试网u4z;K rh ec/?
    在TCP/IP协议组分两种协议:网络层的协议  应用层的协议51Testing软件测试网.g[a:j5VZ4wh;g$p
    网络层协议  51Testing软件测试网L{Bw0T` lH*SG
    网络层协议管理离散的计算机间的数据传输。这些协议用户注意不到,是在系统表层以下工作的。比如,IP协议为用户和远程计算机提供了信息包的传输方法。它是在许多信息的基础上工作的,比如说是机器的IP地址。在机器IP地址和其它信息的基础上,IP确保信息包能正确地到达目的机器。通过这一过程,IP和其它网络层的协议共同用于数据传输。如果没有网络工具,用户就看不到在系统里工作的IP。51Testing软件测试网U)_,Ka^:V
    应用层协议51Testing软件测试网uqjp'?|
    相反地,应用层协议用户是可以看得到的。比如,文件传输协议(FTP)用户是看得到的。用户为了传输一个文件请求一个和其它计算机的连接,连接建立后,就开始传输文件。在传输时,用户和远程计算机的交换的一部分是能看到的。
    NOCjBt196051请记住这句总结性的话:TCP/IP协议是指一组使得Internet上的机器相互通信比较方便的协议。51Testing软件测试网6PvdR B?
    TCP/IP是如何工作的?51Testing软件测试网F/` lxW3KYE
    TCP/IP通过使用协议栈工作。这个栈是所有用来在两台机器间完成一个传输的所有协议的几个集合。(这也就是一个通路,数据通过它从一台机器到另一台机器。)栈分成层,与这里有关的是五个层。学习下面的图可以对层有个概念。
    \S2yX&V~v*D B%k1a196051在数据通过图示的步骤后,它就从网络中的一台机器传到另一台机器了。在这个过程中,一个复杂的查错系统会在起始机器和目的机器中执行。
    j3]|_ hY5g:{X196051栈的每一层都能从相邻的层中接收或发送数据。每一层都与许多协议相联系。在栈的每一层,这些协议都在起作用。本章的下一部分将分析这些服务,以及它们在栈中是如何联系的。同时也分析一下它们的功能,它们提供的服务和与安全性的关系。51Testing软件测试网:V@V*~y \&M4r m
    协议简介51Testing软件测试网X:{AAPk3P[
    已经知道数据是怎样使用TCP/IP协议栈来传输的了。现在仔细分析在栈中所用到的关键的协议。先从网络层的协议开始。51Testing软件测试网f3W'Ky ` sV
    网络层协议51Testing软件测试网u0`(J:X5^`M
    网络层协议是那些使传输透明化的协议。除了使用一些监视系统进程的工具外,用户是看不见这些协议的。51Testing软件测试网8X F$|%sU!d
    Sniffers是能看到这些步骤的装置。这个装置可以是软件,也可以是硬件,她能读取通过网络发送的每一个包。Sniffers广泛地用于隔离用户看不到的、网络性能下降的问题。sniffers能读取发生在网络层协议的任何活动。而且,正如你已经猜到的,sniffers会对安全问题造成威胁。参见Sniffers一章。
    ~z X&S&E#iP8pJ g196051重要的网络层协议包括:
    eC9x#N)Qd196051 地址解析协议(ARP)
    8d-VY'tc3?196051 Internet控制消息协议(ICMP)51Testing软件测试网]3\Cee,g8g/N5eA}
     Internet协议(IP)
    4d&X6l,|e196051 传输控制协议(TCP)
    f2^8z[0@&G f196051下面仅仅简单介绍一下。51Testing软件测试网+Q9sF$]R*\A!LM
    地址解析协议ARP
    ;g\%[,K/Pq;R@.{196051地址解析协议的目的是将IP地址映射成物理地址。这在使信息通过网络时特别重要。在一个消息(或其他数据)发送之前,被打包到IP包里,或适合于Internet传输的信息块。这包括两台计算机的IP地址。在这个包离开发送计算机之前,必须要找到目标的硬件地址。这就是ARP最初用到的地方。
    OUu+~ G@K196051一个ARP请求消息在网上广播。请求由一个进程接收,它回复物理地址。这个回复消息由原先的那台发送广播消息计算机接收,从而传输过程就开始了。
    i`X,I!T s196051ARP的设计包括一个缓存。为了理解缓存的概念,考虑一下:许多现代的HTML浏览器(比如Netscape或Microsoft的Internet
    {0N*jD9A:x@!I#JZ196051Explorer)使用了一个缓存。缓存是磁盘的一部分,从Web网上经常访问的东西就存在里面(比如按钮,或通用的图形)。这是符合逻辑的,因为当你返回这些主页的时候,这些东西不必再从远程计算机上装载了。从缓存中装载的速度要比较快。51Testing软件测试网SX.?@N?.? {
    相似的,ARP的实现包括一个缓存。以这种方式,网络或远程计算机的硬件地址就存着了,并为接着的ARP请求作准备。这样节省了时间和网络资源。
    'jl4{9]k0LJ196051但是,正是由于缓存,就引起了安全性。
    LLP WW'O*Md/}6I196051对于网络安全来将,这并不是最重要的安全性问题。然而,地址缓存(不仅仅是在ARP而且在其他例子中)确实会引起安全性问题。一旦这些地址保存,都会是让黑客伪造一个远程连接,它们对缓存的地址很欢迎。 Internet控制消息协议ICMP51Testing软件测试网P c2\o$Zz}%p8k
    Internet控制消息协议是用来在两台计算机间传输时处理错误和控制消息的。它允许这些主机共享信息。在这一方面,ICMP是用来诊断网络问题的重要工具。通过ICMP收集诊断信息的例子如下:
    :M9g.I7??:{6p0sv196051一台主机关机
    K,L#AF"xt196051一个网关堵塞和工作不正常
    O[z e"q#g1ZR ^g[196051网络中其他的失败51Testing软件测试网3[6X2N-Jx1XR X
    可能最著名的ICMP实现的网络工具是ping。ping通常用来判断是否一台远程机器正开着,数据包从用户的计算机发到远程计算机。这些包通常返回用户的计算机。如果没有返回数据包到用户计算机,ping程序就产生一个表示远程计算机关机的错误消息。51Testing软件测试网n8ql*_.Y\.es"b
    应用层协议
    GO5v c8P i"g196051应用层协议是专门为用户提供应用服务的。它是建立在网络层协议之上的。51Testing软件测试网"A#b,?b%p0m+i8dTP
    Telnet51Testing软件测试网1q}1l%wy1hn8[3p
    Telnet在RFC51Testing软件测试网;~h%?4ZF.l$]
    854中有详细地描述,Telnet协议中说明:Telnet协议的目的就是提供一个相当通用的,双向的,面向八位字节的通信机制。它的最初目的是允许终端和面向终端的进程之间的交互。
    XI1S3r/zAr)BG$R196051Telnet不仅允许用户登录到一个远程主机,它允许用户在那台计算机上执行命令。这样,Los Angeles的一个人可以Telnet到New
    &@^f i#dS196051York的一台机器,并在这台机器上运行程序,就跟在New York的用户一样。
    ?L'p)]VJ196051对于熟悉Telnet的用户来讲,他的操作与BBS的界面一样。Telnet是一个能提供建立在终端字体的访问数据库的一个应用程序。比如,多于80%的大学的图书馆的目录可以通过Telnet访问到。
    F3FTXK"TSJg196051即使GUI应用程序被大大采用,Telnet这个建立在字符基础上的应用程序,仍相当的流行。这有许多原因。第一,Telnet允许你以很小的网络资源花费实现各种功能(如收发邮件)。实现安全的Telnet是件十分简单的事。有许多这样的程序,通用的是Secure
    :H6dJ*EA0oK196051Shell。
    LI.GedSf8v0_$u196051要使用Telnet,用户要指定启动Telnet客户的命令,并在后面指定目标主机的名字。在Linux中,可以这样:51Testing软件测试网iV6odU:}
    $telnet internic.net
    1m8k3N'HM196051这个命令启动Telnet过程,连接到internic.net。这个连接可能被接受,或被拒绝,这与目标主机的配置有关。在UNIX,Telnet命令很久以前就是内置的。也就是说,Telnet已经包含在UNIX的发行版本中有十年了。但并不是所有操作系统都将Telnet作为内置的Telnet客户。
    xy6K5e2pO)T4O196051文件传输协议FTP
    h L^%a5W\t|E196051文件传输协议是从一个系统向另一个系统传递文件的标准方法。它的目标在RFC 0765中写得很清楚。51Testing软件测试网bLw'uIh%PZ(oG%}
    FTP的目标是1)促进文件和程序的共享,2)鼓励间接和含蓄的使用远程计算机,3)使用户不必面对主机间使用的不同的文件存储系统,4)有效和可靠地传输文件。FTP,尽管用户可以直接通过终端来使用,是设计成让别的程序使用的。
    HB.D#gqKIN196051约有二十年,研究者调查了相当广泛的文件传输方法。FTP经历了多次改变。1971年作了第一次定义,整个的说名参见RFC 114。51Testing软件测试网QPUl)KJsh
    FTP是怎样工作的?
    6Zh@\'bR0Fl196051FTP文件传输应用在客户/服务环境。请求机器启动一个FTP客户端软件。这就给目标文件服务器发出了一个请求。典型地,这个要求被送到端口21。一个连接建立起来后,目标文件服务器必须运行一个FTP服务软件。51Testing软件测试网9X7H:x0^d*d^U
    FTPD是标准的FTP服务daemon。它的功能很简单:回复inetd收到的连接请求,并满足这些要传输文件的请求。这个daemon在许多发行版的UNIX中是个标准。
    0o ]xErq8S196051FTPD等待一个连接请求。当这样的一个请求到达时,FTPD请求用户登录。用户提供它的合法的登录名和口令或匿名登录。51Testing软件测试网*\K ry hE;F1W'}
    一旦登录成功,用户可以下载文件了。在某些情况下,如果服务器的安全允许,用户可以上载文件。
    N+_,J.E7LH"s196051简单邮件传输协议SMTP51Testing软件测试网a6[9L/?'M&PfY
    简单邮件传输协议的目的是使得邮件传输可靠和高效。51Testing软件测试网P1D)W3n Pv
    SMTP是一个相当小和有效的协议。用户给SMTP服务器发个请求。一个双向的连接随后就建立了。客户发一个MAIL指令,指示它想给Internet上的某处的一个收件人发个信。如果SMTP允许这个操作,一个肯定的确认发回客户机。随后,会话开始。客户可能告知收件人的名称和IP地址,以及要发送的消息。
    Z?N4Lkj196051尽管SMTP相当简单,邮件服务是无穷的安全漏洞的源泉。
    )^!tXz(aJ196051SMTP服务在Linux内部是内置的。其它网络操作系统也提供某些形式的SMTP。
    ? T hj s1v[196051Gopher
    M&@3W'o0\196051Gopher是一个分布式的文件获取系统。它最初是作为Campus Wide Information
    }?`._9w [[7m196051System在Minnesota大学实现的。它的定义如下:51Testing软件测试网[wS-r1_%kH
    Internet
    R Lx l.p U196051Gopher协议最初是设计用来最为一个分布式文件发送系统的。文档放在许多服务器上,Gopher客户软件给客户提供一个层次项和目录,看上去象一个文件系统。事实上,Gopher的界面设计成类似一个文件系统,因为文件系统是查找文件和服务的最好模型。51Testing软件测试网`%cab8A'\*]7F
    Gopher服务功能相当强大。能提供文本,声音,和其他媒体。主要用在文本模式,比通过用浏览器使用HTTP要来得快。毫无疑问,最流行的Gopher客户软件是为UNIX编写的。其他操作系统也有Gopher客户端软件。
    OQlE:PcI196051典型地,用户启动一个Gopher客户端软件,和一个Gopher服务器。随后,Gopher返回一个可以选择的菜单。可能包括查找菜单,预先设置的目标,或文件目录。
    Z0D \G}p!t196051注意,Gopher模式完全是一个客户服务器模式。用户每次登录,客户给Gopher服务器发送一个请求,要求所有能得到的文档。Gopher服务器对这个信息做出反应知道用户请求一个对象。
    #JTN&R.b ]5su1C&M+I196051超联结传输协议HTTP
    |R)n*~%U8J3bpsx196051由于它能让用户在网上冲浪,超联结传输协议可能是最有名的协议。HTTP是一个应用层协议,它很小也很有效,符合发布、合成和超媒体文本系统的的需要。是一个通用的,面向对象的协议,通过扩展请求命令,可以用来实现许多任务。HTTP的一个特点是数据表现的类型允许系统相对独立于数据的传输。
    m c/ajw ?8_196051HTTP的出现永久地改变了Internet的特点,主要是使Internet大众化。在某些程度上,他它的操作与Gopher相类似。比如,它的工作是请求/响应式的。这是相当重要的一点。其他应用程序,比如Telnet仍需要用户登录(当他们登录时,便消耗系统资源)。但Gopher和HTTP协议,消除了这一现象。用户(客户)仅仅在他们请求或接受数据时消耗资源。51Testing软件测试网 ~ s[3jg
    使用通用浏览器,象Netscape Navigator或Microsoft Internet
    D&d5WwB3wv196051Explore,可以监视这一过程的发生。在WWW上的数据,你的浏览器会和服务器及时联系。这样,它首先获取文本,然后是图形,再后是声音,等等。在你的浏览器的状态栏的左下角。当它装载页面时,看着它几分钟。你会看到请求和服务活动的发生,通常速度很快。51Testing软件测试网~B6~*]%s(Ns;Vh6[
    HTTP并不特别关注所需的是什么类型的数据。各种形式的媒体都能插进,以及远程的HTML主页。51Testing软件测试网TdEQqI_$yQ
    网络新闻传输协议NNTP51Testing软件测试网 Jr#`+_-V;s%| q
    网络新闻传输协议是一个广泛使用的协议。它提供通常作为USENET新闻组的新闻服务。
    uQ$K [ Q(r],R&E$i196051NNTP定义了一个协议,使用一个可靠的建立在流的基础上的在Internet上传输新闻的分发,询问,获取和发布的一个协议。NNTP被设计成新闻被存储在一个中心的数据库,允许订阅者选择他们希望读的主题。目录,交叉引用和过期的新闻都能找到。
    ZTD jXzK"z@%|9X2E+i196051NNTP有许多特性和简单邮件传输协议以及TCP相似。与SMTP相似,它接受一般的英语命令。和TCP相似,它是建立在流的传输和分发的基础上的。NNTP通常在端口119运行。
    y'ss.ouZ T196051下面详细地讲解一下以太网,IP协议和TCP协议。51Testing软件测试网@c%z,c+EC,g(d
    第二节 Etherner51Testing软件测试网+jWj@\!O
    以太网的基本工作原理51Testing软件测试网S$~;xR5YB:J t
    以太网上的所有设备都连在以太总线上,它们共享同一个通信通道。以太网采用的是广播方式的通信,即所有的设备都接收每一个信息包。网络上的设备通常将接收到的所有包都传给主机界面,在这儿选择计算机要接收的信息,并将其他的过滤掉。以太网是最有效传递的意思是,硬件并不给发送者提供有关信息已收到的信息。比如,即使目标计算机碰巧关机了,送给它的包自然就丢失,但发送者并不会知道这一点。51Testing软件测试网1f])V-r!a
    以太网的控制是分布式的。以太网的存取方式叫做带有Collision的Carrier Sense Multipe51Testing软件测试网CV$f^\8x9d
    Access。因为多台计算机可以同时使用以太网,每台机器看看是否有载波信号出现判定总线是否空闲。如果主机接口有数据要传输,它就侦听,看看是否有信号正在传输。如果没有探测到,它就开始传输。每次传输都在一定的时间间隔内,即传输的包有固定的大小。而且,硬件还必须在两次传输之间,观察一个最小的空闲时间,也就是说,没有一对机器可以不给其他计算机通信的机会而使用总线。
    +oIu0e[ H+kw196051冲突侦测和恢复51Testing软件测试网H"m4f7K.|
    当开始一个传输时,信号并不能同时到达网络的所有地方。传输速度实际上是光速的80%。这就有可能两个设备同时探测到网络是空闲的,并都开始传输。但当这两个电信号在网络上相遇时,它们都不再可用了。这种情况叫做冲突。51Testing软件测试网?kq_'E;vs aY
    以太网在处理这种情况时,很有技巧性。每台设备在它传输信号的时候都监视总线,看看它在传输的时候是否有别的信号的干扰。这种监视叫做冲突侦听。在探测到冲突后,设备就停止传输。有可能网络会因为所有的设备都忙于尝试传输数据而每次都产生冲突。51Testing软件测试网LG|#_JB(L;m8N
    为了避免这种情况,以太网使用一个2进制指数后退策略。发送者在第一次冲突后等待一个随机时间,如果第二次还是冲突,等待时间延长一倍。第三次则再延长一倍。通过这种策略,即使两台设备第二的等待时间会很接近,但由于后面的等待时间成指数倍增长,不就,他们就不会相互冲突了。
    H)l ]+L4?)Dfj196051以太网的硬件地址
    /H9Xztn6z`(Y196051每台连接到以太网上的计算机都有一个唯一的48位以太网地址。以太网卡厂商都从一个机构购得一段地址,在生产时,给每个卡一个唯一的地址。通常,这个地址是固化在卡上的。这个地址又叫做物理地址。
    'D G4u)F/~196051当一个数据帧到达时,硬件会对这些数据进行过滤,根据帧结构中的目的地址,将属于发送到本设备的数据传输给操作系统,忽略其他任何数据。
    l YKAi196051一个是地址位全为1的时表示这个数据是给所有总线上的设备的。
    A|-z~K X lCR P2l196051以太网的帧结构
    ;ww]1T!o7K.MzN196051以太网的帧的长度是可变的,但都大于64字节,小于1518字节。在一个包交换网络中,每个以太网的帧包含一个指明目标地址的域。上图是以太网帧的格式,包含了目标和源的物理地址。为了识别目标和源,以太网帧的前面是一些前导字节,类型和数据域以及冗余校验。前导由64个0和1交替的位组成,用于接收同步。32位的CRC校验用来检测传输错误。在发送前,将数据用CRC进行运算,将结果放在CRC域。接收到数据后,将数据做CRC运算后,将结果和CRC域中的数据相比较。如果不一致,那么传输过程中有错误。
    F.`v%`/k"m;X{196051帧类型域是一个16位的整数,用来指示传输的数据的类型。当一个帧到达台设备后,操作系统通过帧类型来决定使用哪个软件模块。从而允许在同一台计算机上同时运行多个协议。
    ja~K0}V Q196051第三节 Internet地址51Testing软件测试网R9LO*ia3F
    网络上的每一台计算机都有一个表明自己唯一身份的地址。TCP/IP协议对这个地址做了规定。一个IP地址由一个32位的整数表示。它的一个较为聪明的地方是很好的规定了地址的范围和格式,从而使地址寻址和路由选择都很方便。一个IP地址是对一个网络和它上面的主机的地址一块编码而形成的一个唯一的地址。51Testing软件测试网Vb;G r7D3~e'C Q
    在同一个物理网络上的主机的地址都有一个相同前缀,即IP地址分成两个部分:(netid,hostid)。其中netid代表网络地址,hostid代表这个网络上的主机地址,根据他们选择的位数的不同,可以分成以下五类基本IP地址。51Testing软件测试网3Gg4h5aN:FO7t
    通过地址的前3位,就能区分出地址是属于A,B或C类。其中A类地址的主机容量有16777216台主机,B类地址可以有65536台主机,C类地址可以有256台主机。51Testing软件测试网p)j%q*q;~x~EE D
    将地址分成网络和主机部分,在路由寻址时非常有用,大大提高了网络的速度。路由器就是通过IP地址的netid部分来决定是否发送和将一个数据包发送到什么地方。51Testing软件测试网o|6^6P:d.qi!Kb
    一个设备并不只能有一个地址。比如一个连到两个物理网络上的路由器,它就有两个IP地址。所以可以将IP地址看成是一个网络连接。
    z)N f y-M'A-^;P s196051为了便于记忆和使用32位的IP地址,可以将地址使用用小数点分开的四位整数来表示。下面举个例子:51Testing软件测试网L!Y [3g0d
    IP地址: 10000000 00001010 00000010 0001111051Testing软件测试网g'K:@1e}+S
    记为: 128.10.2.30
    +q9M+g(n7C,c O4@*]196051第四节 IP协议和路由
    ;~U3[r&_Xa3|196051IP协议
    w:kE.UH196051IP协议定义了一种高效、不可靠和无连接的传输方式。由于传输没有得到确认,所以是不可靠的。一个包可能丢失了,或看不见了,或是延时了,或是传输顺序错了。但是传输设备并不检测这些情况,也不通知通信双方。无连接51Testing软件测试网-M h Ot5A9r h
    因为每个包的传递与别的包是相互独立的。同一个机器上的包可能通过不同的路径到达另一台机器,或在别的机器上时已经丢失。由于传输设备都试图以最快的速度传输,所以是最高效的。
    ^Gp9Dn.d&fV U196051IP协议定义了通过TCP/IP网络传输的数据的格式,定义了数据进行传递的路由功能。
    'tFjM"Qw196051IP数据包的格式如下:51Testing软件测试网L7}i C;m}l3Jj0P
    由一个头和数据部分组成。数据包的头部分包含诸如目的地址和源地址,数据的类型等信息。
    3i9G-am9`!BUT196051数据包头格式:
    (~ X*RR ls;Fks196051数据包是由软件处理的,它的内容和格式并不是由硬件所限定。51Testing软件测试网d7o1nO(E'x!C(t$^
    比如,头4位是一个VERS,表示的是使用的IP协议的版本号。它表示发送者、接收者和路由器对该数据的处理都要按所示的版本进行处理。现在的版本号是4。软件通过版本来决定怎样进行处理。
    l(ItL4]M#Y196051头长度(HLEN)也是用4位来表示以32位为计量单位的头的长度。
    d7Fk'g`#p RBA196051TOTAL LENGTH表示这个数据包的长度(字节数)。从而包中的数据的长度就可以通过上面两个数据而计算出来了。51Testing软件测试网{t9} R-jO-v,\)g
    一般来说,数据部分就是一个物理的帧。对于以太网来讲,就是将整个的一个以太网的帧数据作为一个IP数据包的数据来传输的。51Testing软件测试网h2?MWuh$n/nJ$I\
    数据包的头里面还包含了一些其他的信息,请参见有关资料的具体介绍。 IP路由51Testing软件测试网kH Bn.T
    在一个网络上,连接两种基本设备,主机和路由器。路由器通常连接几个物理网络。对一台主机来讲,要将一个数据包发往别的网络,就需要知道这个数据包应该走什么路径,才能到达目的地。对于一台路由器来讲,将收到的数据包发往哪个物理网络。因此,无论主机还是路由器,在发送数据包是都要做路由选择。51Testing软件测试网5o5o-s!yY4z\@
    数据发送有两种方式:直接数据发送和间接数据发送。51Testing软件测试网 Y7t+YVv2U
    直接数据发送通常是在同一个物理网络里进行的。当一个主机或路由器要将数据包发送到同一物理网络上的主机上时,是采用这种方式的。首先判断IP数据包中的目的地址中的网络地址部分,如果是在同一个物理网络上,则通过地址分析,将该IP目的地址转换成物理地址,并将数据解开,和该地址合成一个物理传输帧,通过局域网将数据发出。
    "p/e6w#s3y9CjL9a9ab196051间接数据发送是在不同物理网络里进行的。当一个主机或路由器发现要发送的数据包不在同一个物理网络上时,这台设备就先在路由表中查找路由,将数据发往路由中指定的下一个路由器。这样一直向外传送数据,到最后,肯定有一个路由器发现数据要发往同一个物理网络,于是,再用直接数据发送方式,将数据发到目的主机上。
    `4?1vA-B'm196051主机和路由器在决定数据怎样发送的时候,都要去查找路由。一般,都将路由组成一个路由表存在机器中。路由表一般采用Next-Hop格式,即(N,R)对。N是目标地址的网络地址,R是传输路径中的下一个路由。通常这个路由和这台机器在同一物理网络里。
    T:J5u"b)YH,u196051第五节 TCP协议
    )d e$nm X(F196051TCP传输原理51Testing软件测试网/`x4{gsZdn
    TCP协议在IP协议之上。与IP协议提供不可靠传输服务不同的是,TCP协议为其上的应用层提供了一种可靠传输服务。这种服务的特点是:可靠、全双工、流式和无结构传输。51Testing软件测试网uZTP-{*nA@%]
    它是怎样实现可靠传输的呢?51Testing软件测试网O.@3? s'wx7U w|.^
    TCP协议使用了一个叫积极确认和重发送(positive acknowledgement with retransmission)的技术来实现这一点的。51Testing软件测试网6gw\9]ky9qMO
    接收者在收到发送者发送的数据后,必须发送一个相应的确认(ACK)消息,表示它已经收到了数据。51Testing软件测试网%z&^n4p cd-?
    发送者保存发送的数据的记录,在发送下一个数据之前,等待这个数据的确认消息。在它发送这个数据的同时,还启动了一个记时器。如果在一定时间之内,没有接收到确认消息,就认为是这个数据在传送时丢失了,接着,就会重新发送这个数据。
    x Z!{M*xAH6R Q4yS196051这种方法还产生了一个问题,就是包的重复。如果网络传输速度比较低,等到等待时间结束后,确认消息才返回到发送者,那么,由于发送者采用的发送方法,就会出现重复的数据了。解决的一个办法是给每个数据一个序列号,并需要发送者记住哪个序列号的数据已经确认了。为了防止由于延时或重复确认,规定确认消息里也要包含确认序列号。从而发送者就能知道哪个包已经确认了。 TCP协议中还有一个重要的概念:滑动窗口。这一方法的使用,使得传输更加高效。51Testing软件测试网Sm B'm*O8w
    有前面的描述可见,发送者在发送完一个数据包之后,要等待确认。在它收到确认消息之前的这段时间是空闲的。如果网络延时比较长,这个问题会相当明显。51Testing软件测试网$|\Ua x6S
    滑动窗口方法是在它收到确认消息以前,发送多个数据包。可以想象成有一个窗口在一个序列上移动。
    )R L#^*cS%D C196051如果一个包发送出去之后还没有确认,叫做未确认包。通常未确认的包的个数就是窗口的大小。
    2R)ITZ*q3i GO(L;B196051此窗口的大小为8。发送者允许在接收到一个确认消息以前发送8个数据包。当发送者接到窗口中第一个包的确认消息时,它就将窗口下滑一个。51Testing软件测试网*vh`3]+P/G NU W\
    在接收端,也有一个滑动窗口接收和确认一个包。
    &ZObLi196051端口51Testing软件测试网4WE~bH
    使用TCP传输就是建立一个连接。在TCP传输中一个连接有两个端点组成。其实,一个连接代表的是发送和接收两端应用程序的之间的一个通信。可以把他们想象成建立了一个电路。通常一个连接用下面的公式表示:
    d-B{,~5U `|E196051(host,port)
    5l\U Q%J-c7[6Q4O?196051host是主机,port是端口。TCP端口能被几个应用程序共享。对于程序员来讲,可以这样理解:一个应用程序可以为不同的连接提供服务。51Testing软件测试网 V-V Ppe*S
    TCP格式
    :UzWD D.F7l-G)QS0~-v196051TCP传输的单位是段,在建立连接,传送数据,确认消息和告之窗口大小时均要进行段的交换。
    oy|9w Rz4Iho:Y2L196051段的格式如下图:
    I)}Z.h:}RP1u B:w196051段的格式也分成两部分,头和数据。51Testing软件测试网!`#^0yi6I\ Jxy^+`
    上面格式中的名称已经足够说明了他们的作用了。具体的含义请参见有关资料。
    l4M5D5g%k} s196051建立一个TCP连接
    !xa2c(BtH196051TCP协议使用一个三次握手来建立一个TCP连接的。51Testing软件测试网%J,Fw.}cuz
    握手过程的第一个段的代码位设置为SYN,序列号为x,表示开始一次握手。接收方收到这个段后,向发送者回发一个段。代码位设置为SYN和ACK,序列号设置为y,确认序列号设置为x+1。发送者在受到这个段后,知道就可以进行TCP数据发送了,于是,它又向接收者发送一个ACK段,表示,双方的连接已经建立。
    kfz~?R*Y&g%K3n7y"V196051在完成握手之后,就开始正式的数据传输了。
    S-\ K L N0F196051上面握手段中的序列号都是随机产生的。51Testing软件测试网vp)@%N9@HB
    TCP/IP
    *k Je9Yy_N196051每种网络协议都有自己的优点,但是只有TCP/IP允许与Internet完全的连接。TCP/IP是在60年代由麻省理工学院和一些商业组织为美国国防部开发的,即便遭到核攻击而破坏了大部分网络,TCP/IP仍然能够维持有效的通信。ARPANET就是由基于协议开发的,并发展成为作为科学家和工程师交流媒体的Internet。51Testing软件测试网+B!Jj9J4T.l]a0J$bV
    TCP/IP同时具备了可扩展性和可靠性的需求。不幸的是牺牲了速度和效率(可是:TCP/IP的开发受到了政府的资助)。
    k"l X7L T!FtC196051Internet公用化以后,人们开始发现全球网的强大功能。Internet的普遍性是TCP/IP至今仍然使用的原因。常常在没有意识到的情况下,用户就在自己的PC上安装了TCP/IP栈,从而使该网络协议在全球应用最广。 51Testing软件测试网 J(OKI Jh2E
    TCP/IP的32位寻址功能方案不足以支持即将加入Internet的主机和网络数。因而可能代替当前实现的标准是IPv6

  • 事务

    2008-06-25 18:01:57

  • 针对事务的一个问题的解答

    2008-5-27

    今天有一个朋友问了一个问题如下:

    比如一个银行的帐务处理系统,我想了解,它在一分钟内能够对多少个账户进行帐务处理,或者连续运行8个小时,能够返回多少用户处理的结果。这样该怎么去进行测试呢。感觉很多性能测试方面的资料都在讲并发用户访问时,系统地响应时间之类。找不到这种类型的测试应该怎么进行

    回答如下:

    这个问题可以用事务来去考虑。我们拿简单的例子脚本来说:
    比如以下脚本是做帐务处理的:以下我只简写)
     
    lrs_create(IP);
    lr_think_time(x);
    lrs_send();

    lrs_receive();
     
     
    我们可以加上事务,这个想必你知道,如下:
     
    lr_start_transaction( account);
    lrs_create(IP);
    lr_think_time(x);
    lrs_send();

    lrs_receive();
    lr_end_transaction (account);
     
    这样按场景设计运行完成后,只要看这个事务的数值就知道有多少帐户进行了处理。结合这个事务的曲线,你可以看到,在各个时间点或者时间段里的帐户处理个数曲线。
    至于返回数据的结果,你可以加上验证函数。如果能直接加检查点的,...

  • 视频

    2008-06-25 15:07:51

  • 测试B/S,或C/S,考虑的点

    2008-06-25 14:53:38

    点:(仅供参考)测试B/S,或C/S,自己考虑的

    2008-03-19 12:09:21

    1、过滤问题,

    2、数据不存在问题,

    3、加载的信息不正确,

    4、出错返回的页面不对,

    5、权限问题,

    5-1、不按常规操作产生的问题,

    6、系统出现错误后,而又找不到重现的有效方法,跟踪产生问题的原因,
    最常用的方法:只能继续操作容易出现问题的地主,想办法令问题得以重现;

    7、逻辑日期:比如仓库入库是24号,而仓库出库日期应该大于25号;

    8、通用的业务流程:如果不同公司的业务流程不一样,再作改动,
    花费的人力和物力资源不可估量的,所以好的设计,
    就能让软件面对同一行业的客户时都能应付自如;

    9、单据编号的唯一性,主要考虑,单据号是否保存到数据表中去,
    再新增时是否自动加一,同时考虑,两个用户或多个用户同时操作时的情况;

    10、数据的过滤是否合理性和参考的数据不冗余;

    11、单据审核后,且该单据被其他单据所引用时,如果再对该单据进行反审核(改单,进行修改数据时),系统对数据正确性和可更改性的把握要有明确的规则;

    12、考虑客户最关心的数据:仓库最重要的可以有是仓库的库存量,而财务关心的报表应该是可读性,并一目了然,金额是否正确,数据是否正确,能提高用户的工作效率;

    13、搭建用户的使用环境,测试才有利;
    (遇到用户的特殊环境:多个用户同时远程连接服务器进行BS系统的操作;)
    (不同用户操作同一单据,同一按钮等等)
    (在局域网测试没有问题,但连接在外网时,出现乱码的情况,字符不识别;)
     (用户速度慢也会抱怨,有可能机器配置不高,或者系统对优化方面做得不全面;)

    14系统升级过程中,应该有固定的时间,并给出提示让用户知道情况,但升级不能太频繁,影响用户操作就会不好,(我们系统是用tomcat,有时出现错误了,查不到原因,迫不得意有时都会重启tomcat,才能进行系统的操作,有时都几无奈的....

    15最后,一定学一些业务方面的知识!

  • 关于B/S和C/S架构的探析

    2008-06-25 14:36:49

    关于B/S和C/S架构的探析

    2008-01-10 22:15:10 / 个人分类:知识积累

    当今世界科学技术飞速发展,尤其以通信、计算机、网络为代表的互联网技术更是日新月异,令人眼花燎乱,目不睱接。 由于计算机互联网在政治、经济、生活等各个领域的发展、运用以及网络的迅速普及和全社会对网络的依赖程度,计算机网络已经成为国家的经济基础和命脉,成为社会和经济发展强大动力、,其地位越来越重要。但是,由于主流技术研发企业和用户对“B/S”和“C/S”技术谁优谁劣、谁代表技术潮流发展等等问题的争论不休,已经给检察机关使用“OA(办公)”和“案件管理”软件工作开展带来困惑,本文就此两项技术发展变化和应用前景做些探讨,供同行叁考。

    一、     什么是C/S和B/S

    要想对“C/S”和“B/S”技术发展变化有所了解,首先必须搞清楚三个问题。

    第一、什么是C/S结构。C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。

    传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件, 加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。而且代价高, 效率低。如我院使用的上海超兰公司“案件统计”管理软件就是典型的C/S体系结构管理软件。

    第二、什么是B/S结构。B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全 。目前我院内网(Intranet)、外网(Internet)和北京东方清大公司“案件、办公管理软件”就是B/S 结构管理软件,干警在局域网各工作站通过WWW浏览器就能实现工作业务。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。

    第三、管理软件主流技术。管理软件技术的主流技术与管理思想一样,也经历了三个发展时期。首先,界面技术从上世纪DOS字符界面到Windows图形界面(或图形用户界面GUI),直至Browser浏览器界面三个不同的发展时期。其次,今天所有电脑的浏览器界面,不仅直观和易于使用,更主要的是基于浏览器平台的任何应用软件其风格都是一样的,使用人对操作培训的要求不高,而且软件可操作性强,易于识别;再者,平台体系结构也从过去单用户发展到今天的文件/服务器(F/S)体系、客户机/服务器(C/S)体系和浏览器/服务器(B/S)体系。

    二、C/S和B/S 之比较

    C/S和B/S是当今世界开发模式技术架构的两大主流技术。C/S是美国 Borland公司最早研发,B/S是美国微软公司研发。目前,这两项技术以被世界各国所掌握,国内公司以C/S和B/S技术开发出产品也很多。这两种技术都有自己一定的市场份额和客户群,各家企业都说自己的管理软件架构技术功能强大、先进、方便,都能举出各自的客户群体,都有一大群文人墨客为自己摇旗呐喊,广告满天飞,可谓仁者见仁,智者见智。

       1、C/S架构软件的优势与劣势

    (1)、应用服务器运行数据负荷较轻。最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。

    (2)、数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。

    (3)、C/S架构的劣势是高昂的维护成本且投资大。首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。

    其次,传统的C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代价高和低效率已经不适应工作需要。在JAVA这样的跨平台语言出现之后,B/S架构更是猛烈冲击C/S,并对其形成威胁和挑战。

    2、B/S架构软件的优势与劣势

    (1)、维护和升级方式简单。目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点单位来说,系统管理人员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越“瘦”,而服务器越来越“胖”是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。因此,维护和升级革命的方式是“瘦”客户机,“胖”服务器。

    (2)、成本降低,选择更多。大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。 现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用那种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使的最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。

    比如说很多人每天上“新浪”网,只要安装了浏览器就可以了,并不需要了解“新浪”的服务器用的是什么操作系统,而事实上大部分网站确实没有使用windows操作系统,但用户的电脑本身安装的大部分是windows操作系统。

    (3)、应用服务器运行数据负荷较重。由于B/S架构管理软件只安装在服务器端(Server)上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)实现,所有的客户端只有浏览器,网络管理人员只需要做硬件维护。但是,应用服务器运行数据负荷较重,一旦发生服务器“崩溃”等问题,后果不堪设想。因此,许多单位都备有数据库存储服务器,以防万一。
  • C/S和B/S简介:

    2008-06-25 14:01:03

    C/S和B/S简介:

    C/S模式的服务器通常采用PC或工作站,小型机等,需要大型的数据库系统例如SQL Server,Oracle,Sybase,MySQL等,客户端需要安装专用的客户端软件;

    B/S模式的客户机需要安装一个浏览器,如微软的Internet Explorer,苹果的Safari,开源Firefox等,服务器要安装数据库,浏览器通过Web Server与服务器的数据库进行数据交互。

    优缺点:

    C/S的优点:充分的发挥了PC机的处理能力,很多工作都可以在客户端处理后在传给服务器端,客户端响应速度快;缺点:只限用于局域网,客户端需要安装专用的客户端软件,对客户端的操作系统一般也有限制。

    B/S的优点:是可以在任何地方进行操作,不需要安装任何的专门软件,有一台能上网的计算机就可以了,客户端零维护。系统管理非常容易。缺点:就是C/S的优点它不能实现。

  • C/S 结构的软件与 B/S 结构的软件 测试有何区别?

    2008-06-25 13:20:17

     首先来了解一下什么是 C/S 结构与 B/S 结构.

      C/S client/server即客户端/服务器 分为客户机与服务器两层,客户机不是没有任何运算能力的输入输出设备,要求有一定的数据处理能力和数据存储能力,通过把应用软件的数据和计算合理地分配给客户机和服务器;有效地降低网络通信量和服务器运算量,也就减轻了服务器的运算压力;

      B/S Browser/server即浏览器/服务器 在这种结构中,应用软件的业务逻辑完全在应用服务器端实现,用户操作完全在Web服务器实现,客户端只需要浏览器即可进行业务处理,它只完成浏览,查询,输入等简单的功能,绝大部分的功能在服务器上实现,对服务器的要求就提高了.

      由于两种结构的数据处理的不能,对于客户机及服务器的要求也不同,相对来说,B/S结构的客户机只要是能上网,有浏览器即可以访问应用软件,因只要在服务器上装有应用软件,出现问题也就只要维护服务器;而C/S结构,由于客户机与服务器都要求有处理能力,相当来说客户机的要求会较高,服务器的压力也减轻了;在客户机上也要装有对应的应用软件,且不同的操作系统可能就要对应不同的软件版本,因此,软件的维护难度就大了.

      了解了两种结构的不同,我就该去了解一下两种结构的测试有什么不同的吗?

      C/S结构:

      1.

      B/S结构:

      1.浏览器兼容性

      2.安全性测试

      3.链接测试

      4.页面易用性可能性测试

  • 我的文档

    2008-06-25 12:49:04

    暂无
  • c/s、b/s系统测试的不同分类

    2008-06-25 10:58:48

    2006-12-06 13:06:46 / 个人分类:读书笔记

    按照测试对象的结构分类可以分为:c/s结构系统测试、b/s结构系统测试、个人软件测试……

    Client/Server软件测试

    c/s结构的软件测试发生在三个不同的层次

    • 个体的客户端应用以“分离的”模式被测试——不考虑服务器和底层网络的运行
    • 客户端软件和关联的服务器段应用被一起测试,但网络运行不被明显的考虑
    • 完成的C/S 体系结构,包括网络运行和性能,被测试。

    C/S结构软件测试常用方法

    • 应用功能测试——客户端勇勇被独立的执行,以揭示在其运行中的错误
    • 服务器测试——测试服务器的协调和数据管理功能,也考虑服务器性能(整体反应时间和数据吞吐量)
    • 数据库测试——测试服务器存储的数据的精确性和完整性,检查客户端应用提交的事务,以保证书具备正确的存储、更新和检索。
    • 事务测试——创建一系列的测试以保证每类事务被按照要求处理。测试着重于处理的正确性,也关注性能的问题。
    • 网络通信测试——这些测试验证网络节点间的通行正常的发生,并且消息传递、事务和相关的网络交通无错的发生。

    Browse/Server软件测试

    B/S结构软件测试需要关注:

    • 基本功能测试
    • 性能测试
    • 浏览器兼容性测试
    • 数据库测试
    • 安全性测试
    • 可用性易用性测试
    • 链接测试
    • 针对系统支持的协议的测试

    补充点个人软件测试需要关注的内容:

    • 基本功能测试
    • 安装卸载测试
    • 升级测试
    • 兼容性测试
    • 自我保护测试

    这是个总结每一个相关的测试关注点都不是一句两句说得清楚,至少我知道现在针对不同的结构关注的内容都有哪些了?继续努力不断进步!加油!

     

  • 数据统计

    • 访问量: 7831
    • 日志数: 19
    • 文件数: 3
    • 建立时间: 2008-06-25
    • 更新时间: 2008-10-14

    RSS订阅

    Open Toolbar