嵌入式软件测试相关分析
嵌入式软件测试相关分析
1. 引言
在软件发展之初,上个世纪五六十年代,软件被视为数学领域,编程是为了进行数学计算,由数学公式推导,来写函数。因此,在那个时候所编写的程序是被视为数学问题,数学的一大特征即是可证明性,可以使用数学推导的方式来证明一段程序的正确性。但是随着软件行业的发展,代码的量级越来越大,功能越来越复杂,再将编程视作数学问题,将所有的代码以数学方式来证明变得不切实际,编程由此而转为了科学问题。而科学问题的特性即是,不可证明性与可证伪性。不可证明即我们无法证明这个程序完全正确,永远不出问题。可证伪性表明我们可以通过一些特例来去验证我们的程序,当这些特例通过时,我们可以说,暂时未发现问题,但不能说程序绝对正确。当这些特例未能通过时,那么我们就可以说,这个程序绝对有问题。这样的一些特例即为软件测试的测试用例。
软件测试的意义对于软件开发来说是毋庸置疑的,正如Robert C Martin在《The Clean Coder》中所言:
I don’t think that surgeons should have to defend hand-washing, and I don’t think that programmers should have to defend TDD.
2. 测试方式
软件测试既有手动测试也有自动化测试,手动测试相信每个开发人员都有做过这样的事,我们常常写了一些功能,然后在main函数这样的地方去直接调用我们写的功能,这样的测试往往是一次性的,随着开发的进行,这些测试就会被抛弃。或者更进一步,会有个功能回调的表,然后我们手动来触发相应的功能,来验证功能的正常。而自动测试借助一些测试框架,来隔离业务代码和测试代码,并且能够一次性测试多个用例,测试代码和业务业务代码相应迭代演进。
自动化测试的意义在于快速、快捷、全面地进行软件测试。我们开发中应该尽量做到一键实现测试,只有足够便捷,才方便频繁地测试我们的代码。而且在开发过程中,应当尽量精简测试,当不涉及其他模块时,我们仅需要验证当前开发模块,编译和运行测试用例不超过10s,这样我们可以在每分钟都运行一次测试用例,直到模块开发完成。
3. 嵌入式软件测试
嵌入式软件也需要进行测试,嵌入式软件开发人员部分是硬件开发人员兼职,使用C语言来完成驱动开发。对于软件测试,嵌入式行业,尤其是mcu方面并未有足够的认识,当然这也是嵌入式开发所独特开发方式和运行环境所致,嵌入式开发通常都是需要跨平台编译,也就是说开发平台和运行平台不同,这也导致了依赖于硬件的IO会有所不同,如果仅在开发平台上运行测试用例,那无法避免地需要将设备驱动相关的部分打桩掉,使得代码运行在设备无关的平台上。所以这种方式只能测试应用层的一些代码,对于驱动部分的代码则无能为力。
在最近我们部门展开了一个新项目,将原来的mcu平台迁移到arm64的CPU平台上,运行linux内核的rtos系统。在mcu项目中,就缺乏相应的测试手段,仅能通过一些shell的方式来手动测试部分功能。缺乏自动化测试,就使得开发时不能时常测试,验证时也无法全面测试。所以最近在考虑搭建测试框架的问题,原先的意思是需要一个系统测试框架,在我看来单元测试反而更加急迫,也更贴近于开发人员。不过最后决定系统测试和单元测试框架都做,先实现较为基础的单元测试框架,然后再整合单元测试框架和必要的系统模拟组件实现系统测试框架。
单元测试是对软件微颗粒级别的测试,若被测试功能对其他模块或组件有所依赖,那么最好将依赖的部分打桩掉,以免其他模块的功能修改影响到本测试用例的检测,也就是说功能的测试应该独立化,不应有所依赖,在面向对象的开发模式中,模块和模块之间本就是解耦的,程序的可测试性相当好,然而在面向过程中,往往模块之间会有直接的依赖,使得程序的可测试性下降,要么将业务代码解耦重构,要么使用一些三方的打桩工具,在运行时使用桩函数替换掉原有的接口。
系统测试更像模拟出一套运行系统出来,来完整测试整个业务流程,根据项目的特点来设计模拟器功能,这和项目的业务强相关,这里就不过多赘述。
上述的单元测试和系统测试仅在应用层使用,在开发环境中,使用高级的测试工具来完成,自然不是问题。但我们还有一部分代码未受到测试用例覆盖,那就是和硬件高度相关的驱动代码。在之前的一篇文章中提出嵌入式软件开发应该分层设计1,在测试方面也应当进行分层测试。驱动抽象层及应用层代码,应该在开发环境中使用高级测试框架实现。设备层代码应当使用运行环境,使用一些轻量级的测试框架集成测试设备驱动代码,这样就可以尽可能地覆盖更多的代码,以提高测试覆盖率,实现测试全面自动化测试。
4. 总结
软件作为科学问题,呈现不可证明性和证伪性,就表明了测试是永远不会停止,测试会持续存在于软件的整个生命周期内,即使再完善的测试用例覆盖和系统验证,也无法保证软件在交付之后不会问题。受限于人的有限性,无法在测试阶段就保证能覆盖所有场景,运行时暴露出问题,也可以进一步去完善我们的测试场景,在接下来的回归验证中,我们就可以覆盖更全面的场景。自动化测试的意义在于解决一些低效的测试手段,让自动化实现在开发和验证的每一个时刻,根据各自的需求,实现不同测试范围的自动化测试。在嵌入式软件开发中,有其特殊性,即非常依赖于硬件功能,使得测试情况变得复杂。不过使用测试分层是一个非常好的思路,配合软件设计时的架构分层,可以更好地解决嵌入式软件的架构问题。在有些嵌入开发中,将设备层做成BSP包,软件开发人员仅需要负责应用层代码开发,在这种情况下,BSP作为外部依赖,业务层的开发人员应该对其做验收测试,已判断外部依赖功能的有效性。
嵌入式软件架构-CSDN博客 ↩︎
相关文章:
嵌入式软件测试相关分析
嵌入式软件测试相关分析 1. 引言 在软件发展之初,上个世纪五六十年代,软件被视为数学领域,编程是为了进行数学计算,由数学公式推导,来写函数。因此,在那个时候所编写的程序是被视为数学问题,数…...
vue+jave实现文件报表增加文件下载功能
需求背景:系统有文件交互功能。但没有做页面展示。为了测试方便,写了报表展示并可下载文件做检查。(所以下载是依赖表数据的) 使用语言和框架: 前端:vue-cli 后端:springBoot 前端实现 1、在报表vue文件,显示下载按钮并实现下载接口请求和处理。 //报…...
网站安全性评估方法
评估一个网站的安全性是一个多方面的过程,涉及到对网站的技术架构、代码质量、数据处理、用户交互等多个维度的考察。以下是一些常用的评估方法: 1.了解常见的安全风险:包括恶意软件、钓鱼攻击、跨站脚本攻击等,这些都是网站可能…...

【小程序】WXML模板语法
目录 数据绑定 数据绑定的基本原则 在data中定义页面的数据 Mustache语法的格式 Mustache语法的应用场景 事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 事件…...

[数据集][目标检测]厨房积水检测数据集VOC+YOLO格式88张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):88 标注数量(xml文件个数):88 标注数量(txt文件个数):88 标注类别数…...

QSlider样式示例
参考代码: /********************QSlider横向滑动条样式**********************/ QSlider {background-color: rgba(170, 255, 255, 100); /* 设置滑动条主体*/ }QSlider::groove:horizontal {border: 1px solid #999999;height: 8px; /* 默认…...

【Linux】进程3——PID/PPID,父进程,子进程
在讲父子进程之前,我们接着上面那篇继续讲 1.查看进程 mycode.c makefile 我们在zs_108直接编译mycode.c,直接运行,然后我们转换另一个账号来查看这个进程 我们可以通过ps指令来查看进程 我们就会好奇了,第二行是什么ÿ…...
开发常用的组件库
框架: Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org) React 官方中文文档 (docschina.org) Svelte 中文文档 | Svelte 中文网 SolidJS 反应式 JavaScript 库 页面样式: 网页端: 指南 |元素 (eleme.cn) Mint UI (mint-ui.github.io…...

深度解析地铁票务系统的技术架构与创新应用
在城市交通体系中,地铁作为一种快速、便捷的公共交通方式,已经成为现代都市生活的重要组成部分。而地铁票务系统的技术架构,则是支撑地铁运营的核心之一。本文将深度解析地铁票务系统的技术架构与创新应用,从系统设计、数据管理、…...

Python集合的基本概念和使用方法
目录 集合(Set) 基本概念 基本特性 基本操作 集合运算 成员测试 高级操作 集合推导式 总结 集合(Set) Python集合(Set)是Python语言中一个非常实用且强大的数据结构,它用于存储多个不…...

谷歌浏览器124版本Webdriver驱动下载
查看谷歌浏览器版本 在浏览器的地址栏输入: chrome://version/回车后即可查看到对应版本(不要点击帮助-关于Google chrome,因为点击后会自动更新谷歌版本) 114之前版本:下载链接 123以后版本:下载链接࿰…...

十大排序
本文将以「 通俗易懂」的方式来描述排序的基本实现。 🧑💻阅读本文前,需要一点点编程基础和一点点数据结构知识 本文的所有代码以cpp实现 文章目录 排序的定义 插入排序 ⭐ 🧐算法描述 💖具体实现 …...

微信小程序学习笔记(1)
文章目录 一、文件作用app.json:project.config.json:sitemap.json页面中.json 二、项目首页三、语法**WXML**和**HTML**WXSS 和CSS的区别小程序中.js文件的分类 一、文件作用 app.json: 当前小程序的全局配置,包括所有页面路径、窗口外观、…...

OpenGauss数据库-6.表空间管理
第1关:创建表空间 gsql -d postgres -U gaussdb -W passwd123123 CREATE TABLESPACE fastspace OWNER omm relative location tablespace/tablespace_1; 第2关:修改表空间 gsql -d postgres -U gaussdb -W passwd123123 ALTER TABLESPACE fastspace R…...
相约乌镇 续写网络空间命运与共的新篇章(二)
从乌镇峰会升级为世界互联网大会,既是展示互联网发展成果的技术盛会,也是尖端科技综合运用的宏大场景。从枕水江南散发出的“互联网之光”,到前沿技术的创新突破和场景应用,澎湃的是数字经济浪潮,激荡的是科技创新能量…...

【全网最简单的解决办法】vscode中点击运行出现仅当从 VS 开发人员命令提示符处运行 VS Code 时,cl.exe 生成和调试才可用
首先确保你是否下载好了gcc编译器!!! 检测方法: winR 打开cmd命令窗 输入where gcc(如果出现路径则说明gcc配置好啦!) where gcc 然后打开我们的vscode 把这个文件删除掉 再次点击运行代码,第一个出现…...

NFS共享存储服务
NFS共享存储服务 NFS:network file system ,在计算机网络中共享文件系统的协议。 计算机之间可以通过网络共享目录和文件,分为两个部分: 1、rpcbind:远程共享调用 2、nfs:共享服务,端口号:2…...
Docker面试整理-Docker 常用命令
Docker 提供了一套丰富的命令行工具,使得用户能够管理容器、镜像、网络和卷等资源。这里列出了一些常用的 Docker 命令: 镜像相关命令:docker pull [OPTIONS] NAME[:TAG|@DIGEST]: 从仓库拉取一个镜像或仓库。docker push NAME[:TAG]: 推送一个镜像或仓库到远程仓库。docker …...

Cinema 4D 2024 软件安装教程、附安装包下载
Cinema 4D 2024 Cinema 4D(C4D)是一款由Maxon开发的三维建模、动画和渲染软件,广泛用于电影制作、广告、游戏开发、视觉效果等领域。Cinema 4D允许用户创建复杂的三维模型,包括角色、场景、物体等。它提供了多种建模工具&#x…...
2024全国高考作文题解读(Chat GPT 4.0版本)
新课标I卷 阅读下面的材料,根据要求写作。(60分) 随着互联网的普及、人工智能的应用,越来越多的问题能很快得到答案。那么,我们的问题是否会越来越少? 以上材料引发了你怎样的联想和思考?请写…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...