代码覆盖从简到繁 (二) – Block Coverage

代码覆盖从简 ()划分Block       上一篇博客 《代码覆盖从简 ()Block Coverage》介绍了Visual Studio所采用的Block覆盖Block是如何定义的,并且展示了代码行与Block之间其实并不是严格对应的。本篇博客将通过.NET中间语言(IL)进一步分析Visual Studio是如何划分Block的,从而更准确回答代码行与Block不能严格对应的原因。      使用Visua 阅读详情

      自从上一篇博客 代码覆盖率 (Code Coverage)从简到繁 (一)以来,很久没有再写相关的内容了,今天再继续一篇,呵呵!我们知道,根据覆盖度量单元的不同,代码覆盖可以分为很多种,如:语句覆盖、判定覆盖、条件覆盖、路径覆盖等等,Visual Studio(2005,2008 和 2010)系列工具中所采用的是语句覆盖(statement coverage),也被称为block coverage。相对于其它覆盖而言,block覆盖操作和分析简单,是实际工程中比较常用的一种覆盖测试工具。那么究竟一个block是如何定义的呢? block与代码行之间存在着对应关系吗?先来看看下面一个例子:

      首先,自定义一个简单的C#函数GetInteger() 作为接下来被测试和代码覆盖收集的对象:

      然后, 针对这个GetInteger编写一个简单的单元测试用例,输入的数据组合为 (arg1=1, arg2=-1)
 
        下面执行GetIntegerTest测试,看看这个用例到底覆盖了GetInteger中的哪些代码。执行的代码覆盖结果如下图所示:imageVisual Studio使用不同的颜色来区分不同的覆盖结果:
  • 淡蓝色:表示整行代码都被执行到了;
  • 米色: 表示这行中的部分block被执行了;
  • 红棕色:表示整行代码都没有被执行;

      通过上面的米色未完全覆盖行 – if(arg1 >0 && arg2 < 0),我们可以看出同一行代码不一定属于同一个block,有可能一个代码行中包含了多个block。那么可不可以说同一个block的内容一定全在同一行上?要回答这个问题,我们可以先看一下Visual Studio到底将GetInteger划分几个block。

 

      

      通过上面的Code Coverage窗口中显示的覆盖数据结果,可以看出GetInteger一共被划分为 2 + 5 = 7 个block,其中未覆盖的block有2个。很显然,米色未完全覆盖行中肯定包含一个未覆盖block,那么剩下的一个只能可能是下面的“{”行和“return 1;”行。也就是说,“{” 和 “return 1;”这两行被认为是一个block,所以说同一个block的内容不一定全在同一行上,它有可能是分布在多行上,如下图所示:

      综上所述,block和代码行之间没有非常规律的对应关系。那么到底block是如何定义的呢?MSDN:Code Coverage Data Overview 给出了如下的定义:

A code block is a code path with a single entry point, a single exit point, and a set of instructions that are all run in sequence. A code block ends when it reaches a decision point such as a new conditional statement block, a function call, exception throw, enter, leave, try, catch, or a finally construct.

       简单的说,就是有个单一入口和单一出口的代码块就被认为是一个block,但是这样的定义实际上是很难和代码直接对应上。之所以这样,是因为Visual Studio进行的instrument是针对IL或者(二进制)代码级别的而不是文本代码级别的。例如:GetInteger一共有7个block,能够直接从代码中识别出的有block (1,2,3,4),如下图所示。而block 5中实际上是包括3个block,我等凡夫俗子单凭肉眼是很难准确区分出这3个block的。

 

      在一般的代码覆盖应用中,我们不必关心的block到底是如何定义和划分的,代码覆盖的核心用途是要发现已有测试所遗漏的产品代码,而这些被测试遗漏代码在“彩色”代码窗口已经可以很清楚地找到。如果要真想了解你的代码是如何被划分block,办法也是有的: 针对.NET语言,ildasm.exe就是这样的工具,用它来查看instrumented后的IL代码,并和未instrument的IL进行比较,你就会发现其中的奥秘。此时,对照着上面给出的code block的定义,可以更清晰地体会“单一入口和单一出口的代码块”的含义。在下一篇博客《代码覆盖从简到繁 (三) – 划分Block》中,将会花些时间具体介绍。

 

参考内容

  1. Code Coverage Analysis
语句行和语句块覆盖率有什么区别? 软件测试代码覆盖率中,语句行和语句块覆盖的含义是什么,两者的区别在哪里? 阅读详情

相关推荐

芯片行业术语解析:从RTL到Tape-out,新人必备的沟通与实战指南

在集成电路(IC)设计与开发领域,专业术语和英文缩写是工程师进行高效沟通与技术交流的基础。理解这些术语背后的原理,是掌握芯片设计、验证、物理实现及测试全流程的关键。从寄存器传输级(RTL)描述电路功能,到利用静态时序分析(STA)确保时序收敛,再到通过可测试性设计(DFT)提升芯片良率,每一环节都依赖特定的技术概念。这些知识不仅支撑着复杂片上系统(SoC)的开发,也直接关系到芯片的功耗、性能、面积(PPA)等核心指标。在实际工程中,无论是进行芯片验证以保障功能正确,还是处理芯片测试以筛选缺陷,都离不开对行业

weixin_34319817的博客 365

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017)

weixin_49199313的博客 177

视觉特征-自监督-掩码特征预测【2025-06】:V-JEPA-2【100万小时互联网视频,每样本:4秒×4➜16帧】【Stage1:表征学习⮕Stage2:V-JEPA2-AC(自回归下一帧预测)】

图14 展示了在实验室1中,使用杯子进行抓取操作任务的起始和目标框架示例。对于抓取和带物体到达任务,模型仅看到一个目标图像。对于拾取-放置任务,除了最终目标外,我们还向模型展示两个子目标图像。第一个目标图像显示物体被抓取,第个目标图像显示物体在目标位置附近。模型首先针对第一个子目标优化动作4个时间步,然后自动切换到第个子目标进行接下来的10个时间步,最后针对第三个目标进行最后4个时间步。

u013250861的博客 61

【信息科学与工程学】计算机科学与自动化——第十篇 计算机体系架构 系列 约束条件01

编号类型领域子领域问题问题的数学分析算法逐步推理思考的数学表达式及参数列表及约束方程组及参数列表及边界条件及范围关联知识1计算架构计算机体系结构指令集架构 (ISA)ISCA(指令集计算机架构)的性能分析与优化采用经典执行时间模型与Amdahl定律,结合指令级并行(ILP)和流水线效率,建立包含指令计数、CPI、时钟周期的数学关系。考虑存储层次与分支预测的影响,引入概率论与排队论分析延迟。1. 执行时间 T=N⋅CPI⋅tclk​。

weixin_49199313的博客 60

Unit Test 块覆盖

<br />Block:A sequence of non-branching statements; a linear sequence of code with no control flow route branchings.<br /><br /> Block coverage<br /><br /> Block coverage, sometimes known as line coverage, describes whether a block of code, defined as no

小易的坐骑 1976

代码覆盖工具BullseyeCoverage研究

代码覆盖工具BullseyeCoverage研究 分类: C/C++开发2010-08-10 16:16 4199人阅读 评论(69) 收藏 举报 工具编译器测试borland测试工具tools 目录(?)[+] 1.       术语定义 1.1.       代码覆盖代码覆盖率 =代码覆盖程度,一种度量方式。 1.2.       语句覆盖(Stateme

lionzl的专栏 1360

评测指标:代码覆盖

代码覆盖率 度量方式 语句覆盖(StatementCoverage) 又称行覆盖(LineCoverage),段覆盖(SegmentCoverage),基本块覆盖(BasicBlockCoverage) 度量: 被测代码中每个可执行语句是否被执行到了。只统计能够执行的代码被执行了多少行【单独一行的花括号{} 也常常被统计进去】 “最弱的覆盖”,它只管覆盖代码中的执行语句,却不考虑各种分支的组合等等。 判定覆盖(DecisionCoverage) 又称分支覆盖(BranchCoverage),所

weixin_41045344的博客 702

AI4EDA / AI4Design 完整研究报告:全球论文、项目、机构与产业路线

AI4EDA 与 AI4Design 的核心变化,不是“让大模型写 Verilog”这么简单,而是把芯片工程中的规格、代码、脚本、日志、波形、STA report、formal collateral、layout image、PPA 指标、制造计算等对象统一纳入可学习、可检索、可验证、可迭代的闭环。NVIDIA 的论文谱系清晰呈现了这条路径:先建立可执行评测,再做领域模型和数据工程,然后进入工具反馈、多智能体、长上下文、verifier-guided skill evolution。

weixin_41468466的博客 766

【十万字拆解】从零开始实现GPT-2(完整版)

本文是一篇 14 万字、从零硬核实现 GPT 的保姆级指南。内容全面覆盖四个阶段:①从最基础的 Bigram 语言模型切入,跑通数据处理与训练闭环;②仿照 Transformer 架构,深度研究 Multi-Head Attention、残差网络、LayerNorm 及 Dropout 的底层数学与代码实现;③从零构建BPE 分词器,对齐 GPT-2 规范;④从头搭建 GPT-1/2 工业级预训练流程,包含混合精度、梯度累积等十余项硬件级工程调优,并在 AutoDL 算力平台上从0开始训练!适合所有层次!

Pi_Nick的博客 1004

芯片设计入门:从SoC、RTL到流片的核心术语与实战解析

在数字电路与集成电路设计领域,掌握核心术语是理解技术原理和参与工程实践的基础。从寄存器传输级(RTL)描述到片上系统(SoC)集成,这些概念构成了现代芯片设计的骨架。其技术价值在于实现功能模块的标准化与复用,提升设计效率和可靠性。在应用场景上,这些知识贯穿芯片前端设计、物理实现、验证测试及系统集成全流程,是工程师阅读文档、参与评审、进行调试的必备工具。本文聚焦芯片行业高频术语,如SoC(系统级芯片)、RTL(寄存器传输级)、DFT(可测试性设计)及流片(Tape-out)等,通过分类解析与实战映射,帮助读者

weixin_30615767的博客 282

爬虫教程( 4 ) --- scrapy-redis、集群、curl-cffi、scrapy-stealth、aio-scrapy、omnicrawl-core、反检测(反爬)浏览器

分布式爬虫 scrapy-redis、集群

freeking101的博客 6356

【信息科学与工程学】计算机科学与自动化 第百三十三篇 凤凰架构02

① Firecracker 为每个 microVM 提供极简设备模型:virtio-net, virtio-blk, serial console。:① BB84:Alice 随机选择基矢(+ 或 ×)发送单光子,Bob 随机测量基矢,比对后保留一致位的子集作为原始密钥。:密度 1 EB/mm³;:① Parquet 文件:行组(Row Group)→ 列块(Column Chunk)→ 页(Page)。

weixin_49199313的博客 99

遗传算法工程化实战:从调参玄学到可控优化系统

遗传算法(GA)常被误解为固定流程的黑箱进化模拟,实则是一种需动态校准的搜索动力学系统。其核心在于将选择、交叉、变异转化为具有明确物理意义的控制变量——选择压力调控聚焦强度,交叉算子决定路径平滑度,自适应变异保障逃离局部最优能力。技术价值体现在对高维、非凸、含噪声等工业优化问题的鲁棒求解能力,广泛应用于超参优化、芯片布线、风电排布与制造工艺参数寻优等场景。本文聚焦GA在真实项目中失效的根本原因:种群多样性坍塌、精英策略误用及终止机制缺失,并提供基于控制论框架的参数耦合设计、编码适配原则与七步落地方法,直击‘

weixin_30606461的博客 325

【信息科学与工程学】【制造工程】第十五篇 制造工程工艺05 HBM内存制造工程核心工艺方法详解 00 1~3nm代际(N3/N2系GPU die + HBM3/HBM3E 2.5D/3D堆叠语境)

1~3nm代际(N3/N2系GPU die + HBM3/HBM3E 2.5D/3D堆叠语境),字段内容编号​01类型​带宽/接口预算建模(代数+量纲分析)芯片类型​GPU(3nm代,N3/N2系)+ HBM3E 内存子系统领域​【结果/电路/时序】领域中的问题​给定 HBM 栈数 Ns​、每栈位宽 W、每引脚数据率 R(Gbps),求系统峰值 pin 带宽 Bmax​;并把 Bmax​与 GPU 计算吞吐(FLOPS)、显存容量 Ctot​关联成"带宽瓶颈条件"。问题的详细数学分析和解法​JEDEC HB

weixin_49199313的博客 157

【信息科学与工程学】【制造工程】第八十四篇 Nvidia Rubin GPU 芯片加工工艺——分层拆解表01

属性内容编号​⑮字段​N3P 节点几何尺度锚定(CPP / MxP / SRAM bit-cell area)— 用来把"3nm"从营销词翻译成可算的面积/电容/电阻预算类型​制程标尺(Scaling metrology)— FEOL+局部互连领域​工艺节点定义 · 尺度律(Dennard/ITRS-style 但不迷信"nm=physical gate length")GPU芯片​模块​整个逻辑阵列的"最小重复尺":栅方向(poly/metal-x)与鳍方向(active/OD)子模块​。

weixin_49199313的博客 552

【信息科学与工程学】【通信工程】 第一百四十四篇 城域云网中的数学分析01

(为规模/营收/排名做无商业实质贸易、多层壳、无关多元、低效并购);(中纪委归纳的"利益输送/设租寻租/靠企吃企/影子公司/期权腐败/旋转门"等)。| 1 |​ | 供应链贸易/大宗商贸 | 钢铁/有色/煤炭/化工/粮油/建材等大宗供应链 | 央企三级贸易平台、地方国企商贸公司 |:国资委(主业核定/经营业绩考核)/集团经营计划:审计/风控/巡视巡察/违规经营投资追责46号令 | 往往是;资金链与注册壳往往集中在"注册便利地" |:主业清单管理+贸易"十不准"+货权/物流/票据"三单匹配"穿透核验。

weixin_49199313的博客 351

视觉特征-自监督-同源不同crop视图一致性【2025-08】:DINOv3【DINOv2+Gram损失=DINO损失+(iBOT损失+Gram损失)+KoLeo正则化损失】

自监督学习有望消除手动数据标注的必要性,从而使模型能够轻松处理大规模数据集以及更复杂的架构。由于无需针对特定任务或领域进行定制,这种训练方式能够利用单一算法从各种来源获取视觉表征,这些来源包括自然图像和航空图像等。本技术报告介绍了 DINOv3,它通过简单而有效的策略,为实现这一目标迈出了重要一步。首先,我们通过精心设计数据准备流程并进行优化,从而提升数据集与模型规模的扩展能力;其次,我们提出了一种名为“Gram 锚定”的新方法,该方法有效解决了在长时间训练过程中特征图质量会下降这一长期存在的难题。

u013250861的博客 215

High-Resolution Image Synthesis with Latent Diffusion Models # 基于潜在扩散模型的高分辨率图像合成

Robin Rombach 1 * Andreas Blattmann1 * Dominik Lorenz 1 Patrick Esser ® Björn Ommer 1 1 Ludwig Maximilian University of Munich & IWR, Heidelberg University, Germany ° Runway ML慕尼黑路德维希-马克西米利安大学 & 德国海德堡大学 IWR ° Runway MLhttps://github.com/CompVis/latent-diff

u013250861的博客 53
上一篇: Visual Studio 2010之后-Visual Studio vNext
下一篇: Soma, Jason, ScottGu等的MSDN中文博客
quicknet
博客等级 码龄25年 398粉丝 117原创
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值