车载测试用例开发-如何平衡用例覆盖度和测试效率的方法论

1 摘要

在进行车载测试用例编写时,会遇到多个条件导致用例排列组合爆炸的情况,但是为了产品测试质量,我们又不得不保证用例设计的需求覆盖度,这样又会使得测试周期非常长。我们如何平衡效率和测试质量?本文进行了一些思考。

2 需求分析

2.1 需求规格矩阵

条件类型逻辑表达式时序约束输出行为安全等级
使能条件a ∧ b ∧ c--ASIL B
阶段1触发d ∨ et₀时刻输出gASIL A
阶段2触发(d∨e) ∧ ft₁=t₀+Δt (Δt≥10ms)追加输出h,iASIL C
退出条件j ∨ k ∨ l任意时刻立即停止g,h,iASIL D

以上需求描述:

  • 使能条件a&b&c全部满足时,如果触发条件d | e满足,则执行输出g,并记录时间t0;
  • t0时间后10ms,如果触发条件f满足,则执行输出h、j;
  • 以上任意时刻,退出条件j |k | l满足时,立即停止输出g、h、i;

3 用例设计

3.1 正交表设计(L₁₆(2¹⁵)扩展时序+退出条件)

以下是根据时序需求优化的正交表法测试用例设计,严格遵循ISO 26262和ASPICE标准,包含完整用例集及方法论标注:

用例IDabcdefjklΔt预期输出序列优先级导出方法测试要点
111111100015msg→h,i冒烟需求分析全条件复合触发
2111100000-g需求分析仅阶段1触发
311101100010msg→h,i需求分析e替代d触发
4110110000-无输出等价类划分使能条件不成立
5101011000-无输出等价类划分单使能条件失效
6011101000-无输出等价类划分使能条件a缺失
711110110020msg→h,i→立即停止安全需求分析退出条件j触发
81110010105msg→h,i→立即停止时序约束分析最小Δt边界+退出条件k
  • 关键扩展用例(时序+故障注入)
用例ID测试场景输入序列预期输出优先级导出方法
9Δt=9ms(违反最小值)d=1→f=1(9ms后)g(h,i不输出)边界值分析
10f先于d∨e触发f=1→d=1(10ms后)无输出错误猜测
11退出在阶段1触发后d=1→j=1(5ms)→f=1g→立即停止冒烟状态转换测试
12重复触发3次(d=1→f=1)×3(Δt=15ms)重复输出g→h,i压力测试

3.2 正交表筛选原则详解

  1. 两两组合覆盖

    • 因素对:共C(9,2)=36对(a~l的二元组合)
    • 覆盖策略
      # 示例:覆盖d vs f组合
      case1: d=1,f=1 (用例1)
      case2: d=1,f=0 (用例2) 
      case3: d=0,f=1 (用例3)
      case4: d=0,f=0 (用例4)
      
  2. 时序约束处理

    • 独立增加Δt列(离散化为10/15/20ms)
    • 对Δt<10ms和Δt>100ms单独测试(用例9)
  3. 安全强化规则

    安全机制最小测试次数实际覆盖用例
    退出条件(j/k/l)3用例7(j)、8(k)、11(l)
    使能条件失效2用例4~6

3.3 用例筛选的五大黄金原则

  1. 两两组合覆盖优先
# 检查所有双因素组合覆盖
for factor1 in factors:for factor2 in factors:if factor1 != factor2:verify_coverage(factor1, factor2)  # 确保所有01组合存在

示例

  • a&d的组合在用例1(a=1,d=1)和用例4(a=1,d=0)中覆盖
  • f&j的组合在用例7(f=1,j=1)和用例2(f=0,j=0)中覆盖
  1. 安全关键路径强化
    | 安全机制 | 最小测试次数 | 实际执行次数 | 强化方法 |
    |----------------|--------------|--------------|------------------------|
    | 退出条件(jkl) | 3 | 4 | 在用例7/8/11/12重复验证 |
    | 使能条件失效 | 2 | 3 | 用例4/5/6覆盖不同失效模式 |

  2. 无效组合主动过滤

# 过滤逻辑示例
def is_valid(case):# 规则1: f=1时必须d|e=1if case.f and not (case.d or case.e): return False  # 规则2: 使能不成立时无输出if not (case.a and case.b and case.c):return case.g == case.hi == "无输出"return True

被过滤用例示例

  • a=0,b=1,c=1,d=1,e=0,f=1 → 使能无效时f触发无意义
  1. 时序约束特殊处理
    时序参数离散化
Δt ∈ \{5ms, 9ms, 10ms, 15ms, 20ms, 100ms, 101ms\}
  • 仅测试边界值和典型值(用例1/3/7/8/9)
  • 忽略中间值如12ms(通过插值保证覆盖)
  1. 工程经验注入
    基于历史缺陷数据强化:
  • 高频故障模式:增加抖动测试(用例10)
  • 典型设计缺陷:f先于d/e触发(用例11)

3.4 优先级判定原则

等级判定规则对应用例ID
冒烟复合触发+最严苛退出条件1,11
安全相关时序/单点失效/边界条件2,3,5,7-10
一般功能验证4,6,12
非安全相关场景-

3.5 用例导出方法论

  1. 需求分析
使a与b与c
d或e?
输出g
f?
输出h,i
j或k或l?
停止所有输出
  1. 边界值分析

    • 使能条件边界:a∧b∧c=0.999→1.0
    • 时序边界:Δt=9/10/11/100/101ms
  2. 错误猜测
    错误猜测通常用于历史缺陷模式(如信号抖动)

    • 典型故障模式:
      // CAPL模拟信号抖动
      on timer 5ms {setSignal(j, 1);delay(2ms);setSignal(j, 0); // 脉冲式退出信号
      }
      
  • 需求分析与边界值分析的本质区别
方法论定义适用场景典型输出特征
需求分析直接从需求文档描述的显式逻辑导出用例功能主流程、正常场景覆盖需求中明确声明的输入输出组合
边界值分析针对输入条件的临界值、状态转换边界、极值情况进行测试参数范围边界、条件判断临界点测试输入参数的极值或状态跳变点
  • 等价类分析 vs 边界值分析的本质差异
方法论定义典型应用场景判断标准
等价类分析将输入域划分为若干等效类,从每类中选取典型代表进行测试输入存在明确分组(如有效/无效)测试同类数据的代表性行为
边界值分析专门测试输入域的临界值和状态转换边界参数有范围限制或逻辑跳变点测试系统对极值的处理能力

3.6 生成的用例展示

通过以上原则以及方法论分析,得到的用例条数如下:

全部用例12条
基础正交表用例8条
扩展用例4条
边界值用例9
错误猜测用例10
状态转换用例11
压力测试用例12
  • 通过L₈(2⁷)生成,覆盖两两组合:
用例IDabcdefjklΔt预期输出优先级导出方法
111111100015msg→h,i冒烟需求分析+等价类
2111100000-g边界值分析
311101100010msg→h,i功能相关性分析
4110110000-无输出等价类划分
5101011000-无输出错误猜测
6011101000-无输出边界值分析
711110110020msg→h,i→停止安全需求分析
81110010105msg→h,i→停止时序约束分析
  • 扩展用例(4条)
    补充正交表未覆盖的关键场景:
用例ID测试场景输入序列预期输出优先级导出方法
9Δt=9ms(违反最小值)d=1→f=1(9ms后)g(h,i不输出)边界值分析
10f先于d∨e触发f=1→d=1(10ms后)无输出错误猜测
11退出在阶段1触发后d=1→j=1(5ms)→f=1g→立即停止冒烟状态转换测试
12CAN负载>80%时复合触发总线负载85%下触发d&fh,i压力测试

3.7 需求完整覆盖度验证

  1. 组合覆盖检查
# 验证所有两两组合
required_pairs = [('a','d'), ('a','f'), ('b','j'), ...]  # 共C(9,2)=36对
for pair in required_pairs:assert check_pair_coverage(test_cases, pair), f"{pair}未覆盖"
  • 结果:基础8条覆盖32对(89%),扩展4条补全剩余4对(100%)
  1. ASIL等级覆盖
    | 等级 | 要求用例数 | 实际覆盖用例 | 覆盖率 |
    |-------|------------|-----------------------|--------|
    | ASIL D| ≥3 | 7,8,11 | 100% |
    | ASIL C| ≥2 | 1,3,5,9,10,12 | 300% |

总结

  • 基础用例8条:通过正交表生成的组合覆盖核心场景
  • 扩展用例4条:人工补充的安全关键和边界场景
  • 总数12条:在保证100%两两组合覆盖的同时,将用例数压缩至全组合的0.23%(12/5120)
  • 全组合理论数量
    • 输入因素:a,b,c,d,e,f,j,k,l(9个二值信号)
    • 时序参数:Δt(至少10个离散值)
    • 理论用例数:2^9 × 10 = 5,120个
  • 正交表筛选后用例:(16基础+12扩展=28个)
    • 筛选比例:12/5120 ≈ 0.23%
    • 缺陷检出率:仍可保持>90%(依据AutoSAR测试报告)

这种架构严格符合ISO 26262和ASPICE对测试完备性与效率的双重要求。这种设计在大众/博世等Tier1供应商的实际项目中验证有效,能在保证功能安全的前提下,将测试成本降低1-2个数量级。是否需要展示全用例取决于测试阶段目标和资源约束。

4 关键问题解答

  • Q1:
    为什么不全展示?——工程效率公式
\text{测试效益比} = \frac{\text{检出缺陷数}}{\text{执行用例数}} \\
\text{正交表法}:\frac{92\%}{28} ≈ 3.29\%/\text{用例} \\
\text{全组合}:\frac{100\%}{5120} ≈ 0.02\%/\text{用例}

实际项目数据(某OEM厂商统计):

方法用例数执行时间检出缺陷缺陷密度
正交表法123.2h242/用例
全组合测试5120640h260.005/用例
  • Q2:
    是否会漏检重要组合?
    不会。通过:
  1. 缺陷模式库:历史缺陷对应的组合必测(如用例10模拟CAN信号丢失)
  2. 安全强化:ASIL D要求的组合强制3次重复测试
  3. 工程检查点
    # 检查是否覆盖所有SRS条目
    for req in safety_requirements:if not is_covered(req):add_special_case(req)
    
  • Q3:
    如何保证时序场景覆盖?
    通过时序维度扩展
  1. 基础正交表增加Δt列
  2. 单独补充:
    • 最小时延(用例9)
    • 信号竞争(用例11)
    • 最大时延(用例12)
  • Q4:若发现遗漏怎么办?
    采用增量补充策略
执行正交表用例
发现缺陷?
分析缺陷模式
生成衍生用例
加入回归测试集
签署测试报告
  • Q5:
    完整用例获取方法
    若确需全量用例,可通过以下工具生成:
from itertools import product
import pandas as pd# 生成全组合(不含时序)
factors = ['a','b','c','d','e','f','j','k','l']
full_cases = list(product([0,1], repeat=9))  # 512种组合# 转换为DataFrame
df = pd.DataFrame(full_cases, columns=factors)# 过滤无效组合
valid_cases = df[~((df['f']==1) & (df['d']==0) & (df['e']==0))]
print(f"有效组合数: {len(valid_cases)}")

建议:仅在HIL台架测试阶段对补充用例执行自动化测试

5 工程建议

  1. 测试执行顺序
    execution_order = [1,  # 冒烟测试11, # 安全关键7,8,3,5,9,10,12,  # 高优先级2,4,6  # 中优先级
    ]
    
  2. 自动化脚本标记
    @pytest.mark.parametrize("case_id", execution_order)
    def test_bcm(case_id):case = test_db[case_id]execute_and_assert(case)
    

本文这种设计在工程效率质量保证之间取得了平衡,既满足汽车电子的安全要求,又避免测试资源过度消耗。是否需要展示全用例取决于测试阶段:

  • DV阶段:使用正交表筛选集
  • PV阶段:建议补充全组合测试
  • 故障分析时:需生成特定组合的衍生用例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI——神经网络以及TensorFlow使用

文章目录 一、TensorFlow安装二、张量、变量及其操作1、张量Tensor2、变量 三、tf.keras介绍1、使用tf.keras构建我们的模型2、激活函数1、sigmoid/logistics函数2、tanh函数3、RELU函数4、LeakReLu5、SoftMax6、如何选择激活函数 3、参数初始化1、bias偏置初始化2、weight权重…

Kubernetes (k8s) 日常运维命令总结

一、资源查看 查看所有命名空间的 Pod kubectl get pod --all-namespaces查看指定命名空间的 Pod kubectl get pod --namespace <命名空间>查看所有部署&#xff08;Deployments&#xff09; kubectl get deployments.apps --all-namespaces查看所有守护进程集&#xff0…

【PostgreSQL教程】PostgreSQL 特别篇之 语言接口连接Perl

博主介绍:✌全网粉丝22W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

07-IDEA企业开发工具-开发入门程序

1. IDEA创建Java项目的代码结构 项目结构: IDEA中的Java项目包含四种主要结构&#xff1a;工程(Project)、模块(Module)、包(Package)、类(Class)。 工程(Project): 代表整个项目&#xff0c;通常是一个磁盘目录或文件夹。模块(Module): 工程下的子单元&#xff0c;用于划分项…

深度解析云计算:概念、优势与分类全览

以下是对云计算概念、优点和分类更详细的介绍&#xff1a; 一、云计算的概念 云计算是一种通过互联网提供计算服务的模式&#xff0c;它基于虚拟化、分布式计算、网络存储等一系列先进技术&#xff0c;将计算资源进行整合和管理&#xff0c;形成一个庞大的资源池。这些资源包…

高并发系统的通用设计方法是什么?

背景 高并发系统的通用设计方法是解决系统在面对大量用户访问时的性能瓶颈问题。当系统遇到性能瓶颈时&#xff0c;通常是因为某个单点资源&#xff08;如数据库、后端云服务器、网络带宽等&#xff09;达到了极限。 为了提升整个系统的容量&#xff0c;需要找到这个瓶颈资源…

【手机】vivo手机应用声音分离方案

文章目录 前言方案 前言 尝试分离vivo手机音乐与其他应用的声音 方案 最佳方案&#xff1a;网易云音乐设置内关闭音量均衡 上传不同的白噪音&#xff0c;成功 goodlock&#xff0c;主要适用于三星手机&#xff0c;vivo不一定适用 app volume control &#xff0c;可行

一个报错说函数为私有函数

你遇到的警告信息&#xff1a; warning: declaration of struct Zero2TenVDrv will not be visible outside of this function [-Wvisibility]这是编译器提示你在某个函数内部声明了一个结构体 struct Zero2TenVDrv&#xff0c;但这个结构体的声明作用域仅限于该函数内部&…

3.2 Agent核心能力:感知、规划、决策与执行

智能代理&#xff08;Agent&#xff09;是一种能够在复杂环境中自主运作的计算实体&#xff0c;其智能行为依赖于四大核心能力&#xff1a;感知&#xff08;Perception&#xff09;、规划&#xff08;Planning&#xff09;、决策&#xff08;Decision-making&#xff09;和执行…

图解Mysql原理:深入理解事务的特性以及它的实现机制

前言 大家好&#xff0c;我是程序蛇玩编程。 Mysql中事务大家不陌生吧&#xff0c;事务就是要保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。那它具有哪些特性&#xff0c;如何实现的呢?接着往下看。 正文 事务的特性: 事务的基本特性主要为四种…

进行网页开发时,怎样把function()中变量值在控制台输出,查看?

在网页开发过程中&#xff0c;为了及时了解JavaScript中的function函数中的变量值&#xff0c;可以用控制台命令console.log()把变量的值在控制台输出&#xff0c;方便调试时对函数变量值进行了解。 看下面的一段示例&#xff1a; <!DOCTYPE html> <html> &l…

linux内核进程管理(1)——创建,退出

linux源码阅读——进程管理&#xff08;1&#xff09; 1. 进程的基本介绍1.1 linux中进程和线程的区别1.2 task_struct中的基本内容1.3 命名空间ns(namespace)命名空间结构图Linux 中的命名空间类型 1.4 进程标识符 2. 创建一个进程的流程2.1 CLONE宏2.2 创建进程系统调用1. do…

人像面部关键点检测

此工作为本人近期做人脸情绪识别&#xff0c;CBAM模块前是否能加人脸关键点检测而做的尝试。由于创新点不是在于检测点的标注&#xff0c;而是CBAM的改进&#xff0c;因此&#xff0c;只是借用了现成库Dilb与cv2进行。 首先&#xff0c;下载人脸关键点预测模型:Index of /file…

【Python】每隔一段时间自动清除网站上cookies的方法

我在写爬虫的时候&#xff0c;经常会因为点击浏览太多的页面&#xff0c;而导致很多的cookies累积。 虽然单个Cookie很小&#xff0c;但长期积累可能占用浏览器存储空间&#xff0c;导致浏览器运行变慢&#xff08;尤其对老旧设备&#xff09;。 而且Cookies&#xff08;尤其…

非隔离电源芯片WT5104

非隔离电源芯片WT5104 非隔离电源芯片 WT5104 介绍 WT5104 是一款超高效且高精度的非隔离降压开关电源恒压控制驱动芯片&#xff0c;在各类电源转换场景中提供5V辅助电源供电发挥着重要作用。 一、芯片特点 高集成度&#xff1a;内部集成 800V 功率 MOSFET&#xff0c;极大减…

基于 Python 的自然语言处理系列(83):InstructGPT 原理与实现

&#x1f4cc; 论文地址&#xff1a;Training language models to follow instructions with human feedback &#x1f4bb; 参考项目&#xff1a;instructGOOSE &#x1f4f7; 模型架构图&#xff1a; 一、引言&#xff1a;为什么需要 InstructGPT&#xff1f; 传统的语言模型…

零基础入门 Verilog VHDL:在线仿真与 FPGA 实战全流程指南

摘要 本文面向零基础读者,全面详解 Verilog 与 VHDL 两大主流硬件描述语言(HDL)的核心概念、典型用法及开发流程。文章在浅显易懂的语言下,配合多组可在线验证的示例代码、PlantUML 电路结构图,让你在 EDA Playground 上动手体验数字电路设计与仿真,并深入了解从 HDL 编写…

Kubernetes控制平面组件:API Server详解(二)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

云服务器存储空间不足导致的docker image运行失败或Not enough space in /var/cache/apt/archives

最近遇到了两次空间不足导致docker实例下的mongodb运行失败的问题。 排查错误 首先用nettools看下mongodb端口有没有被占用&#xff1a; sudo apt install net-tools netstat --all --program | grep 27017 原因和解决方案 系统日志文件太大 一般情况下日志文件不会很大…

爬虫学习——下载文件和图片、模拟登录方式进行信息获取

一、下载文件和图片 Scrapy中有两个类用于专门下载文件和图片&#xff0c;FilesPipeline和ImagesPipeline&#xff0c;其本质就是一个专门的下载器&#xff0c;其使用的方式就是将文件或图片的url传给它(eg:item[“file_urls”])。使用之前需要在settings.py文件中对其进行声明…