当前位置: 首页 > news >正文

单元测试与仿真程序之间的选择

为什么写这篇文章

现在的工作需求,让我有必要总结和整理一下。
凡事都有适用的场景。首先这里我需要提示一下,这里的信息,可能并不普适。
但是可以肯定一点的是,有些人,不论做事还是写书,上下文还没有交待清楚,就对你说单元测试如何重要,这种是极为无耻的。
是的,我是说无耻。因为说风凉话的人,他们不需要像那些奋战在一线的程序员那样,需要面对结果质量与进度和成本,以及维护性之间的考量,他们只需要在意自己说的话是不是看来永远正确即可。
这么说吧,一个想要他说的话永远正确,只需要故意将上下文删除即可,这也就是人们常说的站着说话不腰疼,或者永恒正确的废话,或者何不食肉糜之类的正确但无用的话。这些话往往常出现在书籍上。

但是,现实中,我们每天都需要面临痛苦的选择:是让自己良心好受一些,写出质量过得去的程序,还是让老板看到,我又出活了这样的表面文章。

所以,我们必须要考虑如何测试,以及如何避免重复相同的错误这样的问题。

然而,测试从来不是一件简单的事,事实上,我的硕士论文写的就是如何在被测对象升级之后,自动测试的脚本,能够95%以上自动升级的故事。这个我们不多说了。但大家都知道这是一个困难的事情。所以我的论文开篇讲的是自动测试的消亡史。

讲到测试,我们就不得不考虑测试的方法。
所有的书上,都强调Unit test是必不可少,多么重要。

这点了解我的人都知道,我是嗤之以鼻的。

正确的事,就好比亚当.斯密的《国富论》,认为自由竞争是是经济的基石;而事实是,人们总会有想尽办法使自由竞争失效。
同样,这些看似正确的废话,只能带来灾难。软件行业的灾难性失败还少吗?这些大公司没有做单元测试吗?
以微软为例,2003年,当时我还在某为,听说微软过了CMM2级,我说了一句:微软从此再也不能开发出有完整度的软件。一语成谶。

铺垫这么多,就是想对一些人说:凡事需要考虑上下文,不要被所有的书里都认可的话所蒙蔽:所有的写书的人,大多没有在一线工作过。

单元测试VS模拟(或仿真)程序

后面我们来比较一下这二者

单元测试的适用范围

1。 相对简单的程序或产品。
2。 与设备无关的程序或产品。
3。 需求变动相对慢的程序或产品。
4。 设计良好,接口清晰,与人机界面交互不多的多线程的每个模块或层之间。
上述为一般的单元测试能取得良好效果的上下文。

单元测试的问题

对代码有依赖。

这显然是最严重的问题。
有人说,为什么我要极客编程的原因正是如此,因为以前测试与研发是相对的,因为体制要求如此,但测试发现,研发的人可以随意改代码,所以白盒测试就消亡了。
所以,管理者就想到让程序员吃自己的狗食这样的损招:自己写自己的单元测试——反正嘴一动就可以了,这多简单。他们不考虑这么做带来的后果是什么。

这是一个悲哀的时代的原因是真正的程序员,已失去是了话语权。
那么有人说,是你自己的狗食,做得不好吃是你自己的问题。
然而事实真的是这样吗?
需求变动,产品经理认了客户当干爹,他敢对干爹说不吗?
还是苦一苦程序员吧。
设计错误,所有的PMP(我不是说PMP认证,我是说拍马屁那个PMP)的组长,敢对总工说不吗?
还是苦一苦程序员吧。
接口常变动,程序员同样没有权力找横跨多个部门的技术官僚体系去说理。
还是苦一苦程序员吧。

所以,这狗食难吃,也许只有不到1%的问题,在程序员。
所以,程序员现在不仅要捏着鼻子做难吃的狗食,还要自己吃了。

当然我们需要肯定单元测试的价值

如果你有良好设计的复杂的程序,所有的模块相对独立,接口相对稳定,
并且这个程序是多线程程序,那么单元测试是能发挥出极大的价值的。
如果再加上我写的论文里描述的,当被测对象发生改变时,自动测试脚本也能自动升级,显然对程序员是有利的。
当然,这是永恒正确的废话。
因为分工是你程序员浇水,官僚体系吃桃子。
呕,我忘了说,这种分工很公平:一棵树,一人一半,你要下面,我要上面。你一直浇水,我一直吃桃子,对了,老吃桃子也很累人的,你们浇水人不会懂我们的痛苦的。一人一半,很公平,放称上称称,一定一样重的。。。
或者说,除非这项目是你一个人在写。
多数情况,单元测试害处多于利益。
原因很简单,导致这种情况的官僚体系,是无人问责的(单向向上体系)。责权不对等。当然,他们吃桃子也很累,我也很有同理心的。

所以总结:
一个人的项目,而且项目很复杂,设计可控,接口清晰,需求清楚,而且你要对被测的对象非常了解,才可以。

模拟(或仿真)程序

当然一般我们是指模拟程序。除非有条件(作设备仿真)。
人们有个误解,认为互联网程序代表程序员,这显然是错到离谱,离了大谱。
广大的程序员,是需要与设备或硬件打交道的。
所以,模拟或仿真程序,是至关重要的。
原因是绝大多数公司,无法提供足够的硬件给程序员。

程序员的困难在于,有困难无处去说,比如说,我需要行拿到设备,才能逐渐的了解它的习性;
但领导却坚持认为,你是懂的,你非常懂。
等你刚懂,这个项目完事了,新的设备又到了。
所以,程序开发是个动态过程,这些话,领导是无法理解的,因为中国的情况,目前的领导都是硬件出身,麻麻不懂。而且也不讲道理。我这么说是有依据的。

在这样的情况下,写单元测试,是相当离谱的。

但是,写模拟程序却是非常必要的。

这是从技术开发和技术管理两个视角来看的。

因为模拟程序的仿照对象仅仅是我们的target,而unit的服务对象却是我们的程序。
这个你稍微理解一下就懂了。一个是对哈雷彗星,另一个是对哈雷将军。

也就是说,我们自己写程序,是最不可信的,因为你在信息的最后一道工序,没人在乎你。
但设备不同。
所以,不论你如何改代码,都不会影响simulator。
这是最关键的要点。与unit test不同。
我常说,第一点占75%以上。
但是后面的不重要的理由我们也要说说。

资产保值性

资产保值这件事,也是有水分的。因为你得是“资产”,才有必要保值。
一堆垃圾代码,它就不是资产。
单元测试的代码,往往如此。因为它要测的对象如果是个垃圾,它就一定是垃圾。

可是,simulator却不是这样的。
因为它mirror的对象是真实的设备。
随着公司工程的一年一年的积累,这个simulator会变成emulator的一部分,最后会变成产品的一部分,最后,会比产品更好。

以ABB的机器人为例,了解过的人都知道它的simulator有多强。FPGA的程序,DSP的程序,直能能跑。机器人也是三维CAD动画模拟出来的。
用户不需要买robot就能完全与买了一样给机器人编程。

这个算是15%?

管理角度

利用分工,也就是说,大公司,可以专门派专人写simulator,这点其实非常有价值的。注意是专岗。
如果有公司这么做,说明这老板有水平。
尽管中国大多是垃圾公司,管理极为垃圾。
但如果你的老板有这水平,恭喜你。尽量多干几年。
啊对了,你不可能设立专岗写unit test。前面这我解释得好多了。

后记

可千万不要以为,单元测试不重要。
其实我也写的。
因为我能做到可控。
因为是我一个人在干。我对我的能力也相当自信。所以我用。
但我尽最大可能,会集中精力写模拟程序,因为太必要了。

相关文章:

单元测试与仿真程序之间的选择

为什么写这篇文章 现在的工作需求,让我有必要总结和整理一下。 凡事都有适用的场景。首先这里我需要提示一下,这里的信息,可能并不普适。 但是可以肯定一点的是,有些人,不论做事还是写书,上下文还没有交待…...

确认机制面临的挑战

在传输控制协议中,确认机制(ACK 机制)是确保数据可靠交付、实现拥塞控制和丢包恢复的重要组成部分。然而,随着网络环境和业务需求的不断演进,确认机制在实际应用中面临着诸多挑战。今天我们探讨确认机制主要面临的几项…...

在MATLAB环境中,对矩阵拼接(Matrix Concatenation)的测试

在MATLAB环境中,对矩阵拼接(Matrix Concatenation)的正确性与鲁棒性开展测试时,需要依据不同的拼接场景精心设计测试用例,全面验证矩阵维度、数据顺序、边界条件以及异常处理等关键方面。以下是详尽的测试方法与具体示…...

[MySQL初阶]MySQL(4)基本查询

标题:[MySQL初阶]MySQL(4)基本查询 水墨不写bug 文章目录 一. 数据表设计二、对数据表的操作1. Create 操作(插入数据)查看最近受影响的行数: 2. Retrieve 操作(读取数据)&#xff0…...

基于STM32的智能家居蓝牙系统(论文+源码)

1总体方案设计 本次基于STM32的智能家居蓝牙系统,其系统总体架构如图2.1所示,采用STM32f103单片机作为控制器,通过DHT11传感器实现温湿度检测,MQ-2烟雾传感器实现烟雾检测,光敏电阻实现光照检测,同时将数据…...

QTS单元测试框架

1.QTS单元测试框架介绍 目前QTS项目采用C/C语言,而CppUnit就是xUnit家族中的一员,它是一个专门面向C的单元测试框架。因此,QTS采用CppUnit测试框架是比较理想的选择。 CppUnit按照层次来管理测试,最底层的就是TestCase,当有了几个TestCase以后,可以将它们组织成Te…...

《水利水电安全员考试各题型对比分析及应对攻略》

《水利水电安全员考试各题型对比分析及应对攻略》 单选题: 特点:四个选项中只有一个正确答案,相对难度较小。主要考查对基础知识的掌握程度。 应对攻略:认真审题,看清题目要求。对于熟悉的知识点,直接选择…...

sqlite3 c++ client选择; c++环境搭建 : abseil-cpp | fnc12/sqlite_orm

sqlite3 c client选择 今日20250305 2.4K星: 7月前最后提交核心: SRombauts/SQLiteCpp.git : 薄封装、命令式sql、非orm、支持事务2.4K星: 1月前最后提交核心: fnc12/sqlite_orm.git : 厚封装、非侵入、真orm、真泛型、类型复杂、支持事务、报错信息不完整(启动事…...

IMX6ULL驱动开发uboot篇02

目录 网络操作 第零步:先将网线跟电脑接好,打开串口连接到开发板上,然后上电,让UBoot停下来 第一步:查看我们的网线构成的虚拟子网是哪一个 第二步:我们必须把虚拟机的网卡模式从NAT改成桥接&#xff0c…...

智谱AI-FunctionCall

智谱AI-FunctionCall 编写FuncationCall大模型的函数调用,先直观的感受一下的感受下FunctionCall的魅力 文章目录 智谱AI-FunctionCall[toc]1-参考网址2-思路整理3-代码拆件1-[非核心]两个业务函数2-[非核心]业务函数的JsonSchema定义3-[核心]FunctionCall的调用1-打…...

数据保险箱:备份文件的关键价值与自动化实践

在信息化社会,数据已经成为我们生活、工作和学习的核心组成部分。无论是企业机密、个人隐私,还是创意作品、研究数据,它们都以数字形式存在于我们的电子设备中。然而,数据如同脆弱的玻璃制品,稍有不慎就可能面临丢失或…...

数字电路基础——逻辑门

逻辑门是数字电子技术中的基本构建块。这些组件用于对1和0进行操作,可以将它们组合起来创建其他构建块,并设计出如锁存器、触发器、加法器、移位寄存器等电路。 七种主要的逻辑门类型: 一、基本逻辑门 1.1 与门(AND gate) 1.1.1 逻辑运算规则 与门有多个输入端和一个输出…...

爬虫逆向:脱壳工具BlackDex的详细使用

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、BlackDex简介二、下载与安装三、基本使用步骤3.1 启动BlackDex3.2 导入目标APK文件3.3 开始脱壳3.4 查看脱壳结果四、后续分析4.1 使用 JADX 反编译 Dex 文件4.2 使用 Apktool 反编译 Dex 文件4.3 JD-GUI4.4 dex2ja…...

JavaScript中的Math()

目录 一、Math() 1.1floor() 1.2ceil() 1.3round() 1.4random() 1.5max() 1.6min() 1.7pow() 1.8sqrt() 1.9trunc() 二、parseFloat() 三、toFixed() 四、toString() 4.1Number类型转换为字符串 4.2Boolean类型转换为字符串 4.3Date()类型转换为字符串 4.4Arr…...

深度学习模型Transformer初步认识整体架构

第一章:人工智能之不同数据类型及其特点梳理 第二章:自然语言处理(NLP):文本向量化从文字到数字的原理 第三章:循环神经网络RNN:理解 RNN的工作机制与应用场景(附代码) 第四章:循环神经网络RNN、LSTM以及GR…...

【从模仿到超越:AIGC的崛起与AGI的终极梦想】

一、基本概念 1. AIGC(人工智能生成内容) 定义:基于人工智能技术生成文本、图像、音频、视频等数字内容的方法。技术基础:依赖深度学习模型(如GPT、DALL-E、Stable Diffusion)和自然语言处理(…...

标量、向量、矩阵与张量:从维度理解数据结构的层次

在数学和计算机科学中,维度描述了数据结构的复杂性,而标量、向量、矩阵、张量则是不同维度的数据表示形式。它们的关系可以理解为从简单到复杂的扩展,以下是详细解析: 1. 标量(Scalar):0维数据 …...

windows 上删除 node_modules

在 Windows 11 上,你可以通过命令行来删除 node_modules 文件夹并清除 npm 缓存。以下是具体步骤: 删除 node_modules 打开命令提示符(Command Prompt)或终端(PowerShell)。 导航到项目目录。你可以使用 …...

单例模式的五种实现方式

1、饿汉式 ①实现:在类加载的时候就初始化实例 ②优点:线程安全 ③缺点:实例在类加载的时候创建,可能会浪费资源 //饿汉式 public class EagerSingleton{private EagerSingleton(){} //私有构造方法private static EagerSingle…...

启智平台华为昇腾910B使用MS-Swift微调Janus-Pro-7/1B

最近想要微调一下DeepSeek出品的Janus多模态大模型 利用启智平台的昇腾910B国产计算卡进行大模型的微调 查看了一下MS-Swift支持了Janus模型的微调,LLamafactory好像暂时还不支持该模型的微调 看到了MS-Swift有单独对昇腾的支持,因此首先要安装swift&…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...