优快云 c/c++电子杂志第一期 之 CPPUnit测试框架入门

如何处理动态语言(Python / JS)的“隐形”调用链? 本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。 阅读详情

□     工 具 使 用

 


 


文 / cpluser(Clean code that works.)

 

演示代码下载

测试驱动开发(TDD,Test-Driven Development)是以测试作为开发过程的中心,它坚持,在编写实际代码之前,先写好基于产品代码的测试代码。开发过程的目标就是首先使测试能够通过,然后再优化设计结构。测试驱动开发式是极限编程的重要组成部分。xUnit,一个基于测试驱动开发的测试框架,它为我们在开发过程中使用测试驱动开发提供了一个方便的工具,使我们得以快速的进行单元测试。xUnit的成员有很多,如JUnit,PythonUnit等。今天给大家介绍的CppUnit即是xUnit家族中的一员,它是一个专门面向C++的测试框架。

本文不对CppUnit源码做详细的介绍,而只是对CppUnit的应用作一些介绍。在本文中,您将看到:

1、CppUnit源代码的各个组成部分。

2、怎样设置你的开发环境以使用CppUnit。

3、怎样为你的产品代码添加测试代码(实际上应该反过来,为测试代码添加产品代码。在TDD中,先有测试代码后有产品代码),并通过CppUnit来进行测试。

本文叙述背景为:CppUnit1.9.0, Visual C++ 6.0, Windows2000。文中叙述有误之处,敬请批评指正。

 

一、CppUnit源码组成

CppUnit测试框架的源代码可以到 http://sourceforge.net/projects/cppunit/ 上下载。下载解压后,你将看到如下文件夹:

图1

 

 

 

 

 

 

 


主要的文件夹有:

doc: CppUnit的说明文档。另外,代码的根目录,还有三个说明文档,分别是INSTALL,INSTALL-unix,INSTALL-WIN32.txt。

examples: CpppUnit提供的例子,也是对CppUnit自身的测试,通过它可以学习如何使用CppUnit测试框架进行开发。

include: CppUnit头文件。

src: CppUnit源代码目录。

 

二、初识CppUnit测试环境

解压源代码包后,您一定急着想看看CppUnit到底是个什么样?Ok,下面我们就来揭开CppUnit的神秘面纱。

1、进入example文件夹,用VC打开examples.dsw。我们先来看看CppUnit自带的测试例子。这些例子都是针对CppUnit自身的单元测试集,一方面这是CppUnit作者开发CppUnit框架过程中写的测试用例,另一方面,我们可以通过这些例子来学习如何在我们自己的工程中添加测试用例。

2、将CppUnitTestApp工程设为Active Project(Win32 Debug),编译后运行,则可以看到CppUnit的基于GUI方式进行单元测试TestRunner的界面。点击“Run”,将会看到如图2所示界面:

图2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


图3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


这是一个针对CppUnit的单元测试结果,它表明刚才我们做了11个测试,全部通过。

点击“Browse”,我们还可以选择想要进行的单元测试,如图3:

 

CppUnit将所有的单元测试按照树的结构来表示。在CppUnit中,最小的测试单元,称为TestMethod测试方法,而多个相关的测试方法又可以组成一个TestCase测试用例。多个测试用例又组成TestSuite测试包。测试包互相嵌套在一起,就形成了上面我们看到的树结构。我们可以选择其中任意的树节点来进行单元测试。

3、将CppUnitTestMain工程设置为Active Project(Win32 Debug),编译并运行,我们来看看另一个单元测试的环境,如图4:

图4

 

 

 

 

 

 


这是一个基于文本方式的单元测试环境。CppUnit提供了几种测试环境,一种基于文本,一种基于GUI,即图3。

 

4、将HostApp工程设置为Active Project(Win32 Debug),编译运行。如图5:

图5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


这亦是一个对CppUnit自身进行的测试,只不过它向我们演示的是各种失败的测试。在基于GUI的测试环境中,若测试不成功,进度条显示红色,反之则为绿色。从测试结果我们可以看到失败的单元测试名称,引起测试不能通过的原因,以及测试失败的语句所在的文件及所在行数。

 

三、CppUnit开发环境设置

 

认识了CppUnit的测试环境,想必你已经是在磨拳擦掌,准备在你的开发过程中感受一下测试驱动开发的感觉了。不过,在使用CppUnit前,还需要设置一下你的开发环境。

 

1、CppUnit的lib和dll

CppUnit为我们提供了两套框架库,一个为静态的lib,一个为动态的dll。

 

cppunit project:静态lib

cppunit_dll project:动态dll和lib

 

在开发中我们可以根据实际情况作出选择。进入src文件夹,打开CppUnitLibraries.dsw。分别编译这两个project,输出位置均为lib文件夹。

另外一个需要关注的project是TestRunner,它输出一个dll,提供了一个基于GUI 方式的测试环境,即前面我们提到的两种测试环境之一。我们也需要编译这个project,输出位置亦为lib文件夹。

为了方便开发,我们把这些编译出来的lib和dll(包括Debug版和Release版) copy 到我们自己建立的一个文件夹中(当然你也可以不这么做),例如F:/cppunit1.9.0/lib/,同时我们也把CppUnit源代码中include文件夹copy到我们自己的include文件夹下。然后在VC的tools/options/directories/include files和library files中设置include路径和lib路径。最后别忘了在你的project中link正确的lib。

 

2、在你的VC project中打开RTTI开关。

具体位置Project Settings/C++/C++ Language。

 

3、为TestRunner.dll设置环境变量

TestRunner.dll为我们提供了基于GUI的测试环境。为了让我们的测试程序能正确的调用它,TestRunner.dll必须位于你的测试程序的路径下。但最简单的方法是在操作系统的环境变量Path中添TestRunner.dll的路径,这样是最省事的。

 

四、你的第一个TDD example

 

一切准备就绪,现在我们可以来看看怎样添加测试代码了。前面我们提到过,CppUnit最小的测试单位是TestCase,多个相关TestCase组成一个TestSuite。要添加测试代码最简单的方法就是利用CppUnit为我们提供的几个宏来进行(当然还有其他的手工加入方法,但均是殊途同归,大家可以查阅CppUnit头文件中的演示代码)。这几个宏是:

 

CPPUNIT_TEST_SUITE() 开始创建一个TestSuite

CPPUNIT_TEST() 添加TestCase

CPPUNIT_TEST_SUITE_END() 结束创建TestSuite

CPPUNIT_TEST_SUITE_NAMED_REGISTRATION() 添加一个TestSuite到一个指定的TestFactoryRegistry工厂。

 

感兴趣的朋友可以在HelperMacros.h看看这几个宏的声明,本文在此不做详述。

 

1、一个实现两个整数相加的类

假定我们要实现一个类,类名暂且取做CPlus,它的功能主要是实现两个数相加(多简单的一个类啊,这也要测试吗?不要紧,我们只是了解怎样加入测试代码来测试它就行了,所以越简单越好)。假定这个类要实现的相加的方法是:

 

int Add(int nNum1, int nNum2);

 

Ok,那我们先来写测试这个方法的代码吧。TDD 可是先写测试代码,后写产品代码(CPlus)的哦!先写的测试代码往往是不能运行或编译的,我们的目标是在写好测试代码后写产品代码,使之编译通过,然后再进行重构。这就是Kent Beck说的“red/green/refactor”( 还记得基于GUI的测试环境的状态条吗?)。所以,上面的类名和方法应该还只是在你的心里,还只是你的idea而已。

 

2、在VC中为测试代码建立一个 Project

通常,测试代码和被测试对象是处于不同的Project中的。这样就不会让你的产品代码被测试代码所“污染 ”。

在本例中,我们将建立一个基于GUI 方式的测试环境。在VC中,我们建立一个基于对话框的Project。别忘了link正确的lib,本例中我们使用静态的CppUnit lib。由于我们希望这个Project运行后显示的是图2这样的界面,所以我们需要在App的 InitInstance()中屏蔽掉原有的对话框,代之以CppUnit的GUI。

CppUnit::MfcUi::TestRunner runner;

   runner.addTest(PlusTest::suite()); //添加测试

   runner.run(); //show UI

   /*

   CCPlusTestDlg dlg;

   m_pMainWnd = &dlg;

   int nResponse = dlg.DoModal();

   if (nResponse == IDOK)

   {

      // TODO: Place code here to handle when the dialog is

      // dismissed with OK

   }

   else if (nResponse == IDCANCEL)

   {

      // TODO: Place code here to handle when the dialog is

      // dismissed with Cancel

    }

    */

前面我们提到过,TestRunner输出图2这样的对话框,这也是前面我们为什么要为TestRunner.dll的路径设置环境变量的原因。

注意:PlusTest::suite()返回一个指向CppUnit::Test的指针.这个指针就是整个测试的起点。CppUnit::TestFactoryRegistry::getRegistry()根据TestSuite的名字返回TestFactoryRegistry工厂,然后调用工厂里的makeTest()对TestSuite进行组装,这是个递归调用,将建立起一个树状的测试结构。

namespace PlusTest

   {

       CppUnit::Test* suite()

       {

           CppUnit::TestFactoryRegistry &registry =

           CppUnit::TestFactoryRegistry::getRegistry(plusSuiteName());

           return registry.makeTest();

       }

   }

另外别忘加头文件:

#include "CPlusTestSuite.h"
    #include <cppunit/ui/mfc/TestRunner.h>
    #include <cppunit/extensions/TestFactoryRegistry.h>

3、在Project中加入一个类,取名CPlusTestCase

CPlusTestCase从CppUnit::TestCase继承,代码如下:

class CPlusTestCase : public CppUnit::TestCase

   {

       CPPUNIT_TEST_SUITE(CPlusTestCase);

       CPPUNIT_TEST(testAdd);

       CPPUNIT_TEST_SUITE_END();

     public:

       CPlusTestCase();

       virtual ~CPlusTestCase();

       void testAdd(); //测试方法

   };

看到这几个宏了吗?它们可是在这大显身手了一把。

 

CPPUNIT_TEST_SUITE(CPlusTestCase);

CPPUNIT_TEST( testAdd );

CPPUNIT_TEST_SUITE_END();

 

通过这几个宏,我们就把CPlusTestCase和testAdd注册到了测试列表当中。

另外,我们需要在Cpp文件中加入另外一个宏:

CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CPlusTestCase,PlusTest::plusSuiteName() );

它将CPlusTestCase这个TestSuite注册到一个指定的TestFactory工厂中,这个TestSuite用 PlusTest::plusSuiteName()函数返回的名字来标识(前面介绍的suite()函数中就是通过这个名字来获取这个工厂的)。plusSuiteName()是PlusTest这个namespace下的一个函数,它返回我们为这个TestSuite建立的名字(本例我们取名为“plus”)。其实我们也可以不用这么做,直接在宏里写入“plus“即可。但是这样可以防止硬编码带来的麻烦。

在测试类中,我们添加了一个测试方法:

void testAdd();

它测试的对象是前面提到的CPlus类的方法:

int Add(int nNum1, int nNum2);

我们来看看它的实现:

void CPlusTestCase::testAdd()

   {

        CPlus plus;

        int nResult = plus.Add(10, 20); //执行Add操作

         CPPUNIT_ASSERT_EQUAL(30, nResult); //检查结果是否等于30

}

 CPPUNIT_ASSERT_EQUAL是一个判断结果的宏。CppUnit中类似的其它宏请查阅TestAssert.h,本文在此不做详述 。

另外,我们还可以覆写基类的 setUp()、tearDown()两个函数。这两个函数实际上是一个模板方法,在测试运行之前会调用setUp()以进行一些初始化的工作,测试结束之后又会调用tearDown()来做一些“善后工作” ,比如资源的回收等等。当然,你也可以不覆写这两个函数,因为它们在基类里定义成了空方法,而不是纯虚函数。 

另外,Cpp中要加入头文件:

#include "plusSuite.h"

4、根据测试代码编写产品代码

编写完上面的测试代码后,进行编译。编译肯定通不过,编译器会告诉我们CPlus类没有声明,因为我们还没有实现CPlus类呢!现在的工作就是马上实现CPlus类,让编译通过。现在你应该嗅到一点“测试驱动”的味道了吧?

在VC中建立一个MFC Extension Dll的Project,在这个Project 中加入类CPlus,它的声明如下:

class AFX_EXT_CLASS CPlus

   {

      public:

          CPlus();

          virtual ~CPlus();
      public:

          int Add(int nNum1, int nNum2);

        };

仅有一个方法,就是我们的测试代码要测试的那个方法。来看看它的实现:

int CPlus::Add(int nNum1, int nNum2)

   {

        return nNum1+nNum2;

}

 

 

 

 

 

 

 

 

 

 

 

 

图6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


单击“Browse”, 如图7:

图7

 

 

 

 

 

 

 


    这下你应该对前面我们说的TestSuite的名字理解更深了吧。plus是一个测试包TestSuite,它的下面包含一个测试用例,这个测试用例下面又包含一个测试方法。

 

至此,我们对CppUnit测试框架的应用作了一个详细的介绍,希望能对你在进行TDD过程中有所帮助。

 

参考资料: CppUnit源码及说明文档

类型即护栏:Pydantic AI 1.0 如何把 Agent 从字符串胶水变成可测试的 Python 程序 Pydantic AI 1.0 将 Agent 开发从“提示词胶水”升级为可测试、类型安全的 Python 程序。通过泛型 Agent[Deps, Output]、依赖注入、工具与输出的 Pydantic 校验,实现输入输出自动校验、错误重试与可观测性。核心机制如类型护栏、审批挂起、持久执行,让复杂流程可复现、可调试、可生产级部署,真正把模型行为约束在代码契约之内。 阅读详情

相关推荐

Python使用netmiko配置华为交换机

1.netmiko就是专门为网络设备做的模块,非常强大。1.更适合网络设备的自动化运维模块。2、批量配置变更、备份。1.安装netmiko。2. 创建SSH连接。一、netmiko介绍。

博然的宝藏库 2795

从瀑布到流水线:DevOps 入门与 GitLab + Jenkins + Docker 落地实践

先看清软件开发生命周期(SDLC)的全貌,再对比瀑布模型与敏捷开发,随后进入持续集成与 CI/CD 的机制内核;最后落到实操——在 GitLab、Jenkins、Docker 组成的四机实验环境里,走完源码托管、自动化构建、镜像封装与远程部署,直到参数化构建与版本回滚。概念与命令并重,既是入门地图,也是操作手册。

年轻的时候很穷,经过我多年的努力,终于不再年轻。 281

Cadence IC618与Spectre231安装配置全攻略:License、环境变量与依赖检查

EDA工具部署中,License管理与环境变量隔离是核心难点。FlexLM作为通用授权机制,通过守护进程和端口配置实现工具授权;环境变量则控制工具路径与库加载顺序,避免版本冲突。合理配置可确保IC618与Spectre231稳定运行,提升仿真效率。典型应用场景包括模拟IC设计、高校实验室及企业级EDA环境。本文聚焦Cadence IC618与Spectre231的安装实践,详解License配置、环境隔离及依赖检查,助你快速搭建可靠设计环境。

weixin_28721917的博客 326

训练数据示例

针对“规格书生成测试用例脚本”的任务,在 LLaMA-Factory 中使用即可。关键是把“规格书内容”放进input字段,把“期望的脚本输出”放进output字段。

liuxs2009的专栏 59

PyTorch实战(7)——循环神经网络

本节介绍了循环神经网络 (RNN) 及其在序列数据处理中的应用。首先对比了卷积神经网络 (CNN) 与 RNN 的差异,指出 RNN 通过循环连接建模时序依赖关系。随后详细梳理了 RNN 的发展历程,包括基础 RNN、双向 RNN、LSTM、GRU 等变体的结构特点及改进动机,其中 LSTM 通过门控机制解决长程依赖问题,GRU 则进一步简化结构。接着通过 IMDb 情感分析实战,演示了如何使用 PyTorch 实现文本预处理、RNN 模型构建及训练评估流程,最后探讨了注意力机制如何提升 RNN 性能。

盼小辉丶的博客 1万+

收放卷伺服控制系统详细算法介绍(电子齿轮+张力PID卷绕轴控制功能块)

收放卷控制系统涉及的内容非常多,这里我们介绍全伺服系统利用电子齿轮指令实现主从轴的比例随动速度控制,收放卷控制算法介绍常用链接如下1、收放卷+排线控制收放卷+排线控制系统框图-优快云博客文章浏览阅读24次。1、收放卷前馈量计算FC收放卷前馈量计算FC(CODESYS ST源代码)-优快云博客文章浏览阅读16次。1、收放卷前馈量计算FC(博途PLC):收放卷前馈量计算FC(梯形图+SCL代码)-优快云博客文章浏览阅读534次。2、收放卷前馈量计算FC。

RXXW_Dor的博客 3122

DNS 不是把域名翻译成 IP:递归解析、TTL 缓存、CNAME 与报文排错实战

本文通过离线Python实验,拆解DNS递归解析、缓存机制与报文结构,揭示“DNS不是全局映射表”的本质。重点解析递归器角色、TTL衰减、CNAME链处理、负缓存隔离及修改记录延迟生效等核心问题,结合实战排错案例,阐明缓存层级、事务匹配、截断处理与安全边界,强调从应用到权威的逐层排查逻辑,实现可复现、可验证的DNS教学系统。

此人很懒,什么都没有写~~ 349

Vue3 - 详细实现微信公众号H5网页内置浏览器中预览下载word文档(doc)、excel表格(xls)、ppt文稿、pdf文档等文件,微信内部直接打开预览和下载到本地教程,安卓苹果手机无差异兼容

vue3,nuxt3,微信公众号,h5,移动端,网页,网站,vue微信内置浏览器下载文件,下载文件,在微信浏览器里面实现下载任意文件,H5需要在微信浏览器中下载excel文件,实现网页在微信内置浏览器中下载文件详细教程,安卓点击下载会提示打开浏览器,后端返回流文件,如何解决无法下载文件,跳转至浏览器下载文件,发送到电脑微信,安卓,苹果,手机系统,微信H5页面,vue3微信公众号H5网站,内置浏览器下载文档,如何在微信浏览器中预览office文件,word文档,excel文档,pdf文档,ppt文档,offi

🏆 前端领域优质创作者 1万+

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 132

极验点选click3.1.0所对应fullpage.js的逆向分析

极验3代点选验证,本文适用于使用click.3.1.0.js和fullpage919-eyz9lh.js版本的web验证码,没有细节内容,适合有基础的开发者阅读。

shanf7921的博客 648

PyTorch深度学习实战(25)——从零开始实现Mask R-CNN实例分割

Mask R-CNN 是一种在目标检测任务中引入了语义分割的强大框架,通过在 Faster R-CNN 基础上进行扩展,添加了额外的分支网络,不仅可以准确地检测对象的位置和类别,还可以生成每个实例的精确像素级别的语义分割掩码。其模块化的设计可以轻松地应用于不同的任务和数据集,并且可以通过添加更多的分支进行功能扩展,如实例关键点检测等。

盼小辉丶的博客 1万+

【LTE L3 笔记 09】LTE物理信道-PRACH

课程来源:B站《【2022】华为HCIA-LTE无线工程师认证学习中级视频》笔记为个人整理,含课件截图,仅供学习交流。

lyouhuan的博客 190

FPGA发展趋势:异构计算、AI加速、可重构计算

FPGA技术正朝着异构计算、AI加速和可重构计算三大方向发展。作为高效能计算平台,FPGA在异构架构中与CPU/GPU协同工作,发挥低延迟、高能效优势;在AI领域通过定制化架构实现边缘推理加速;其硬件可重构特性支持动态适应多样化计算需求。最新进展包括部分可重构技术、智能网卡和边缘AI应用。未来,FPGA将在自适应计算、量子接口和软件定义硬件等领域持续突破,成为异构计算架构的核心组件,推动硬件与软件的深度融合。性能对比显示FPGA在能效比(5-20TOPS/W)和灵活性方面具有显著优势。

2301_79143213的博客 969

密码存储不是 MD5 加盐:PBKDF2、scrypt、参数升级与安全验证实战

本文通过实战演示密码存储的正确做法:摒弃MD5加盐,采用PBKDF2与scrypt等高成本密钥派生函数,结合随机盐、版本化记录与严格解析,确保离线破解成本可控。模块实现安全验证、参数校验、透明升级与统一错误处理,强调算法选择需兼顾安全性与可维护性,提供教学级密码存储方案,助力构建可迁移、可审计的认证边界。

此人很懒,什么都没有写~~ 236

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

软件测试用例模板怎么写:从用例设计到执行记录的全套指南

测试用例是测试工作的核心产出,它决定测试覆盖了多少、漏掉了什么。但大多数人的测试用例写得像流水账——只有正常路径,没有异常场景;只有操作步骤,没有预期结果;只有功能测试,没有非功能测试。本文拆解测试用例的标准结构,说明每个字段的含义和写法,给出覆盖功能测试、性能测试、安全测试的完整用例范例,并列出测试用例设计的五个高频遗漏点。

wuwangzhiduoshao的博客 150

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【鸿蒙专题与实战】测试体系:单元测试、组件测试与 UI 测试

本文系统讲解鸿蒙开发中的三层测试实践:底层单元测试(用Hypium框架,优先覆盖纯函数、边界与异常)、中层ViewModel逻辑、顶层仅测3-5条关键UI路径。强调测试应“越往下写得越多”,因单元测试快且成本低,而UI测试慢易出错。通过实例说明断言拆分提升定位效率,结合覆盖率报告(hvigorwtest --coverage)发现盲区,核心是“用覆盖率找漏测,而非追求数字”。附五步落地清单:建测试文件、按优先级补用例、精简UI测试、生成报告、定位未覆盖行。下一篇将开启实战项目:从需求到上架全流程。

信息安全领域优质创作者|操作系统领域专家 185

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MCP实战06:传输实战、测试与部署

你的 MCP Server 写完了,怎么确认它真的能被宿主正确调用?这课给传输层实战三件套:MCP Inspector 可视化调试、协议级自动化测试(pytest 断言 JSON-RPC 报文结构)、stdio/HTTP 双传输部署。测试不是可选项——工具描述错一个字段宿主就调不对,你能给 Server 建起自己的回归测试。

Blockbuster-drug 774

大型高复杂度互联网项目管理经验心得

复杂项目,管理的核心不是管人,而是管理依赖和变更简单项目重点是排任务、盯进度;多端多关联系统的大型项目,大部分延期、故障根源都来自依赖失控、变更失控。项目经理首要工作是把看不见的依赖显性化,把随意变更变成受控变更,而不是单纯催开发进度。分批上线不是降低标准,而是拆分风险,小步可控很多人觉得分批上线麻烦,希望攒到一起发布。但集中上线会把所有风险集中在同一个窗口,一旦出问题,排查范围巨大、影响面广。分批发布本质是风险隔离,每一批只承载有限的变更,出问题更容易定位、回滚、止损。

zyx980193917的博客 174

【LTE L3 笔记 05】LTE同步信号

课程来源:B站《【2022】华为HCIA-LTE无线工程师认证学习中级视频》笔记为个人整理,含课件截图,仅供学习交流。

lyouhuan的博客 115

电芯串并联与BMS保护

串联升压、并联扩容,规则一句话,但整包能用多少由最弱的那节电芯说了算。这篇先算最弱电芯的账,再讲清三层保护,最后给对应的BMS测试用例:欠压、压差、均衡怎么测。BMS项目里有个常见场面:两台同配置的样车,电芯是同一批的,跑出来续航和限功率点却对不上。拆包量单体,一台里有一节电芯的容量比其他低了8%。整包表现被一节拖住,就是串并联的规矩在起作用。这篇先把规则和算例讲清,再讲保护分层,最后落到测试用例。

qq_43241255的博客 231

AI提效测试实践论

11、测试结束后,必须将任务过程中所有走了弯路,多次尝试的才成功操作的最终解决办法,按1、2、3...列点追加写入到当前文件的“特别注意要点”下(必须只记一行摘要,完整内容另存 [当前AGENTS.md文件所在的目录]\details\[序号].md)(如果新纪录的要点和历史要点存在冲突,必须直接对历史要点进行修正。`测试用例` 章节下必须按用例分层组织为 `冒烟集`、`主流程集`、`边界集`、`回归集` 四个子集,并在 `用例结果汇总` 中统计各分层集的用例数量。3、是否存在BUG;没有则写“无”> |

weixin_44711513的博客 124

工作流 vs 自主 Agent:5 种设计模式与 3 种建模方式详解

本文基于 Anthropic《Building Effective Agents》指南,系统梳理了AI应用中的两类核心架构:Workflow(编排式)与Agent(自主智能体)。强调“能画流程图就不上Agent”,提出从简单提示链到复杂自主决策的5种可组合工作流模式,并给出选型口诀与工程实践建议。核心观点:优先用确定性、可审计的Workflow,仅在任务路径未知时启用Agent,避免盲目复杂化。

分享大数据、java相关的技术 175

AI重构工业软件|泛联新安亮相第四届工业软件创新发展学术会议

两天会议,从院士报告里的战略判断,到灯塔工厂的实战复盘,再到泛联新安总部的体系拆解,其实都在回答同一个问题:AI重构工业软件,怎么从“演示可用”走到“生产敢用”。没有合理的裁判体系为AI任务结果进行验收,人类工程师的精力最终会疲于为AI产出做确认和兜底。工业软件和关键装备行业的AI转型,缺的从来不是模型,而是让模型可以被信任的那套工程体系。这也是唐勇博士在主论坛报告里反复强调的结论。这个问题没有一次性答案,我们会持续把可信智能体的工程实践公开出来。

flxa19310090839的博客 48

SpringBoot 的那些常用扩展点

JsonPropertySourceLoader,实现PropertySourceLoader接口@Override//这个方法表明这个类支持解析以json结尾的配置文件@Override//将文件内容读到 ByteBuffer 中//将读出来的字节转换成字符串// 将字符串转换成 JSONObject//将 json 的键值对读出来,放入到 map 中。

sxlishaobin的博客 84

高远-无网环境智能化测试用例下发:让智驾测试在无网环境也能闭环跑通

智能驾驶测试常发生在地下车库、隧道、野外、沙漠等弱网或无网场景。用例在云端、现场断网打不开,缺陷只能纸笔记录、回网手工补录,耗时且易错。本文以 高远-无网环境智能化测试用例下发 为例,拆解一套"出发前下发用例、现场离线记录、回网一键回写"的闭环方案,并给出可直接落地的工程实现。

2601_96352604的博客 258

计算机毕业论文系统测试怎么写:从测试用例设计到对比实验,让“工作量“看得见

本文系统阐述计算机毕业论文中“系统测试”章节的撰写方法,涵盖功能测试用例设计(等价类、边界值、判定表)、性能测试压测方案与关键指标(平均响应时间、P99、吞吐量)、对比实验设计原则及评价指标选取。强调通过量化数据、阶梯加压曲线、瓶颈定位与多维度对比,真实展现研究工作量与技术深度,提供可直接套用的测试用例表与实验方案模板,助力论文脱颖而出。

wuwangzhiduoshao的博客 301
上一篇: 优快云 C/C++电子杂志第一期 之 泛型函数指针类
下一篇: 优快云 C/C++电子杂志第一期 之 可变参数学习笔记
emag_cpp
博客等级 码龄22年 21粉丝 6原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值