软件复杂度的复杂度的种类
有模块、类和程序三类复杂度。
模块复杂度包含了关于模块的复杂度信息;类复杂度是针对那些使用McCabe面向对象特性的程序,它包含了关于类的复杂度信息;程序复杂度包含了关于程序的复杂度信息。
集成复杂度报告对应于三种复杂度的是三种复杂度报告。
如果一个报告的复杂度信息不只一种,那么就把这些复杂度信息组合成新的报告。
集成复杂度信息只收集一个部件及其下级的信息。
例如:如果一个程序级报告包含一个类复杂度,那么只报告组成程序的类的信息,而不包含类组成的信息。
McCabe复杂度是对软件结构进行严格的算术分析得来的,实质上是对程序拓扑结构复杂性的度量,明确指出了任务复杂部分。
McCabe复杂度包括:圈复杂度、基本复杂度、模块设计复杂度、设计复杂度、集成复杂度、行数、规范化复杂度、全局数据复杂度、局部数据复杂度、病态数据复杂度。
McCabe复杂度的用途在软件工程中,有三种使用McCabe复杂性度量的方式。
作为测试的辅助工具。
McCabe复杂性度量的结果等于通过一个子程序的路径数,因而需要设计同样多的测试案例以覆盖所有的路径。
如果测试案例数小于复杂性数,则有三种情况一是需要更多的测试;二是某些判断点可以去掉;三是某些判断点可用插入式代码替换。
作为程序设计和管理指南。
在软件开发中,需要一种简单的方式指出可能出问题的子程序。
保持子程序简单的通用方法是设置一个长度限制,例如50行或2页,但这实际上是在缺乏测试简明性的有效方法时无可奈何的替代方法。
不少人认为McCabe度量就是这样一种简明性度量。
但是要注意,McCabe度量数大的程序,不见得结构化就不好。
例如,Case语句是良结构的,但可能有很大的McCabe度量数(依赖于语句中的分支数),这可能是由于问题和解决方案所固有的复杂性所决定的。
使用者应当自己决定如何使用McCabe度量所提供的信息。
作为网络复杂性度量的一种方法。
Hall和Preiser提出了一种组合网络复杂性度量,用于度量可能由多个程序员组按模块化原理建立的大型软件系统的复杂性。
他们提出的组合度量公式为式中 C1,...,Ck是各个模块的复杂性;CN是网络复杂性;W1和W2为权值。
McCabe复杂度即可用于度量各个模块的复杂性,也可用于度量网络复杂性。
圈复杂度是用来衡量一个模块判定结构的复杂程度,数量上表现为独立路径的条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,经验表明,程序的可能错误和高的圈复杂度有着很大关系。
独立路径组成的集合称为基本路径集合,独立路径数就是指基本路径集合中路径的数量。
基本路径集合不是唯一的,独立路径数也就不唯一。
因此,圈复杂度是最大独立路径数。
计算方法节点是程序中代码的最小单元,边代表节点间的程序流。
如果一个模块流程图有e条边n个节点,它的圈复杂度V(G)=e-n+2,典型的V(G)max=10。
图1中示例的圈复杂度是2。
优点避免软件中的错误倾向;指出极复杂模块,这样的模块也许可以进一步细化;度量测试计划,确定测试重点;在开发过程中通过限制程序逻辑,指导测试过程;指出将要测试的区域;帮助测试人员确定测试和维护对象;与所用的高级程序设计语言类型无关。
应用圈复杂度指出为了确保软件质量应该检测的最少基本路径的数目。
在实际中,测试每一条路经是不现实的,测试难度随着路径的增加而增加。
但测试基本路径对衡量代码复杂度的合理性是很必要的。
McCabe & Associates建议圈复杂度到10,因为高的圈复杂度使测试变得更加复杂而且增大了软件错误产生的概率。
提示:圈复杂度度量是测量在一个软件模块中的分支数目,在所有的开发周期中都要使用。
圈复杂度度量以软件的结构流程图为基础。
控制流程图描述了软件模块的逻辑结构。
一个模块在典型的语言中是一个函数或子程序,有一个入口和一个出口,也可以通过调用/返回机制设计模块。
软件模块的每个执行路径,都有与从模块的控制流程图中的入口到出口的节点相符合的路径。
“Cyclomatic”来源于非直接连接基本测试周期的数目,更重要的是,也通过直接相连的图表给出独立路径的数目。
通过图表的相关性,一个节点可到达另一个节点。
圈复杂度度量也可作为模块基本流程图路径的数目,其重点在于模块线形组合后,所产生的路径数目是最小的。
对圈复杂度的限制现在有许多好方法可以用来限制圈复杂度。
过于复杂的模块容易出错,难于理解、测试、更正,所以应当在软件开发的各个阶段有意识地限制复杂度,许多开发者已经成功地实现把对软件复杂度的限制作为软件项目的一部分,尽管在确切的数目上略微有些争议。
最初支持的数目是10,现在支持数目可达15。
但是,只应当在条件较好的情况下使数目大于10,例如开发者非常有经验,设计合乎正式标准,使用现代化的程序语言、结构程序、代码预排和先进的测试计划。
换句话说,开发团队可以选择超过10的限制数目,但是必须根据经验进行一些取舍,把精力花在比较复杂的模块上。
基本复杂度是用来衡量程序非结构化程度的,非结构成分降低了程序的质...
软件测试java类圈复杂度是什么意思
圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准。
它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。
圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。
程序的可能错误和高的圈复杂度有着很大关系。
两个方法是指类里面有两个函数对吧?! 是的是要有4个elseif语句么?不是的,但是如果你写成嵌套的四个else if,那么圈复杂度肯定超过4,圈复杂度的计算用很多工具可以辅助完成,比如eclipse metrics, java ncss等。
人工计算圈复杂度比较复杂,限于篇幅无法详细介绍,网上相关介绍很多,可以直接baidu检索
关于路线设计的问题
导线法设计根据用户预定好的导线进行接线设计。
可以交互的输入各项参数进行设计。
包括:基本型缓和曲线、单圆弧曲线、同向复曲线、凸型曲线、回头曲线。
通常公路平面线形由直线及曲线组成。
曲线又根据具体形式分为标准曲线、复曲线、S形曲线或其他各种形式的复杂线形。
但各种各样的线形总是由直线、圆曲线及缓和曲线(回旋线)组合而成的,我们称直线段、圆曲线和缓和曲线为组成平面线形的单元,即“线元”,它是构成公路平面线形的基本元素。
一条复杂多变的公路平面线形总是由若干个线元首尾相连而构成的。
一旦各个线元确定,公路的平面线形也就随之而定。
积木法,亦称线元法或单向推进法,它是将组合复杂的公路平面线形“化整为零”,分解成若干个线形单元。
若已知路线平面曲线的起点信息如坐标、切线方向和曲率半径,则从起点处开始设置任何一单元,沿任何方向延伸,此单元终点的信息如坐标、切线方位角、曲线半径都可以计算出来,同时将其作为下一单元起点的相同信息加以利用。
如此逐个单元往下计算,似同搭积木一样,各个单元首尾连接,构成一条连续完整的公路平面线形。
软件测试中什么是白盒测试 黑盒测试
白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。
这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。
采用什么方法对软件进行测试呢?常用的软件测试方法有两大类:静态测试方法和动态测试方法。
其中软件的静态测试不要求在计算机上实际执行所测程序,主要以一些人工的模拟技术对软件进行分析和测试;而软件的动态测试是通过输入一组预先按照一定的测试准则构造的实例数据来动态运行程序,而达到发现程序错误的过程。
白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。
白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。
其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。
六种覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。
语句覆盖每条语句至少执行一次。
判定覆盖每个判定的每个分支至少执行一次。
条件覆盖每个判定的每个条件应取到各种可能的值。
判定/条件覆盖同时满足判定覆盖条件覆盖。
条件组合覆盖每个判定中各条件的每一种组合至少出现一次。
路径覆盖使程序中每一条可能的路径至少执行一次。
"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。
"白盒"法是穷举路径测试。
在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。
贯穿程序的独立路径数是天文数字。
但即使每条路径都测试了仍然可能有错误。
第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。
第二,穷举路径测试不可能查出程序中因遗漏路径而出错。
第三,穷举路径测试可能发现不了一些与数据相关的错误。
如何挑选白盒测试工具 白盒测试目前主要用在具有高可靠性要求的软件领域,例如:军工软件、航天航空软件、工业控制软件等等。
白盒测试工具在选购时应当主要是对开发语言的支持、代码覆盖的深度、嵌入式软件的测试、测试的可视化等。
对开发语言的支持:白盒测试工具是对源代码进行的测试,测试的主要内容包括词法分析与语法分析、静态错误分析、动态检测等。
但是对于不同的开发语言,测试工具实现的方式和内容差别是较大的。
目前测试工具主要支持的开发语言包括:标准C、C++、Visual C++、Java、Visual J++等。
代码的覆盖深度:从覆盖源程序语句的详尽程度分析,逻辑覆盖标准包括以下不同的覆盖标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正判定条件覆盖。
·语句覆盖 为了暴露程序中的错误,程序中的每条语句至少应该执行一次。
因此语句覆盖(Statement Coverage)的含义是:选择足够多的测试数据,使被测程序中每条语句至少执行一次。
语句覆盖是很弱的逻辑覆盖。
·判定覆盖 比语句覆盖稍强的覆盖标准是判定覆盖(Decision Coverage)。
判定覆盖的含义是:设计足够的测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,或者说使得程序中的每一个取“真”分支和取“假”分支至少经历一次,因此判定覆盖又称为分支覆盖。
·条件覆盖 在设计程序中,一个判定语句是由多个条件组合而成的复合判定。
为了更彻底地实现逻辑覆盖,可以采用条件覆盖(Condition Coverage)的标准。
条件覆盖的含义是:构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。
·多条件覆盖 多条件覆盖也称条件组合覆盖,它的含义是:设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。
显然满足多条件覆盖的测试用例是一定满足判定覆盖、条件覆盖和条件判定组合覆盖的。
·修正条件判定覆盖 修正条件判定覆盖是由欧美的航空/航天制造厂商和使用单位联合制定的“航空运输和装备系统软件认证标准”,目前在国外的国防、航空航天领域应用广泛。
这个覆盖度量需要足够的测试用例来确定各个条件能够影响到包含的判定的结果。
它要求满足两个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(and、or)连接的布尔条件,每个条件对于判定的结果值是独立的。
不同的测试工具对于代码的覆盖能力也是不同的,通常能够支持修正条件判定覆盖的测试工具价格是极其昂贵的。
嵌入式软件的测试:对于嵌入式软件的测试,我们还需要一方面进一步考虑测试工具对于嵌入式操作系统的支持能力,例如DOS、Vxworks、Neculeus、Linux和Windows CE等;另一方面还需要考虑测试工具对于硬件平台的支持能力,包括是...
转载请注明出处51数据库 » 软件复杂度的计算和基本路径设计
兔女郎不是我