为您推荐:
精华内容
最热下载
问答
  • 5星
    4.45MB ailemony 2021-01-09 11:14:59
  • 5星
    610KB weixin_44573410 2021-05-27 23:11:38
  • 5星
    4.69MB weixin_44573410 2021-06-17 22:56:47
  • 5星
    40KB Lion_DU 2021-06-28 22:23:50
  • 5星
    159KB weixin_44020886 2021-02-17 08:48:00
  • 5星
    189KB ailemony 2020-11-26 21:41:29
  • 5星
    54KB ailemony 2020-12-19 16:04:46
  • 5星
    1.34MB weixin_44573410 2021-03-06 21:56:19
  • 5星
    387KB weixin_44573410 2021-03-05 22:14:38
  • 5星
    4.7MB zuoan1993 2021-06-02 22:45:58
  • 而挑选的过程是不是靠谱,全赖两个条件,第一是能不能保证所有有资格的候选项都进入了挑选的范围,第二是挑选的过程是否合理高效。没有这两个条件作为铺垫,像王昭君这样的大美女黯然落榜只能下嫁蛮夷的悲剧就无法...

    OVERLAY NETWORK最早受到关注始自P2P,在此之前,尽管类似隧道、vpn的技术已经具备了OVERLAY的特征,但是波澜不兴,中规中矩,到了P2P,天翻地覆,颠覆性技术横空出世,人们开始正视OVERLAY的威力。

     

           通常,OVERLAY NETWORK要比基础网络简单,至少从复杂性上来说,P2P、ALM这些网络现在还不能与互联网相提并论,以后也不大可能。原因比较简单,基础网络面向大多数应用,提供的是普遍服务,干的是众口难调的事,而OVERLAY NETWORK只服务于特定的业务,不必像春晚那样焦头烂额。

           构造这些覆盖网络的目的是为了支持将消息路由到目的地不由IP地址指定的位置。

           https://zh.wikipedia.org/wiki/%E8%A6%86%E7%9B%96%E7%BD%91%E7%BB%9C

           OVERLAY NETWORK的兴起,说明互联网正在经历一场蜕变。人们不再把互联网看成万能之神,也不打算把它往神不神鬼不鬼的路子上推。越来越多的业务,开始不需要与IP层的地址结构和路由结构绑定,也不再需要看运营商和标准化组织的眼色,在OVERLAY上,电信网络中的很多障碍荡然无存,比如自治域之间的路由策略,可以轻易被OVERLAY ROUTING绕过去。

     

           OVERLAY NETWORK背后的智慧,是把特定的问题从痛苦无比的互联网无穷多目标优化问题中剥离出来,映射到一个独立的平面或空间,在无所羁绊的净室快刀斩乱麻而无需担心伤及无辜。在研究领域,QOS问题聒噪了几十年,从来没有出现过什么有分量的方案,最后,那个学究们认定死路一条的广域网视频传输质量问题,竟然就被OVERLAY NETWORK探囊取物般解决了,我每次抱着IPAD从PPLIVE上看高清大片的时候,都不能不感叹大道至简大智若愚。

     

           OVERLAY NETWORK的玄机,如同回旋镖,看起来绕了个大弯,其实万变不离其宗。IP层路由结构,是一个IP层的端到端FULL MESH结构,端到端的路径,是这个结构里最小粒度的边,这个结构的特点是数据只能在两点之间的直连边上传输,不支持路径级的多跳转发。这种结构的优势,是能够从IP拓扑所蕴含的数量庞大的路径集合中,找出最优路径,而劣势,则是不能充分利用次优路径的多样性以应对故障和异常现象。从这个意义上说,路由结构强调唯一性和最优性,牺牲的是灵活性和多样性,因此适用于稳定的网络环境。这里所说的稳定,一方面是指网络结构稳定,另一方面,是指业务对路径优劣的评价标准稳定。唯一性必然带来片面性,一旦面对多样化的需求,以唯一性为特征的路由结构,就会陷入两难境地。尽管多拓扑、多路径技术可以缓解这一问题,但只要此类问题阈于路由器上解决,就难免会让路由设备在普遍转发服务和个案服务之间疲于奔命。并且,在同一个层面上维护多种路由结构和转发策略本身也不轻松。应用层路由,属于个案服务,属于IP层路由的补充。以IP层的端到端路径为边,根据路径和IP层链路的从属关系,应用层网络中边的粒度,可以小至与IP链路相当,也可以大至包含多条IP链路,就这一点而言,应用层拓扑和IP层路由结构没有本质区别二者的差异,体现在应用层路由可以跨越多条IP层路径,也就是说即便IP层端到端路径构成的FULL MESH结构被破坏,只要以路径为边形成的拓扑仍然连通,就有可能通过应用层路径解决路径中断问题。当然,应用层路由器和IP层路由器的重叠度越高,可恢复性就越好。当二者完全吻合的时候,也就意味着IP层的路径多样性可以完全被应用层路由挖掘出来,反之,则只能挖掘出那些包含了应用层路由器的冗余路径。 因此,应用层路由结构的优劣,可以用冗余覆盖率来表示:

           冗余覆盖率 = 应用层路由结构中包含的路径数量/IP层路由结构中包含的路径数量

    (不知理解的对不对:如A中的进程c与B中的进程c通信,应用层路由结构的路径指中间经过的主机中有进程c处理的路径,而IP层路由结构中包含的路径是指组成路径的主机不管是否有进程c处理的路径)

           这个比例越高,则应用层路由的性能就越好,当然,投资和开销也就越大。其中最佳的平衡点,取决于业务的特性以及网络特性,也就是说,首先要确定应用层路径能够解决问题的程度,比如提供数据转发恢复的成功率;其次,影响这一指标的要素,比如故障模型。以此构造方程求解,可以分析出需要部署节点的数量和位置。比如,网络的故障率越高,则为了达到同样的路径恢复能力,需要部署的应用层路由器节点也就越多。

           因为应用层路由提供的通常是个案服务,也就是面向那些IP层路由满足不了的需求,因此在成本核算上也和IP路由不同。IP路由的特点是薄利多销,虽然构造路由结构是一个高开销高复杂性的工作,但是因为用户的数据转发任务源源不断,因此平摊下来,每用户的开销其实微乎其微。而应用层路由属于三年不开张、开张吃三年类型,如果仍然沿用IP层路由模式,效费比太低,而且复杂性会超过IP层路由。这一点比较诡异,但也不难理解。假设把OSPF协议直接搬到应用层,首先面临的问题就是每个路由器的邻居数量过于庞大,等于节点总数减一,节点有可能被HELLO给噎死。而应用层链路的稳定性,是这条链路对应路径中所有IP链路稳定度百分比的乘积,这一乘,就把稳定度给搞下来了。而最为致命的,是一旦吸上了最X路径优先这口大麻,也就会像IP层路由一样,丧失对多样性的操控能力。有人可能会说,只要让应用层路由采用急速收敛,无论网络如何变化,都能马上找到最优路径,不行吗?答案是不行,因为计算的依据LSDB很难在HELLO噎死的条件下保证实时精确,而即便能保证,在一个稳定性不高的网络中,频繁的重计算也会把骆驼压死。这里有一个非常重要的概念,凡是最优的东西,一定是从众多侯选中挑出来的,只有一个可选项,是无从讨论最优的。而挑选的过程是不是靠谱,全赖两个条件,第一是能不能保证所有有资格的候选项都进入了挑选的范围,第二是挑选的过程是否合理高效。没有这两个条件作为铺垫,像王昭君这样的大美女黯然落榜只能下嫁蛮夷的悲剧就无法避免。

           既然如此,当如何是好?

           方法不复杂,而且早已被AD HOC网络以及P2P网络屡试不爽,那就是概率不够、数量来凑。如果一次命中的可能性不高,多开几枪就行了。早期的加特林机关枪,精度很差,故障率也很高,曾经被嘲笑,但是嘲笑的人忘记了加特林的秘籍——射速。只要单位时间内射出的弹丸数量足够多,命中率和杀伤力就会大幅度提高。后来,性能更加优越的马克沁水冷式机关枪展示时,也被认为是愚蠢的设计,当时李鸿章也在场。只有德国人脑子好使,看出了射速的威力,大量装备陆军,在一次大战中成为与坦克齐名的大杀器。在AD HOC网络中,OSPF之类的路由协议被变幻莫测的网络结构折磨得焦头烂额,而AODV这样的按需发起路有协议却大行其道。AODV的秘诀,就在于以广播方式向外发送路径查询消息,网络结构再动荡,却奈何广播不得,虽然一次查询的开销相当可观,但和维持一个常备路由结构相比,仍然相当廉价。这就是个案服务的优势,虽然每次启动的开销和最终传输的数据量相比明显过大,但只要这些高开销行为在时间轴上稀疏,就不至于把网络压垮。在OVERLAY NETWORK中,通过一次查询消息的齐射,就能够把路径查找的成功率大幅度提升。

     

           其中的技巧,存在于两个方面:

           第一是一次齐射中问讯邻居的数量如何优化。当选取的数量小于最优值时,成功率随问讯邻居数量显著上升,而一旦越过最优值,成功率曲线就变得非常平滑,再增加问讯邻居的数量也是收益甚微。这一点,在很多讨论OVERLAY NETWORK的文章中都得到了实证。

           第二是问讯邻居的位置如何选择。显然,问讯挤成一坨的一组邻居和问讯其中的一个在效果上几乎没有区别,因为从源点到这些密集邻居之间的路径重合度很高,而从这些邻居到目的点路径的重合度也很高。被问讯的邻居之间越是分散则各条路径的交叉性也就越低,IP层路径的冗余性也就能够被越好地挖掘。

     

           这两点虽然看起来独立,其实有很大的关联性,当然在最极端的方案——问讯所有邻居中,邻居之间的位置可以忽略不计。

     

           问讯所有的邻居并非万无一失,如果从源点到目的点之间,不存在等于2跳的应用层路径,这种方式一样会失效。在RESILIENT OVERLAY NETWORK这篇文章中,作者虽然设计了一种能够支持多跳应用层路由的方案,但实验的结果证明只要经过一个中间结点就能够实现应用层的迂回路径。但这个结论只有在网络故障率很低的情况下才能成立。Resilient Overlay Networks以及Improving the Reliability of Internet Paths with One-hop Source Routing这两篇文章对于这种情况进行了更为细致的分析,实验数据表明,针对不同的故障类型,经由一跳转发方式的成功率也表现出差异性,并非总是所向披靡。其中比较重要的影响因素,是应用层节点所连接路由器的度数,度数越大,则应用层节点可用的路径数也就越多,应对故障的能力也就越强。

     

           在RESILIENT OVERLAY NETWORK这篇文章中,作者使用一种类似于OSPF的路由协议来计算和维护应用层转发表,为了避免频繁的路由震荡,作者设计了一种根据应用层链路历史状态累积计算权值的方法,并通过变速探测在探测效率和开销之间寻求平衡。Improving the Reliability of Internet Paths with One-hop Source Routing则代表了另外一种截然不同的设计思想,应用层节点完全不构造和维护路由表,只有在需要的时候才向几个随机选取的邻居发出讯问。Scalable Resilient Overlay Networks Using Destination-Guided Detouring把位置信息作为决策辅助,而位置信息来源于各个节点所计算出的到标志节点的RTT值,并不依赖于GPS或者IP层拓扑,基本的理念和Improving the Reliability of Internet Paths with One-hop Source Routing相同。后两篇文章都没有涉及多跳转发的问题,但他们对于一跳转发问题的分析非常值得借鉴。此外,RON的路由表只能覆盖RON节点,对于RON以外的目的地无能为力,而一跳源路由这种技术就不受此约束,这也是按需服务的好处。正如孙子所说,备前则寡后,备坐则寡右,无所不备则无所不寡。

     

           上述文章都将应用层路由节点部署在边缘网络,独立于运营商,倘若运营商希望借助此技术解决网络生存性等问题,则具备在核心网部署的优势。无论是解决控制平面的可靠性问题,还是为特定业务提供高可靠的转发服务,应用层网络都是一个富有前景的选项。而其中的秘诀,就在于能够将缠斗于一个层面的问题分离到不同的层次隔离解耦。针对此类需求,我们考虑高故障率环境下应用层路由需要考虑的问题可以归纳为以下几点:

           1、网络中存在度值较大的节点,应用层路径的丰富性和优化程度会高于仅在边缘部署的应用层路由技术;

    (注释:图结构中与某节点相连接的边的数目为该节点的度)

           2、由于需要承载控制信息,因此对可靠度的要求很高,需要考虑多跳应用层转发问题,充分挖掘IP路径的多样性;

           3、对时效性要求较高,因此对应用层可用路径查找的效率有要求,需要通过测量保存一部分应用层链路信息,以便查找时先从优质节点入手,提高成功率;

           4、不依赖网络层拓扑信息,保持独立性。

     

           针对上述问题,可以考虑以下设计:

           1、设立地标节点,作为应用层节点定位坐标的基准,利用每个节点的坐标计算节点间相对位置,将避免冗余路径交叉问题映射为寻找相对位置偏离度较大的中间节点问题。举一个简单的例子,位于同一个接入网络中的一组应用层路由器,坐标会非常接近,这些节点到其他节点之间的路径也不会有什么差异性,而当这些节点中的某一个需要查询路由时,也完全没有必要问讯一个窝里的兄弟。在Scalable Resilient Overlay Networks Using Destination-Guided Detouring这篇文章中,作者利用坐标来选取距离目的地最远或最近的节点作为中转节点,这种方法存在明显的缺陷,因为距离并不代表路径重合度,距离目的地最远的节点到目的地的路径上,有可能恰好包含源点,而距离目的地最近的节点,可能就是和目的地位于同一个子网中的节点。但是,通过坐标,可以计算出源点、目的点以及中转节点构成三角形的内角度以及边长,也就很容易判断由“源节点-中转节点”以及“中转节点-目的节点”构成的边与“源节点-目的节点”这条边的偏离程度,偏离程度越大,则路径重叠的可能性也就越低。

     

           但单纯追求路径偏离度也存在隐患,与原始路径不相交叠的路径可能有多条,这些路径都不会受到原始路径中故障或拥塞的影响,因此,偏离度最大的路径反而有可能是这些路径中性能最差的。因此,路径偏离度可以作为筛选候选路径的条件,但不能作为优选的条件。我的想法,是首先筛选出符合数据流QOS特性的中间节点作为查询候选对象,获得应用层路径集合之后,首先按照QOS特性排序,之后利用坐标找出那些路径重叠度高的路径(重叠度如何计算、门限如何设定需要考虑),保留其中负荷最轻者,余者退至备用路径序列的末尾。其中理念,乃是重叠度高的路径,往往是一根绳上的蚂蚱,俱损俱荣,相互之间的可替代性差,而备用路径最重要的属性就是相对于主用路径的可替代性。

           路径重叠度可以从三个方面判断:

           第一是两条路径中相同节点的数量;

           第二是相同链路的数量;

           第三是路径中位置接近的节点数量。

           其中前两条容易判别,但第三条标准很难做到精确判别,因为RTT值与网络拥塞程度等非地理因素密切相关,RTT小固然可以表明位置接近,但RTT大亦未必表明位置疏远,且RTT与网络层位置以及网络拓扑特性(比如随机网络和无标度网络)之间的准确关系还有待利用实测累计经验值,因此误判难以避免,而消弭这种不确定的方法,目前来看,莫过于增加问询节点的数量。

     

           坐标的计算需要定时进行,并结合历史信息计算最新的坐标均值。之所以不以最新的坐标值示人,是因为以RTT为计算依据的坐标本来就不存在精确值,只会围绕某个均值上下浮动,这个均值,从无限大时间尺度衡量,确实是存在的,我们不妨称之为绝对均值。但在有限的时间尺度上,不同时间段的均值会有差异,对于应用层路由而言,有价值的是均值而不是最新值。因为一方面最新值有可能和均值差异巨大却不能持久,反而带来不必要的动荡,另一方面坐标的作用是评价相对位置,在每个节点的坐标都随网络环境变化的情况下,以坐标均值计算出来的相对位置会与实际网络拓扑位置更加吻合。此外,更新后的坐标值,若相对于上一次发布坐标值的变化不超过一定的比例(此比例为可配置变量),则不发布更新,这也是为了避免频繁变化造成的不必要开销,因为每一次计算出来的最新均值倒底和无限大时间尺度上的绝对均值有多少偏离,永远是一个未知数,虽然从大的趋势上来说,越是后计算出的均值和绝对均值之间的差异越小,但不排除在某个时段出现背离的情况。地标节点,可以由连接路由器度值较大的节点充当。为了提高应用层路由的普适性以及扩展性,我不打算让应用层节点了解与其相连路由器的信息,尽管获得网络层拓扑、路由表等信息必会如虎添翼,但和多打几枪相比,成本过于高昂,而且信息的精确性和实时性也难以得到保证。因此,指定地标节点这个步骤就需要依赖人工来完成。

     

           2、以变速方式(测量周期也是可配置变量)探测节点间链路状态。变速体现在两个方面,第一是采用变速检测链路状态,无事则慢速检测,一旦发现异常则进入快速检测,也就是只在需要集中精力的地方集中。第二是在获得各条应用层链路的初步测量结果之后,对高质量链路进行较为快速的探测,对低质量链路进行慢速探测,并不断根据测量结果进行优胜劣汰,更新高质量链路(或高质量邻居节点)集合。维护高质量邻居集合(优质邻居的判别标准以及集合中邻居的数量也是可配置变量)的作用,就如同在地图上区分高速公路和乡间小路,为路由查询提供更好的依据。如果不加区分,每次随机选择邻居进行询问,有可能出现较差路径人品爆发反而胜出的情况,因为在网络中,路径质量好坏是一个统计意义上的指标,高速公路有可能恰好在查询那一刻出现了瞬间的拥堵而令乡间小路胜出,但这并不意味着乡间小路就能够在数据传输阶段仍然优越。

     

           也有人会说按需服务本来就只关心当时的情况,不需要考虑长期特性,因此维护优质邻居集合属于画蛇添足。这种想法的合理性,需要建立在无差别广播基础之上,只有在这种情况下,才能保证当时最优的路径一定会被发现。如果只是向部分邻居节点询问,就必然面临一个基本问题:如何提高查询成功的概率?这个问题又可以表述为:如何提高每一个邻居查询成功的概率?答案不言自明:问讯高质量邻居是也。

     

           让每个节点维护高质量邻居节点集合,并不意味着网络中的每个节点都要遵循统一的链路优劣判别标准,因为互联网中的链路和路径本来就良莠不齐,每个节点所处的环境千差万别,贫富不均,某些节点的所谓优质邻居甚至可能比其他节点的劣质邻居还差,按照统一标准有可能会让某些靠近边缘的节点根本找不到优质的应用层链路。因此,我认为使用相对标准更具有弹性,即每个应用层节点只将它所能探测到的N个最佳邻居放入优质邻居集合。

     

           这么做的隐患,是在一个没有统一评价标准、鱼龙混杂的世界中,有可能仍然无法避免查询齐射命中较差的目标。而解决的方法,可以考虑在每个查询反馈信息中附加应用层链路质量信息,由源节点择优录取,这样既可省去维护全网链路状态之苦,又能保证附加信息的实时性,链路状态检测的速度不必再受制于链路状态更新的速度,也是一种形式的隔离解耦。

     

           3、支持多跳路径查询,可以参照AODV、DSR实施广播控制以及路径缓存。但和AD HOC网络不同的是,OVERLAY NETWORK中节点的位置是固定的,链路的动态性也不像无线链路那么剧烈,应用层路由的稳定性还没有差到朝生暮死的地步,因此并不需要采用极端激进的广播方式,可以将查询扩散的范围限制在优质邻居集合,即源端只向优质邻居发送请求,而收到请求的节点也只向其优质邻居中转请求,避免无限扩散可能造成的劣质路径问题。借助于第二点中提到的附加信息方式,可以避免劣币驱逐良币现象发生。若依照此方法无法找到可用的应用层路径,则跳转至无差别广播方式,死马当成活马医,有盘菜总比没有菜强。至于防止循环广播之类的问题,直接参照AODV DSR现成的方法就行。

     

           4、以业务的QOS需求为依据,对扩散查找得到的多条路径进行筛选,并在数据转发期间维护备用和主用路径信息,以便主用路径故障时快速启动备用路径,备用路径的数量以网络破坏度上限(例如考虑30%破坏度情况,此参数可配置)、主备用路径同时失效概率等参数为计算基准,数据传输结束之后(以某一时间范围内没有监测到数据转发为标准),则不再维护路径信息。若备用路径皆失效,则重新进行路由查找。这一点也和AODV路由缓存的方法一致,只不过由于OVERLAY NETWORK应用的环境比AD HOC网络稳定,因此缓存的时间可以更长。对于应用层路由器来说,缓存路由条目还有一个特殊的意义。在AD HOC网络中,本来就不存在常备的IP层路径,广播路由查询消息的动机多半是因为有数据要发送(如果查询到的路径失效,也会重新发起查询),而不是因为IP层路径受损,因此源节点以外的节点缓存路由条目的作用多半是为了准备不时之需,并没有应对故障这一层的考虑。而本文所讨论的互联网应用层路由,是对于IP层路由结构的补充,触发的动机是IP路由出现了问题,由于应用层路由节点并不维护IP拓扑和路由信息,因此源节点以外的节点无法确知自己到目的点的路径是否也受到了同一个故障的影响,缓存路由条目就有了预防的意思。可以想象,在故障密集的情况下。

     

           5、为了避免优质节点过载,在路径查找阶段,节点负荷(节点转发流量大小)也作为一项依据加以考虑,在同等条件下,优选负荷较轻节点。

           6、在选取路径时,不妨按照以下顺序进行筛选:首先选取QOS最优的路径,若有多条同等路径,则比较这些路径与原始路径的重叠度,优选重叠度最小者,其次比较各条路径包含的应用层跳数,优选跳数最小者,若仍有并列者,则比较各条路径中负荷最大节点承载的流量,优选负荷最小者,若仍有并列候选路径,则随机选择一个作为主用,其他作为备用。备用路径排序,可以参照第1点提到的方法进行。

     

           7、新的应用层节点加入时,如何获悉、维护地标节点信息,如何获得和维护其他节点信息以及其他节点到地标节点的距离信息,节点退出或失效时,如何让其他节点获悉,如何判断一个节点已经失效或退出,如果一个节点维护的其他节点信息无法保证实时精确性,会有什么负面的影响,这种影响是否可以忽略,或者有什么办法可以消除这种负面的影响?这些工程问题,留给开发人员解决。

     

     

    转自:https://blog.csdn.net/u012785382/article/details/70740052

    原文:http://blog.sina.com.cn/s/blog_53ae88130100xya9.html

    展开全文
    qq_36069590 2018-09-30 16:03:36
  • 这对于开发人员和测试人员都非常重要,因为当开发人员生成具有高级别代码覆盖率的代码时,测试团队可以专注于代码是否满足业务目标,而不是被很多低级代码缺陷所困扰。 当代码覆盖量特别重要时 以下情况是代码...

    无论您使用的是敏捷,Rational Unified Process(RUP)还是瀑布式开发方法,对开发期间执行多少代码的度量都是许多开发项目中的关键指标。 这对于开发人员和测试人员都非常重要,因为当开发人员生成具有高级别代码覆盖率的代码时,测试团队可以专注于代码是否满足业务目标,而不是被很多低级代码缺陷所困扰。

    当代码覆盖量特别重要时

    以下情况是代码覆盖率重要时的常见示例:

    • 任何希望响应业务并以低风险方式进行更改的团队
    • 正在开发代码并希望提供其工作质量的可见性或需要满足合同SLA的第三方
    • 当一个项目定义了开发与测试之间的合同时,涉及到开发测试所覆盖的代码量,这意味着测试团队在捕获编码错误上花费的精力更少
    • 希望能够在每个sprint(迭代)结束时制定决策发布代码的敏捷团队,因为这可以提高可交付成果的质量,因此不太可能在准备好将其投入生产之前就将代码移交
    • 希望通过逐步增加单元测试数量和重构代码以减少错误和复杂性来减少技术负担的团队
    • 希望建立度量标准程序以度量质量和技术债务的组织,以便可以发现趋势并尽早进行改进

    许多敏捷团队面临的具体挑战之一是确保其单元测试涵盖大多数代码。 这对于确保开发人员创造尽可能少的缺陷以及代码可以重构至关重要。 (鉴于团队趋向于很少或根本不进行设计的趋势,至关重要的是要补充高质量的单元测试。)关键指标之一(除了所有测试都通过之外,)是拥有的代码量。涵盖了-这就是新版本的IBM®Rational®Application Developer可以提供帮助的地方。

    今年早些时候,我写了一个原型扩展,用于集成IBM®Rational Team Concert™和Rational Application Developer。 如果没有足够的代码覆盖率(如Rational Application Developer中所述),它可以防止将代码交付给Rational Team Concert。 现在,该扩展名为Code Coverage Advisor,已正式合并到Rational Application Developer中,并且可以从8.0.3版开始使用。 这意味着您现在可以配置Rational Application Developer和IBM Rational Team Concert在允许交付代码之前检查您的代码覆盖率。 本文将引导您逐步进行设置,并向您展示如何在项目开发过程中使用它来增加代码覆盖率。

    小费:
    您需要了解Rational Application Developer的一些知识才能关注本文。

    以下各节涵盖了这三个主题:

    1. 何时适合使用Code Coverage Advisor
    2. 当您尝试通过在Rational Application Developer中配置的此额外过程来交付代码时会发生什么?
    3. 如何配置Rational Team Concert以使用顾问程序

    最好使用Code Coverage Advisor的情况

    那么,您应该如何使用顾问? 有两种主要方案:

    • 第一个是用于新项目的 ,要确保单元测试提供足够的代码覆盖率。 在这种情况下,您可以使用顾问来帮助开发团队维持高标准的单元测试和代码覆盖率。
    • 第二个是针对您要改进的单元测试不佳或不存在的项目 。 通过打开顾问程序,将要求开发人员仅针对他们修改的代码提供单元测试,以便这些团队可以以简单,增量和可管理的方式开始进行改进。 同样,这种方法意味着正在编写的单元测试将覆盖正在更改的代码。 因此,它们最有可能发现缺陷。

    在这两种情况下,Code Coverage Advisor可以通过帮助团队保持其单元测试的高级别代码覆盖率来帮助团队提高代码质量,从而提供大量价值。 下一节说明配置代码覆盖功能后,开发人员如何使用Rational Application Developer交付代码。

    使用Rational Application Developer中的新流程交付代码

    您需要做的第一件事(如果尚未完成)是配置您的项目以收集代码覆盖率信息。

    在您的项目中配置流程

    1. 右键单击项目浏览器中的一个或多个项目,然后选择属性。
    2. 然后从菜单中选择Code Coverage ,并按照为团队设置的方式设置项目的Code Coverage信息(请参见图1)。
    图1.项目代码覆盖率配置
    配置了源文件类型和行覆盖率

    当您尝试在启用流程的情况下交付代码时会发生什么?

    配置代码覆盖率后,代码覆盖率顾问将检查文件的覆盖率,以确定是否可以交付代码。 覆盖率顾问将不允许在以下情况下传递代码:

    • 覆盖率低于目标水平。
    • 覆盖范围已过期(例如,您已经修改了其中一个文件,而不重新运行测试)。
    • 没有为项目启用代码覆盖率。

    在这种情况下,将要求开发人员在交付代码之前提高覆盖范围。 但是,如果适当地配置了流程,并且该人员处于具有必要权限的角色中,则开发人员可以选择覆盖警告并以不令人满意的代码覆盖率交付代码。

    让我们来看一个例子。 在图2所示的项目中,您可以看到HelloWorld.java类未满足覆盖率要求。

    图2. Project Explorer显示失败的代码覆盖率
    HelloWorld.java是红色的,代码覆盖率达67%

    如果尝试交付代码,交付将失败,并且您将获得图3所示的流程建议:否决“禁止不令人满意的代码覆盖率”前提条件。

    图3.代码覆盖率交付失败
    处理警告,线路覆盖范围不足

    在Rational Team Concert中设置流程

    在该过程中存储信息意味着所需的覆盖率百分比阈值将集中存储并在团队中平均使用(尽管您可以为不同的组件配置不同的覆盖率要求,这将在后面看到)。 您可以在本地客户端中设置不同的coverage设置,但是在交付代码时将使用基于服务器的设置。

    配置过程

    小费:
    在开始之前,您将需要在项目上具有适当的角色,该角色具有修改项目区域的流程的权限。

    1. 在Eclipse Shell中,导航到“工作项”透视图,然后打开“ 团队工件”视图。
    2. 右键单击要配置的项目区域,然后选择打开
    3. 然后单击Process Configuration选项卡以打开流程编辑器(图4)。
    图4.流程配置编辑器
    角色,项目和团队配置选项
    1. 打开团队配置视图,然后选择操作行为
    2. 向下滚动操作列表,直到找到Deliver(客户端)操作,然后选择Everyone(默认)列下的单元格,如图5所示。
    图5.交付操作
    为每个选定的人交付

    配置足够的代码覆盖率作为前提条件

    现在,您可以配置规则,以检查每次有人交付代码时代码覆盖范围是否足够。

    1. 添加一个前提条件来检查代码覆盖率:
      1. 在先决条件部分中单击Add ,然后选择“ 禁止不满意的代码覆盖率” (请参见图6)。
      2. 配置所需的各种代码覆盖率级别。

    您可以在源代码的各个不同级别上指定所需的覆盖率。 例如,您可能需要每个文件70%的行覆盖率; 但是,开发人员必须为每种类型提供100%的覆盖率。 您还可以提供正则表达式以从覆盖率统计信息中排除文件,如果您有一些自动生成的代码而您不在乎覆盖率,则这很有用。 最后,通过指定这些coverage设置适用于哪些组件,您可以对不同的组件使用不同的规则。

    图6.禁止不令人满意的代码覆盖率配置
    所需覆盖率和组件的对话框窗口
    1. 现在保存该过程,这些新规则将在您下次尝试提供代码时应用。

    翻译自: https://www.ibm.com/developerworks/rational/library/unit-testing-code-coverage/index.html

    展开全文
    cusi77914 2020-07-01 05:30:23
  • 测试覆盖率评价的是测试代码的质量,并不是产品代码的质量 代码覆盖率是一种白盒测试,因为测试覆盖率是评价产品代码类内部的指标,而不是评价系统接口或规约。测试覆盖率尤其用于评价测试代码是否已经覆盖了产品...

    用途

    测试覆盖率评价的是测试代码的质量,并不是产品代码的质量
    代码覆盖率是一种白盒测试,因为测试覆盖率是评价产品代码类内部的指标,而不是评价系统接口或规约。测试覆盖率尤其用于评价测试代码是否已经覆盖了产品代码所有的路径。

    分类

    类的覆盖率:类覆盖描熟了项目中多少类已被测试套件访问。  
    方法覆盖率:方法覆盖率是被访问的方法的百分比。 
    语句覆盖率:语句覆盖率追踪单条源代码语句的调用。 
    语句块覆盖率:语句快覆盖率将语句块作为基本的覆盖律单元。 
    分支覆盖率:分支覆盖率也被称为判断覆盖率。指标计算哪些代码分支被执行。


    代码的覆盖深度:从覆盖源程序语句的详尽程度分析,逻辑覆盖标准包括以下不同的覆盖
    标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正判定条件覆
    盖。 参考:http://bbs.51testing.com/thread-74208-1-1.html

      ·语句覆盖为了暴露程序中的错误,程序中的每条语句至少应该执行一次。因此语句覆
    盖(Statement Coverage)的含义是:选择足够多的测试数据,使被测程序中每条语句至少执
    行一次。语句覆盖是很弱的逻辑覆盖。

      ·判定覆盖 比语句覆盖稍强的覆盖标准是判定覆盖(Decision Coverage)。判定覆盖的
    含义是:设计足够的测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,
    或者说使得程序中的每一个取“真”分支和取“假”分支至少经历一次,因此判定覆盖又称为
    分支覆盖。

      ·条件覆盖在设计程序中,一个判定语句是由多个条件组合而成的复合判定。为了更彻
    底地实现逻辑覆盖,可以采用条件覆盖(Condition Coverage)的标准。条件覆盖的含义是:
    构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。

      ·多条件覆盖多条件覆盖也称条件组合覆盖,它的含义是:设计足够的测试用例,使得
    每个判定中条件的各种可能组合都至少出现一次。显然满足多条件覆盖的测试用例是一定满足
    判定覆盖、条件覆盖和条件判定组合覆盖的。

      ·修正条件判定覆盖修正条件判定覆盖是由欧美的航空/航天制造厂商和使用单位联合制
    定的“航空运输和装备系统软件认证标准”,目前在国外的国防、航空航天领域应用广泛。这
    个覆盖度量需要足够的测试用例来确定各个条件能够影响到包含的判定的结果。它要求满足两
    个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定
    到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(and、
    or)连接的布尔条件,每个条件对于判定的结果值是独立的。

    覆盖率工具 

    Clover(商用)、EMMA和Cobertura,  JaCoCo

    特点/工具CoberturaEmmajacoco

    http://rensanning.iteye.com/blog/2002371
    http://blog.csdn.net/smile0102/article/details/48688763
    集成一个与Junit集成的代码覆盖率测量工具

    可以与Ant和Maven集成,也可以通过命令行调用
    可以统计几种覆盖率:class,method,block, line。支持版本迭代的覆盖率统计

    免费且开源的Java代码覆盖率测试工具,100%纯Java编写,不依赖与任何第三方库
    (Java Code Coverage)是开源的Java代码覆盖率测试library
    可以集成到ANT、Maven等build工具中。它采用标准的JVM Tool Interface。把JaCoCo agent 加入到JVM后启动,加载到JVM中的class具体被执行了哪些代码行将会被记录下来,JaCoCo搜集这些执行信息直到JVM结束后生成静态报告。
    开源免费、开源的免费、开源的免费、开源的
    报告形式

    可以生成HTML或XML格式的报告

    可以按照不同的标准对HTML结果进行排序

    提供了多种格式的报告,包括纯文本,HTML和XML,所有的报告都可以进行详细设置以获得定制报告 
    覆盖率统计为每个类、包以及整个项目计算所覆盖的代码行与代码分支的百分比例支持对类,方法,代码行和基本的分支语句的覆盖率测试

    使用EMMA时,不需要获得源代码就可进行覆盖率测试,此外,EMMA还支持对整个jar文件测试。
     
        
        
    注释:

    在Java测试覆盖率工具上,还有一个更加简单的工具:EclEmma(推荐,EclEmma是一个基于EMMA的Java代码覆盖工具) ,它可以很方便的与Eclipse集成,然后可以直接run,显示出代码覆盖率,其地址是:http://www.eclemma.org/


    错误认识

    为覆盖率而设计是错误得的,有一点:有覆盖率统计,好过没有 

    功能测试代码覆盖率统计工具-EMMA

    原理:

     仅仅支持JDK7,如果JDK8,需要选择如jacoco等工具。

    脚本的编写:
    http://tianya23.blog.51cto.com/1081650/364094

    EMMA 所使用的字节码插装 不仅保证 EMMA 不会给源代码带来“脏代码”,还确保 EMMA 摆脱了源代码的束缚,这一特点使 EMMA 应用于功能测试成为了可能。

    大多数功能测试中,测试人员一般不能直接得到被测源代码,源代码也不是测试人员关心的重点。在具体的测试过程中,功能测试人员一般以一个有意义的功能模块作为测试关心的重点,而能够反映一定功能含义的类和方法的覆盖率在功能测试中更有价值。因此,在功能测试中,类覆盖率和方法覆盖率是测试人员关心的重点,行和块覆盖率则作为测试的参考。

    测试覆盖率报告中包含了两个方面的内容,测试覆盖的部分和未被测试覆盖的部分。尽管百分之百的测试覆盖率不能代表被测对象完全没有问题,但是测试覆盖的部分以及覆盖比率可以增加测试者对测试工作的信心,指导测试执行以及测试的方向。另一方面,当测试用例执行出现异常时,针对每个测试用例的测试报告还可以提供可疑代码的范围,为代码纠错提供帮助。

    测试覆盖率报告中未覆盖的部分也同样有价值:

    • 表明测试可能不完整,有些功能、代码没有被测试覆盖到。
    • 为测试用例的设计提供指导建议。在覆盖率报告的指导下,测试人员有目的地与开发人员进行讨论,确定未覆盖部分是测试的空白还是不需要测试的部分。
    • 帮助开发人员发现无用代码,为修改,完善代码提供依据。

    在使用 EMMA 获得测试覆盖率过程中,类、方法等覆盖的百分比报告,可以方便测试人员更好的评估测试。测试人员通过对照覆盖率报告与测试用例设计文档,需求文档可以迅速找到测试的不足。通过与开发人员进行讨论,可以更好的评估测试力度,并指导进一步的测试。因此在功能测试中引入覆盖率信息,能够完善测试结果报告,确保测试质量和力度,保证测试按质、按量地完成。


    EMMA 使用

    EMMA基本是四步曲:插桩(instr),运行,收集(ctl),报告(report)

    版本0:http://www.ibm.com/developerworks/cn/opensource/os-cn-emma/

    插装被测组件

    EMMA 通过对被测组件进行插装来跟踪被测组件的执行过程。测试人员应首先和开发人员讨论,确定哪一部分包含了符合插装要求的文件( Java 文件),哪一部分需要考虑覆盖率信息,然后选择合适的方式进行插装。

    • 插装准备

    在执行插装操作之前,首先应该扩展 Java 虚拟机,即将 emma.jar 放到被测组件运行使用的JRE 目录下面作为 JRE 的扩展,以便 EMMA 能够被调用。 emma.jar 包含了 EMMA 核心功能模块的实现和 EMMA 运行时所需的类文件,这些文件是使用 EMMA 所必需的。

    由于示例被测组件运行在 Websphere Portal Server 中,并使用默认的 JRE 运行,因此将emma.jar 放到 “/opt/WebSphere/PortalServer/java/jre/lib/ext” 下面。在实际的测试中,将该路径进行相应的替换。

    • 插装
    EMMA 中提供了 “instr” 命令完成插装操作。插装操作可以面向 JAR 包、 WAR 包、 WAR 包、类文件和目录,选择合适的命令进行插装可以使插装过程变得简便。

    清单 1. 对类文件插装命令
    /opt/WebSphere/PortalServer/java/jre/bin/java emma instr -m overwrite -ip 
    /opt/WebSphere/PortalServer/installedApps/NumberQuizWEB_10yggsru.ear/NumberQuizWEB.war/WEB
    -INF/classes -Dmetadata.out.file=/root/emma/Number_coverage.em
    
    • 合并元数据

    完成插装操作以后,在指定的路径下会产生一些名为 “*coverage.em” 的文件,这些文件保存了插装的元信息,这些信息主要是记录插装过程中的插装点在被测代码中的位置。如果在插装过程中,指定这些文件到同一文件的话, EMMA 默认将元数据进行合并。如果测试人员未指定路径,或者希望得到独立的元文件,这些文件将分别产生在默认或指定的目录下。测试人员还可以通过使用 “merge” 命令手动将这些元文件进行合并,保证生成的覆盖率报表的全面性。注意:合并操作不支持逆向操作。

    清单 5. 合并元数据命令
    /opt/WebSphere/PortalServer/java/jre/bin/java emma merge 
    -input <path1>/coverage1.em,<path2>/coverage.em -out <path>/coverage2.em

    完成上面的操作以后,就已经完成了收集覆盖率信息的准备工作。接下来测试人员可以进行正常的测试工作,在运行测试的过程中, EMMA 将跟踪并记录执行轨迹,得到覆盖率信息。

    运行测试用例,得到覆盖率报告

    完成插装工作以后,测试人员可以按照测试计划运行测试用例。 EMMA 将在测试执行的过程中记录代码执行信息并将结果记录在内存中。每次当 JVM 停止时,内存中记录的执行信息将被清除并被保存到 “*.ec” 的文件中。但是在实际测试的过程中, JVM 的停止很难控制,因此测试人员可以定时手动将内存中执行信息写出。在这种情况下,内存中的记录被输出,但是内存中的内容不被清除。

    从本地收集覆盖率信息
    /opt/WebSphere/PortalServer/java/jre/bin/java -cp emma.jar emma ctl -connect 
    auscsdpfvtvm15.bto.ibm.com:47653 -command coverage.get,/root/emma/Number_coverage.ec
    
    EMMA: processing control command sequence 
    EMMA: executing [coverage.get (/root/emma/Number_coverage.ec,true,true)] 
    EMMA: coverage.get: local copy of coverage data merged into 
              [/root/emma/Number_coverage.ec] {in 39 ms}
    EMMA: coverage.get: command completed in 79 ms
    EMMA: control command sequence complete

    这样收集到的信息被保存在 “coverage.ec” 中, “coverage.ec” 是二进制格式的文件,因此很难被用来查看覆盖率结果。

    生成覆盖率报告
    /opt/WebSphere/PortalServer/java/jre/bin/java -cp emma.jar emma report -r html -in
     /root/emma/Number_coverage.em,/root/emma/Number_coverage.ec -
    Dreport.html.out.file=/root/emma/Number_coverage.html -Dreport.metrics=class:80
    (,method:75)

    在生成覆盖率报告的过程中,测试人员可以根据测试要求通过 “Dreport.metrics” 参数设定满意的覆盖率标准。在示例命令中设定了类覆盖率的满意度为80%。

    测试报告可以以 HTML ,文本和 XML 三种格式输出。

    合并覆盖率结果

    完成所用的测试用例后,测试覆盖信息可以被合并在一起,得到整个测试的覆盖报告。覆盖率结果文件通过 “merge” 命令合并 “*.ec” 文件实现的。

    另外,由于 EMMA 中测试覆盖率是通过与 “*.em” 文件关联获得代码信息的,因此当代码发生变化时,已经运行过的测试不必完全重复,只需将得到的 “*.ec” 文件合并(新得到的 “*.ec” 文件放在后面),然后关联最新的 “*.em” 文件即可得到代码变化后的覆盖率信息,这方便了 EMMA 支持版本变化的测试。在生成新的测试报告的时候,需要注意 “*.ec” 的时间一定要晚于 “*.em” 文件。

    清单 9. 合并覆盖率结果命令
    /opt/WebSphere/PortalServer/java/jre/bin/java emma merge 
    –input coverage1.ec,coverage2.ec,coverage3.ec –output coverage.ec

    如果在生成测试报告的时候,如果出现 “com.vladium.emma.EMMARuntimeException: [CLASS_STAMP_MISMATCH] runtime version of class in the coverage data is not consistent with the version of this class in the metadata, possibly because stale metadata is being used for report generation” 错误,说明在生成新的 “*.em” 前后代码曾经被修改过,并且被修改的代码所在的类文件在新的测试中没有被覆盖到,这就需要重新执行这部分测试,保证修改过的部分被重新执行。



    版本1:

    注意:
    1)emma2.0版本不提供ctl命令,请下载最新的2.1.5320进行测试。
    2)对于WEB应用的代码覆盖,需要确认开发人员是将用到的类,放到了WEB-INF/classes目录下还是打成jar包的形式,如果是前者参考监控JAVA WEB程序,如果是后者参考监控JAVA后台程序
    3) 支持条件覆盖
    在EMMA的测试报告中,目前看不出来,如果关联了代码,。对于if(a||b)这样的语句,如果只满足a套件,那么emma只会把标为黄色,表示部分覆盖。
    版本2:

    监控JAVA后台程序

    1、将emma.jar放到$JAVA_HONE/jre/lib/ext目录下
    2、java emma instr -m overwrite -cp /root/VDS-2.0/lib/VDS-2.0.jar -Dmetadata.out.file=vds.em
    3、启动VDS,在启动VDS时,/root/VDS-2.0/bin/startup.sh

    4、运行功能测试用例

    5、收集数据:java  emma ctl -connect localhost:47653 -command coverage.get,/root/dingbs/tool/emma/vds.ec

    6、转换结果:java -cp emma.jar emma report -r html -in /root/dingbs/tool/emma/vds.em,/root/dingbs/tool/emma/vds.ec -Dreport.html.out.file=/root/dinbs/tool/emma/vds.html

    监控JAVA WEB程序

       WEB程序部署到Tomcat或者SunOne后,都会将war文件进行解压缩,因此我们监控的为里面的class文件

    1、启动emma[root@msspora tool]# java emma instr -m overwrite -ip /root/apache-tomcat-6.0.10/webapps/CMCC/WEB-INF/classes -Dmetadata.out.file=webcmcc.em

    2、启动Tomcat,/root/apache-tomcat/bin/startup.sh

    3、使用IE进行功能测试

    4、收集数据:java  emma ctl -connect localhost:47653 -command coverage.get,/root/dingbs/tool/emma/webcmcc.ec

    5、转换结果:java -cp emma.jar emma report -r html -in /root/dingbs/tool/emma/webcmcc.em,/root/dingbs/tool/emma/webcmcc.ec -Dreport.html.out.file=/root/dinbs/tool/emma/webcmcc.html


    版本3:http://blog.csdn.net/u012245006/article/details/50299337



    把emma.jar放到示例工程项目lib目录下;
    Emma.jar放置路径为:C:\apache-tomcat-6.0.29\webapps\jspxcms\WEB-INF\lib


    EMMA生成文件目录:




    插桩生成的二进制文件:jspxcms_coverage.em




    收集覆盖率信息生成的二进制文件:jspxcms_coverage.ec




    生成覆盖率报告的文件:jspxcms_coverage.html


    插桩


    插桩前,启动应用服务。




    在命令窗口中cd C:/Program Files/Java/jre6/bin/




    (或直接配置emma.jar的classpath环境变量)




    运行


    确保emma.jar已放在tomcat部署JSPXCMS的lib目录下,一般情况下,直接运行应用程序即可。EMMA会启动一个监听端口,用来后面收集信息(ctl)。这个端口是固定的,47653。


    启动TOMCAT:


    打开JSPXCMS网站,执行一系列功能测试操作。


    收集


    执行收集命令前,应用服务需保持启用状态。


    本地覆盖率数据收集命令:


    收集成功显示: 收集到的信息被保存在 “coverage.ec” 中。


    打开jspxcms_coverage.html,覆盖率的报告是以包、类、方法三级单位组织的。其中红颜色代表该覆盖率未达到满意的覆盖率标准

    版本4:


    http://lishiguang.iteye.com/blog/1123641


    可以怎么用EMMA 


    On-the-fly 模式 
    Offline 模式 
    使用emma基本步骤 
    1、插装字节码到想要测试覆盖率的文件-> 生成coverage.em 文件 
    插装操作可以面向 JAR 包、 WAR 包、 WAR 包、类文件和目录 
    2、按正常的工作流程启动服务器,测试程序。 
    3、收集覆盖率信息->生成coverage.ec文件 
    可以在本机收集,也可以从远程机器收集 
    4、生成覆盖率报告->通过coverage.em 和 coverage.ec文件 

    jacoco

    原理:

    JaCoCo(Java Code Coverage)是开源的Java代码覆盖率测试library,它可以集成到ANT、Maven等build工具中。它采用标准的JVM Tool Interface,并提供了EclEmma Eclipse插件,也可以使用Java Agent技术监控Java程序。【很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins、IDEA. 】把JaCoCo agent 加入到JVM后启动,加载到JVM中的class具体被执行了哪些代码行将会被记录下来,JaCoCo搜集这些执行信息直到JVM结束后生成静态报告。


    • 注入方式介绍

    JaCoCo同时支持on-the-fly和offline的两种插桩模式。

    On-the-fly插桩:

    JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。

    Offline模式:

    在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。

    On-the-fly和offline比较:

    On-the-fly模式更方便简单进行代码覆盖分析,无需提前进行字节码插桩,无需考虑classpath 的设置。

    存在如下情况不适合on-the-fly,需要采用offline提前对字节码插桩:

    (1)运行环境不支持java agent。

    (2)部署环境不允许设置JVM参数。

    (3)字节码需要被转换成其他的虚拟机如Android Dalvik VM。

    (4)动态修改字节码过程中和其他agent冲突。

    (5)无法自定义用户加载类。

    覆盖率在实际在项目中的主要实施点:



    • 确定插装方式:

    Android项目只能使用JaCoCo的离线插桩方式。

    为什么?主要是因为Android覆盖率的特殊性:

    一般运行在服务器java程序的插桩可以在加载class文件进行,运用java Agent的机制,可以理解成"实时插桩"。JaCoCo提供了自己的Agent,完成插桩的同时,还提供了丰富的dump输出机制,如File,Tcp Server,Tcp Client。覆盖率信息可以通过文件或是Tcp的形式输出。这样外部程序可很方便随时拿到被测程序的覆盖率。

    但是Android系统破坏了JaCoCo这种便利性,原因有两个:

    (1)Android虚拟机不同与服务器上的JVM,它所支持的字节码必须经过处理支持Android Dalvik等专用虚拟机,所以插桩必须在处理之前完成,即离线插桩模式。

    (2)Android虚拟机没有配置JVM 配置项的机制,所以应用启动时没有机会直接配置dump输出方式

    Jacoco包含了多种尺度的覆盖率计数器:

    包含指令级(Instructions,C0 coverage),分支(Branches,C1 coverage)、圈复杂度(Cyclomatic Complexity)、行(Lines)、方法(non-abstract methods)、类(classes)。

    行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。

    类覆盖率:度量计算class类文件是否被执行。

    分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。

    方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。

    指令覆盖:计数单元是单个java二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。

    圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。

    • 没有覆盖:这一行中没有指令被执行(红色背景)
    • 部分覆盖:这一行中只有一部分指令被执行(黄色背景)
    • 完全覆盖:这一行中所有指令都被覆盖(绿色背景



    启动JVM时添加VM参数:

    tomcat 增加VM参数:
    对于tomcat,在catalina.sh的JAVA_OPTS配置中增加:

    -javaagent:/home/work/local/jacoco/lib/jacocoagent.jar=includes=com.xxx.*

    其中 includes:表示针对指定的class进行覆盖率数据收集,
    其他参数: append=true/false:每一次收集的覆盖率数据是追加还是替换,不设置默认为true 
    destfile=jacoco.exec:dump出来的覆盖率数据文件
    output=file/tcpserver/tcpclient:覆盖率数据输出的形式,分别为file,tcpserver和tcpclient,file是比较简单的方式,tcp的方式可支持自行开发获取覆盖率数据的工具。不设置默认是file。

    • shutdown jvm时dump出覆盖率数据
    注意采用output=file的方式下,是在jvm停掉时将覆盖率数据dump出来到文件,在shutdown tomcat后不能kill -9 java,只杀掉tomcat进程,否则数据收集无效。生成覆盖率数据需要ant执行,dump出的exec文件之后,就会在指定路径输出html格式覆盖率报告。

    • 不停jvm dump出覆盖率数据
    在配置JAVA_OPTS的参数时,修改如下:

    -javaagent:/home/work/local/jacoco/jacocoagent.jar=includes=com.xx.*,output=tcpserver,port=10001,address=100.100.100.100


    这样的方式下启动tomcat之后,jacoco会在一个端口上提供client访问,并能dump出此时的覆盖率数据文件,dump的方式仍然是ant执行。需要配置server的ip和端口,执行ant dump,输出的还是exec文件,再执行ant jacoco会生成html报告
     

    • (一) tomcat + jacoco 配置 实例:

    执行jvm的时候,加上对应的参数javaagent参数,即开启了on-the-fly instrument 方式,在执行程序的时候记录执行的代码覆盖数据。针对于tomcat,我们只需要修改${tomcat.home}/bin/catalina.sh 中的:

     JAVA_OPTS="$JAVA_OPTS -javaagent:/Users/Downloads/jacoco/jacocoagent.jar=includes=*,output=tcpserver,port=2014,address=tomcat IP,append=false"
    ANT build.xml:
     <!--dump任务:
         根据前面配置的ip地址,和端口号,
         访问目标tomcat服务,并生成.exec文件。-->
     <target name="dump">
         <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="false"/>
     </target>
     
     <!--jacoco任务:
         根据前面配置的源代码路径和.class文件路径,
         根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
     <target name="report" depends="dump">
         
      <delete dir="${reportfolderPath}" />
       <mkdir dir="${reportfolderPath}" />
         <jacoco:report>
             <executiondata>
                 <file file="${jacocoexecPath}" />
             </executiondata>
                 
             <structure name="JaCoCo Report">
                 <group name="Check Order related">           
                     <classfiles>
                         <fileset dir="${checkOrderClasspath}" />
                     </classfiles>
                     <sourcefiles encoding="UTF-8">
                         <fileset dir="${checkOrderSrcpath}" />
                     </sourcefiles>
                 </group>
             </structure>


             <html destdir="${reportfolderPath}" encoding="utf-8" />  
          <csv destfile="${reportfolderPath}/coverage-report.csv" />  
          <xml destfile="${reportfolderPath}/coverage-report.xml" /> 
         </jacoco:report>
     </target>

    注释:
    - javaagent : / home / tomcat / lihao / jacoco / lib / jacocoagent . jar = destfile = / tmp / jacoco . exec
    重新启动tomcat:启动后,我们查看ps –ef|grep tomcat
    如果看到 –javaagent的参数加入成功后,那么我们就可以看到 file /tmp/jacoco.exec 这个文件已经存在了。 这个文件就是执行程序时记录的代码覆盖记录。

    • (二)jboss + jacoco
    详细配置参考:
    注意:
    文件读取权限的问题,jboss启动的java进程时用nobody这个用户启动的,它对/root/下的东西没有读取权限的
    当使用acoco的client端去远程连接server端时,一直报“connection refused”的错误,后来发现时jacocoagent启动时默认限制了仅有本地地址127.0.0.1才能连接这个server端的端口;需要在JVM启动的avaagent (jacocoagent)时制定address参数。

    • (三) jetty + jacoco

    To enable Jacoco in Jetty, we need to do the following steps:

    1. Download the Jacoco agent
    2. Enable the Java agent in Jetty
    3. Enable the reporting in Maven

    Download the Jacoco agent.

    The latest version of the Jacoco agent can be downloaded here. In the downloaded jar is another jar, the jacocoagent.jar, which is needed to do online instrumenting of classes.

    Enable the Java agent in Jetty.
    Once the Jacoco Agent has been downloaded, Jetty needs to be made aware of this. To do this, Jetty needs to be passed the -javaagent parameter. The easiest way to do this is by setting the MAVEN_OPTS environment variable in the following way:

    -javaagent:lib/jacocoagent-0.6.3.jar

    Alternatively, you can also pass parameters to the -javaagent setting, like this:

    -javaagent:lib/jacocoagent-0.6.3.jar=destfile=target/jacoco.exec,append=false,includes=nl.*"

    覆盖率报告:

    执行完成后会在工程根目录下生成jacoco.exec文件----ant/maven等等 ,将*.exec转换成html报告



    展开全文
    wodeyijia911 2016-08-07 12:41:55
  • 1、描述:自组织、对等式、多跳无线移动通信网络 2、举例:蜂窝移动通信网络、WLAN 3、特点 (1)具备移动通信网络和计算机网络的特点 (2)网络拓扑动态变化:用户终端随意移动、节点的开机/关机、无线信道间...

    一、移动Ad Hoc网络概述
    1、描述:自组织、对等式、多跳无线移动通信网络
    2、举例:蜂窝移动通信网络、WLAN
    3、特点
    (1)具备移动通信网络和计算机网络的特点
    (2)网络拓扑动态变化:用户终端随意移动、节点的开机/关机、无线信道间互相干扰
    (3)多跳组网方式:中间节点参与分组转发,能有效降低对无线传输设备的设计难度和成本,同时扩大了自组网络的覆盖范围
    (4)有限的无线传输带宽:竞争共享无线信道产生的碰撞
    信号衰落、噪声干扰以及信道之间干扰
    (5)移动终端的自主性:移动终端之间存在某种协同工作关系,每个终端都将承担为其它终端进行分组转发的义务
    (6)安全性差、网络的可扩展性不强、存在单向的无线信道、生存时间短
    4、与常规移动通信网络比较
    不需要网络通信基础设施支持、不依赖基站进行通信、数据通信业务为主、拓扑结构动态变化
    5、与传统固定网络比较
    网络规模相对较小、网络的拓扑结构比较简单、网络拓扑结构快速变化
    6、与分组无线网、无线局域网、红外网络比较
    单跳与多跳(WLAN、红外网络都是单跳网络,不存在路由问题)、研究重点不同(Ad hoc网络的研究内容主要以路由协议为核心的网络层设计)、通信模式不同(ad hoc移动终端的通信是对等的)
    7、影响ad hoc网络的主要因素
    (1)无线通信技术
    受限于底层无线通信技术的性能(传输率、延迟、吞吐量)
    (2)节点密度
    密度越高传输路径的跳数越多,受网络拓扑变化的影响就越明显。
    (3)节点移动速度
    速度越高节点间的拓扑结构的稳定性越差,路由计算和交换负载越大。
    (4)通信负荷和通信模式
    流量特性和分布将直接影响到网络的吞吐性能。

    二、移动Ad Hoc网络网络层
    1、平面结构
    (1)特点:所有节点的地位平等
    (2)优点:简单、健壮、相对安全、节点覆盖范围较小
    (3)缺点:路由开销大、可扩充性差
    2、多层体系结构
    (1)特点:网络被划分为簇,每个簇由一个簇头和多个簇成员组成,簇头可形成更高一级的网络。
    (2)异构网络:移动节点的计算能力和能量不等
    (3)优点:Cluster成员功能简单、路由信息局部化、减少路由协议开销、节点定位简单、可扩展性好、抗毁性好
    (4)缺点:Closter头是瓶颈
    3、Ad hoc路由
    (1)面临的困难
    路由信息不易获得、路由信息不完整、网络的所有节点路由信息可能过期
    (2)对协议的要求
    收敛迅速、提供无环路由、避免无穷计算、控制管理开销小、对终端性能无过高要求、支持单向信道、尽量简单实用、路由机制必须适应网络三个不断变化的基本特征
    4、Ad hoc路由协议
    (1)分类:平面路由、层次路由、地理信息辅助路由
    (2)按需路由协议
    a、反应式路由:在源端需要时候通过路由发现过程来确定路由
    b、两种实现技术:源路由(报文头携带完整的路由信息):hop-hop路由
    c、举例:DSR、AODV
    (3)表驱动路由
    a、先应式路由
    b、所有路由都已经存在并且随时可用、路由请求的延迟低、开销高
    c、举例:OLSR、TBRPF
    (4)分级路由协议
    a、层次式(hierarchical)路由
    b、优点:降低大型网络的存储要求、在全局传播的路由信息较少、有限的链路状态维护、按需建立路由、具有较好的伸缩性
    c、缺点:移动管理比较复杂、节点间负载不均衡、可靠性受影响
    d、举例:ZRP
    (5)DSDV协议
    a、优点:非常简单、通过目的地赋予的序号值来防止出现路由回环、不存在路由发现带来的延迟
    b、缺点
    没有节点睡眠、存在开销
    (6)优化的链路状态路由协议(OLSR)
    (7)基于拓扑广播的逆向路径转发(TBRPF)
    (8)动态源路由协议(DSR)
    a、优点:节点不需要周期性地发送路由广播分组、无须维持到全网所有节点的路由信息、仅需要维护路径上节点之间的路由、能完全地消除路由环路、能同时提供多条路由、可用于单向信道、中间节点的应答使源节点快速获得路由
    b、缺点:会引起过时路由问题、每个分组都需要携带完整的路由信息
    (9)AODV路由协议
    使用分布式的、基于路由表的路由方式
    (10)分区路由协议(ZRP)
    域内路由协议(IARP)、域间路由协议(IERP)
    a、总结:只允许目的域内的节点应答,延长了源节点获得路由的时间;需要周期性地广播分组,需要消耗一定的电源能量和网络带宽;路由域半径的设置将直接影响路由的效率。混合的独立域路由框架支持节点非统一的独立配置;每个节点可动态自动配置自己的优化域半径;能适应网络的时空特性,改进效率;自适应的架构重构能力使得在网络特性的变化方面更加鲁棒;自适应、有效以及鲁棒性使得协议具有很好的扩展性

    三、移动Ad Hoc网络MAC层
    1、“隐藏”节点问题
    2、“暴露”终端问题
    3、竞争协议
    (1)描述:使用直接竞争来决定信道访问权,通过重传机制解决碰撞问题。
    (2)举例:ALOHA协议、载波侦听多址访问协议(CSMA)、基于控制分组握手的访问控制协议、 忙音类多址访问协议。
    4、分配类协议:
    (1)静态分配协议:集中式传输时间安排算法,事先为每个节点静态地分配一个固定的传输时间安排。
    (2)动态分配协议:使用分布式传输时间安排算法,按需计算传输时间安排。
    (3)举例:时分多址访问协议(TDMA)、五步预留协议(FPRP) 、跳频预留多址访问协议(HRMA)
    5、混合类协议
    (1)混合时分多址访问协议(HTDMA)描述:将时间划分成若干个时隙,其中第一个时隙为公共竞争时隙,全网在该时隙内竞争其他时隙的使用权,竞争采用CSMA和RTS/CTS方式相结合进行,竞争时隙结束后各个节点按照竞争的结果在各个时隙进行发送、接收或者相应的退避。在通信结束之后,通信双方将占用时隙进行释放。
    (2)举例:TDMA和CSMA的混合协议、ADAPT协议、ABROAD协议、AGENT协议、Meta-协议

    展开全文
    zh13487 2019-06-07 10:52:16
  • qq_36554582 2020-05-06 21:47:31
  • GitChat 2017-11-03 00:00:00
  • shangsongwww 2019-05-10 10:31:33
  • sysmedia 2016-12-13 14:43:41
  • Eastmount 2020-05-11 18:10:35
  • Jason_Beiying 2018-04-30 10:03:27
  • zfs1994 2016-10-03 20:08:28
  • GarfieldEr007 2017-01-09 23:02:15
  • kaka1121 2017-02-16 16:55:29
  • lxm5071 2018-02-12 16:03:25
  • dm_vincent 2016-07-03 16:47:23
  • Eastmount 2021-09-10 20:50:58
  • valada 2018-11-22 16:56:07
  • gc_cg 2016-11-15 15:45:25
  • lykangjia 2017-03-06 14:37:28
  • np4rHI455vg29y2 2018-02-01 00:00:00
  • yaoqiang2011 2013-09-14 15:58:59
  • GUA8122HOU 2020-11-26 18:08:35
  • hebtu666 2021-04-13 12:37:49
  • hunter___ 2018-10-30 15:21:44
  • a724888 2017-03-08 09:40:54
  • carolzhang8406 2017-03-17 16:37:03
  • sinat_37967865 2019-12-03 17:24:15
  • weixin_39032019 2021-08-18 14:17:32
  • u012245006 2015-12-14 19:18:08
  • qq_36894974 2020-03-31 19:13:39

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 171,907
精华内容 68,762
关键字:

两新组织两个覆盖是