5.1数组的引用

Java数据类型详解
基本数据类型-传值,即传递变量的值
package com.jredu.ch06;
public class Ch01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//不同的变量会分配不同的存储空间,改变一个变量的值不会影响有另一个变量的值
int a=1;
int b=a;//相当于int b=1; a和b是两块空间,是独立的,存放的值,一个基本数据类型占用一块空间
a=20;
System.out.println(a);
System.out.println(b);//打印的结果a=20;b=1;
如图所示:

引用数据类型-传引用,数组保存的并非是数组的实体,而是堆内存的参考地址
引用类型:所有的“类”,数组
堆内存用来存放由new创建的对象和数组。
在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址。栈中的这个变量就变成了数组或对象的引用变量。
引用变量就相当于是为了数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

int[] arry1={11,12};
System.out.println(arry1);//打印的结果就是hashcode码
如图所示:
int[] bb=new int[2];//创建对象时,首先在堆内存中创建数据,然后会在栈内存中创建一个引用地址
int[] arry2=arry1;
System.out.println(arry2);//和arry1打印的结果相同
如图所示:
arry2[0]=13;
arry2[1]=18;//对引用数据类型,赋值是把原对象的引用传递给另一个引用,两个引用指向同一块内存空间。
System.out.println(arry2[0]+","+arry2[1]);
System.out.println(arry1[0]+","+arry1[1]);//两个打印的结果相同
如图所示:
}

}

那根据这个方阵来看,是所有都要进行黑盒测试吗?例如,最小值,中间值,最大值?  ◆基本思想  通过按函数单位执行对象代码,  确认模块设计中记载的内容已经在源代码及基于源代码编译环境生成的对象代码中实现。  ◆测试观点  下表显示了测试观点、概要以及判断是否需要测试的标准。  各观点的具体确认方法以观点为单位记录在各sheet中。 [注释]  表中出现的正常值、异常值、最大值、最小值、边界值的具体定义可以参考sheet[用语定义] ○:适用 △3 -:不适用 分类 测试观点 判定执行条件 测试观点概要 用于SW单元验证的方法 SW单元测试中导出测试用例的方法 SW单元测试中的结构覆盖率指标 SW架构层级的结构覆盖率 基于需求的测试 接口测试 故障注入测试 资源利用评估 在适用情况下,模型与代码之间的对比测试(Back-to-Back Test) 需求分析 等价类的生成及分析 边界值分析 基于知识或经验的错误推测 命令覆盖率(C0) 分支覆盖率(C1) MD/DC(修正条件/判定覆盖率) 函数覆盖率 调用覆盖率 T7_1j T7_1k T7_1l T7_1m T7_1n T8-1a T8-1b T8-1c T8-1d T9_1a T9_1b T9_1c T12_1a T12_1b 1. 覆盖范围 1.1 C0、C1覆盖率 无条件(必须执行) 为了检测判定及相关处理与式样的不一致, - - - - - - - - - ○ ○ - - - 以满足C1覆盖率(分支网罗)的测试模式进行检查。 1.2 MC/DC 无条件(必须执行) 为了检测构成判定的各个条件及其相关的处理与式样之间的不一致, - - - - - - - - - - - ○ - ○ 创建符合MC/DC(Modified condition/decision coverage)100%的测试模式 并进行检查。 1.3 循环 存在循环处理 用网罗性的测试模式对循环的条件、处理进行检查。 ○ - - - - ○ - - - - - - - - 1.4 赋值处理 存在变量赋值处理 确认是否可以按照预期值进行赋值。 ○ - - - - ○ - - - - - - - - 1.5函数调用 存在函数调用 确认是否按照正确的顺序方法调用了合适的函数。 ○ - - - - ○ - - - - - - - - 2. 边界判定 2.1 边界判定 存在对连续值的条件判断 检查在每个条件中使用的算术运算符(>、≥、<、≤、==、≠)边界值没有错误, ○ - - - - ○ ○ ○ - - - - - - 以检测与式样不同的判定。 3. 溢出 3.1 溢出 存在 为了检测因溢出导致的非预期运算结果, ○ - ○ - - - - - ○ - - - - - 算术运算、移位运算、 通过类型的上下限值/最大值、最小值创建测试模式并进行检查。 从大类型转换到小类型 3.2 最大值/最小值保护 存在保护处理 如果存在保护处理,在运算结果超过最大值/最小值时, ○ - - - - ○ - ○ - - - - - - 会执行保护处理,确保值被限制在保护值范围内。 ※模块设计书上明确记载有意省略保护处理时,   仅限单元测试可忽略上述检查。 4. 零除 4.1 零除 存在除法 为了检测因除以0出现的预期外运算结果, ○ - ○ - - - - - ○ - - - - - 设计分母= 0的测试模式进行检查。 5. 数组引用 5.1 数组引用 存在数组引用 为了检测数组越界引用,当通过变量指定数组元素时, ○ - - - - - - ○ ○ - - - - - 需要设置并确认该变量可能取的最大值最小值。 此外,对于函数中的所有数组引用位置, 需要确认不存在数组越界引用并附上证据。 6. 指针引用 6.1 指针引用 存在通过指针引用值 为了检测非预期的不正引用(未分配区域的指针) ○ - - - - - - - ○ - - - - - 需要确认所引用指针变量的内容或地址值。 7. 中断禁止/允许 7.1 中断禁止 有中断禁止・许可处理的情况 目视确认是否有预期外的中断禁止/允许。 ○ - - - - ○ - - ○ - - - - - 8. map读取 8.1 map读取 存在map读取 在进行地图运算时,为了确认是否进行了预期外的运算, ○ - - - - ○ - ○ ○ - - - - - 需要检查地图的小于最小值、中值大于最大值的值这三点。 9. 处理间的协调性 9.1 执行顺序 存在共享输入・输出变量的处理 确认相关处理之间的执行顺序是否正确。 ○ - - - - ○ - - - - - - - - 9.2 优先级 在某些条件下有执行排他性的处理 当存在多个具有可同时满足执行条件的处理, ○ - - - - ○ - - ○ - - - - - 但仅执行其中一部分时, 需要确认是否按照正确的优先级选择了执行的处理。 10. 前回值保持 10.1 前回值保持 根据条件更新或不更新静态变量 如果存在不对静态变量进行处理的条件, ○ - - - - ○ - - - - - - - - 需要确认在该条件下前回值是否被保持。 11. 绝对值 11.1 绝对值 存在绝对值运算 如果存在绝对值运算,设置类型的最小值,确认是否有预期外的动作。 ○ - ○ - - - - - ○ - - - - - 12. 最大・最小值选择 12.1 最大・最小值选择 从多个元素中, 确认从多个元素中选择最大值或最小值的处理是否正确。 ○ - - - - ○ - - - - - - - - 选择最大值或最小值的处理情况 13. 常量 13.1 常量 常量有定义 确认常量值的定义是否与式样书一致。 ○ - - - - ○ - - - - - - - -  ◆测试执行二进制生成指南  单元测试基本上应使用在项目指定的编译环境(包括工具集选项指定)中  生成的目标代码以及可执行的环境来实施。  然而,由于测试环境的限制,将测试用执行二进制文件所需的所有目标代码  都在项目指定的环境中生成并用于测试,有时可能无法实现。  下表列出了在测试实施时更改编译环境时需要遵守的事项,以及允许更改的项目。 compiler option "编译对象: 包含测试目标单元的模块" "遵循PJ指定的标准 【例外】 ・在使用验证函数对象单元行为的测试环境时,无法验证被内联展开的函数调用。在这种情况下,允许指定关闭内联展开的选项。 (此时仅对源代码的实现进行验证,而不针对技术上无法验证的对象进行验证)" "编译对象: 桩(Stub)・驱动程序(Driver)" 任意 linker option 影响测试目标模块的二进制逻辑的选项 遵循PJ指定的标准 "上述以外的选项: ※例: ・删除可执行二进制文件中不使用对象的选项 ・输出 map 文件的选项" 任意
最新发布
12-02
根据提供的测试方阵,**并非所有情况都需要进行黑盒测试**,但边界值测试(包括最小值、中间值、最大值)在特定条件下是强制的。以下是具体分析: --- ### **1. 必须进行黑盒测试的场景** #### **(1) 边界判定(方阵2.1)** | **测试类型** | **触发条件** | **测试要求** | |--------------|-------------------------------|------------------------------------------------------------------------------| | 黑盒测试 | 存在连续值条件判断(如`if(x>100)`) | 必须测试边界值、边界值±1(即使白盒已覆盖`>`逻辑) | | **示例** | 输入范围[0,100] | 测试点:-1, 0, 1, 99, 100, 101 | #### **(2) 数组/指针引用(方阵5.1/6.1)** - **黑盒强制项**:必须测试数组索引的最小/最大值(如`arr[0]``arr[MAX_SIZE-1]`) - **白盒补充**:静态检查确保无越界访问(如LDRA工具扫描) #### **(3) MAP读取(方阵8.1)** - **三值测试法**:黑盒必须覆盖`<最小值`、中间值、`>最大值`的输入组合 ```c // 示例:MAP查表 float map_lookup(float input) { if (input < MAP_MIN) return MAP_MIN; // 需测试input=MAP_MIN-0.1 else if (input > MAP_MAX) return MAP_MAX; else return map_table[(int)input]; } ``` --- ### **2. 可豁免黑盒测试的场景** #### **(1) 纯结构覆盖目标(方阵1.1~1.5)** | **测试类型** | **覆盖目标** | **是否需黑盒** | |--------------------|-----------------------|----------------| | C0/C1覆盖率 | 语句/分支覆盖 | ❌ 仅白盒 | | MC/DC覆盖率 | 条件独立影响判定 | ❌ 仅白盒 | | 函数调用顺序验证 | 调用链路正确性 | ❌ 桩函数模拟即可 | #### **(2) 编译器保证的场景** - **常量赋值(方阵13.1)**:若常量通过`const`定义且编译器强制只读,可免黑盒测试 - **内联函数展开**:方阵注明若开启内联优化,相关调用可不验证(需编译器证明) --- ### **3. 混合测试策略示例** #### **案例:溢出检测(方阵3.1)** ```c uint16_t safe_add(uint16_t a, uint16_t b) { uint32_t tmp = (uint32_t)a + b; // 需黑盒+白盒联合验证 return (tmp > UINT16_MAX) ? UINT16_MAX : (uint16_t)tmp; } ``` | **测试类型** | **测试用例** | **验证目标** | |--------------|---------------------------|---------------------------------------| | **黑盒** | a=65535, b=1 | 返回值应为65535(饱) | | **白盒** | 检查汇编是否用32位暂存器 | 确认编译器未优化掉溢出检查 | --- ### **4. 工业标准要求** - **ISO 26262-6**:强制边界值测试(无论白盒覆盖率多高) - **DO-178C**:A级软件要求黑盒需求追溯覆盖所有输入等价类 - **IEC 61508**:对安全相关边界条件要求独立验证(即黑盒+白盒) --- ### **5. 决策树:何时跳过黑盒?** ```mermaid graph TD A[被测代码] --> B{涉及物理边界?} B -->|是| C[必须黑盒测试] B -->|否| D{纯逻辑控制流?} D -->|是| E[可仅白盒测试] D -->|否| F{输入来自不可信源?} F -->|是| C F -->|否| E ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值