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

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

为什么写这篇文章

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

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

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

然而,测试从来不是一件简单的事,事实上,我的硕士论文写的就是如何在被测对象升级之后,自动测试的脚本,能够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。前面这我解释得好多了。

后记

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

相关文章:

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

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

一周学会Flask3 Python Web开发-SQLAlchemy简介及安装

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,…...

【玩转正则表达式】正则表达式常用语法汇总

1. 基本字符 普通字符:匹配自身。例如,正则表达式hello匹配字符串中的“hello”。\d:匹配任何数字字符,相当于[0-9]。例如,\d\d\d匹配三个连续的数字。 示例:123、456 \w:匹配任何字母数字字符…...

django中序列化器serializer 的高级使用和需要注意的点

在 Django REST framework(DRF)中,序列化器(Serializer)是一个强大的工具,用于将复杂的数据类型(如 Django 模型实例)转换为 Python 原生数据类型,以便将其渲染为 JSON、XML 等格式,同时也能将接收到的外部数据反序列化为 Django 模型实例。以下将介绍序列化器的高级…...

如何下载安装 PyCharm?

李升伟 整理 一、下载 PyCharm 访问官网 打开 PyCharm 官网,点击 "Download" 按钮25。 版本选择: 社区版(Community):免费使用,适合个人学习和基础开发。 专业版(Professional&#…...

URL中的特殊字符与web安全

在现代Web应用中,URL作为客户端与服务器之间的通信桥梁,承载着大量的重要信息。URL中的特殊字符,看似只是一些常见的符号,但在Web安全领域,它们与其他安全知识密切相关,如在Base64编码、SQL注入&#xff0c…...

Golang学习笔记_41——观察者模式

Golang学习笔记_38——享元模式 Golang学习笔记_39——策略模式 Golang学习笔记_40——模版方法模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 股票价格监控系统2. 物联网设备状态监控3. 电商订单状态通知 四、Go语言实现示例…...

中原银行:从“小机+传统数据库”升级为“OceanBase+通用服务器”,30 +系统成功上线|OceanBase DB大咖说(十五)

OceanBase《DB 大咖说》第 15 期,我们邀请到了中原银行金融科技部数据团队负责人,吕春雷。本文为本期大咖说的精选。 吕春雷是一位资历深厚的数据库专家,从传统制造企业、IT企业、甲骨文公司到中原银行,他在数据库技术与运维管理…...

slam学习笔记9---ubuntu2004部署interactive_slam踩坑记录

背景:interactive_slam是一款可用于离线优化点云地图算法。部署安装容易出问题,这里记录一下。 一、安装基本流程 绝大部分跟着readme走,g2o安装使用apt安装 interactive_slam depends on the following libraries:GL3W GLFW Dear ImGui p…...

MVC模式全解析

MVC 模式:概念与架构基石 在软件开发的广袤宇宙中,MVC 模式宛如一颗璀璨的恒星,照亮了无数开发者前行的道路。它是一种经典的软件架构模式,全称为 Model - View - Controller,即模型 - 视图 - 控制器 ,将应…...

游戏引擎学习第140天

回顾并为今天的内容做准备 目前代码的进展到了声音混音的部分。昨天我详细解释了声音的处理方式,声音在技术上是一个非常特别的存在,但在游戏中进行声音混音的需求其实相对简单明了,所以今天的任务应该不会太具挑战性。 今天我们会编写一个…...

LeetCode热题100JS(44/100)第八天|二叉树的直径|二叉树的层序遍历|将有序数组转换为二叉搜索树|验证二叉树搜索树|二叉搜索树中第K小的元素

543. 二叉树的直径 题目链接:543. 二叉树的直径 难度:简单 刷题状态:1刷 新知识: 解题过程 思考 示例 1: 输入:root [1,2,3,4,5] 输出:3 解释:3 ,取路径 [4,2,1,3] 或…...

【虚拟化】Hyper-V 与 WSL 2

关于 Hyper-V 与 WSL 2 的简介 Hyper-V 是微软出的 Type-I 型 Hypervisor,根据微软官方说 WSL 2 用了 Hyper-V 架构的子集,称为虚拟机平台(Virtual Machine Platform),是 Windows 中的一个可选组件,所以你…...

力扣刷题DAY6(滑动窗口/中等+栈/简单、中等)

一、滑动窗口 找到字符串中所有字母异位词 方法一&#xff1a;哈希表 class Solution { public:vector<int> findAnagrams(string s, string p) {vector<int> ans;unordered_map<char, int> target;for (int i 0; i < p.size(); i) {target[p[i]];}in…...

MySQL中的共享锁和排他锁

MySQL 中的锁可以从多个维度进行分类&#xff0c;其中从模式上可以分为共享锁&#xff08;Shared Lock&#xff0c;S Lock&#xff09;和 排他锁&#xff08;Exclusive Lock&#xff0c;X Lock&#xff09;。 共享锁&#xff08;Shared Lock&#xff0c;S Lock&#xff09; 共…...

HarmonyOS ArkTS声明式UI开发实战教程

引言&#xff1a;为何选择ArkTS&#xff1f; 在HarmonyOS生态快速发展的当下&#xff0c;ArkTS作为新一代声明式UI开发框架&#xff0c;正在引发移动应用开发范式的变革。笔者曾在多个跨平台框架开发中经历过"命令式编程之痛"&#xff0c;直到接触ArkTS后才发现&…...

【AI】【Unity】关于Unity接入DeepseekAPI遇到的坑

前言 由于deepseek网页端在白天日常抽风&#xff0c;无法正常的使用&#xff0c;所以调用API就成了目前最好的选择&#xff0c;尤其是Deepseek的API价格低得可怕&#xff0c;这不是和白送的一样吗&#xff01;然后使用过很多本地部署接入API的方式&#xff0c;例如Chatbox、Pa…...

虚拟机 | Ubuntu图形化系统: open-vm-tools安装失败以及实现文件拖放

系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 文章目录 系列文章目录虚拟机 | Ubuntu 安装流程以及界面太小问题解决 前言一、VMware Tools 和 open-vm-tools 是什么1、VMware Tools2、open-vm-tools 二、推荐使用open-vm-tools&#xff08;简单&#xff09;1、…...

zabbix 监控的内存溢出问题 out of memory

zabbix 由于是docker 建置 zabbix-server-server 在web端出现异常情况 经过检查发现docker status 显示Restarting (0) 4 seconds ago 频繁在重起 经过docker logs 分析查看到 __zbx_shmem_malloc(): out of memory (requested 256 bytes) 问题 191:20250306:023902.993 m…...

【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)

文章目录 人人都该学习的DeepSeekDeepSeek不同版本功能差异DeepSeek与硬件直接的关系DeepSeek系统兼容性部署方式选择部署步骤&#xff08;Ollama方式&#xff09;1.选定适合的deepseek版本2.环境准备3.安装Ollama4.部署deepseek5.测试使用 人人都该学习的DeepSeek DeepSeek 作…...

升级到Android Studio 2024.2.2 版本遇到的坑

一、上来就编译报错&#xff0c;大概率是因为选择了替换安装&#xff0c;本地配置文件出错 找到本地当前版本的配置文件&#xff0c;删掉&#xff0c;重启studio就好了&#xff1a; 1、打开终端 2、“cd /Users/用户名/Library/Application\ Support/Google” //到Google目录 …...

2025最新Transformer模型及深度学习前沿技术应用

第一章、注意力&#xff08;Attention&#xff09;机制 1、注意力机制的背景和动机&#xff08;为什么需要注意力机制&#xff1f;注意力机制的起源和发展里程碑&#xff09;。 2、注意力机制的基本原理&#xff08;什么是注意力机制&#xff1f;注意力机制的数学表达与基本公…...

深入解析 Umi-OCR:高效的免费开源 OCR 文字识别工具

1. Umi-OCR 简介 1.1 什么是 Umi-OCR&#xff1f; Umi-OCR 是一款开源、免费、支持离线使用的光学字符识别&#xff08;OCR&#xff09;工具&#xff0c;基于 PaddleOCR 和 Tesseract-OCR&#xff0c;能够高效识别图片中的文字&#xff0c;尤其适用于批量截图文字提取、PDF 文…...

WebAssembly技术及应用了解

WebAssembly&#xff08;Wasm&#xff09;是一种为Web设计的高效、低级的二进制指令格式&#xff0c;旨在提升Web应用的性能并支持多种编程语言。以下是对其核心概念、优势、应用场景及开发流程的系统介绍&#xff1a; 1. 核心概念 二进制格式&#xff1a;Wasm采用紧凑的二进制…...

【ESP-ADF】在 VSCode 安装 ESP-ADF 注意事项

1.检查网络 如果您在中国大陆安装&#xff0c;请使用魔法上网&#xff0c;避免无法 clone ESP-ADF 仓库。 2.VSCode 安装 ESP-ADF 在 VSCode 左侧活动栏选择 ESP-IDF:explorer&#xff0c;展开 advanced 并点击 Install ESP-ADF 然后会出现选择 ESP-ADF 安装目录。 如果出现…...

我的两个医学数据分析技术思路

我的两个医学数据分析技术思路 从临床上获得的或者公共数据库数据这种属于观察性研究&#xff0c;是对临床诊疗过程中自然产生的数据进行分析而获得疾病发生发展的规律等研究成果。再细分&#xff0c;可以分为独立危险因素鉴定和预测模型构建两种。 独立危险因素鉴定是一直以…...

MySQL 架构、索引优化、DDL解析、死锁排查

私人博客传送门 MySQL 认识索引 | 魔筝炼药师 MySQL 索引优化 | 魔筝炼药师 OnlineDDL&#xff08;在 MySQL 5.7 数据库里&#xff0c;InnoDB引擎&#xff0c;执行一条DDL会发生什么事情&#xff09; | 魔筝炼药师 MySQL 死锁排查 | 魔筝炼药师...

Ubuntu搭建最简单WEB服务器

安装apache2 sudo apt install apache2 检查状态 $ sudo systemctl status apache2 ● apache2.service - The Apache HTTP ServerLoaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese>Active: active (running) since Thu 2025-03-06 09:51:10…...

VSCode 配置优化指南:打造极致高效的前端开发环境

VSCode 配置优化指南&#xff1a;打造极致高效的前端开发环境 一、基础环境配置&#xff1a;让开发更流畅 1. 性能优化设置 // settings.json {"files.autoSave": "afterDelay", // 自动保存&#xff08;延迟1秒&#xff09;"files.exclud…...

FPGA-DE2115开发板实现4位全加器、3-8译码器。

文章目录 一、安装quartus二、4位全加器三、3-8译码器&#xff08;8段数码管&#xff09;四、参考文章 一、安装quartus 安装quartus参考文章&#xff1a;Quartus Prime 18.0与ModelSim的安装 Quartus II 18.0安装教程&#xff08;非常详细&#xff09;从零基础入门到精通&…...