0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于MATLAB单元测试的过程以及结果分析

MATLAB 来源:djl 作者:oopmatlab 2019-09-17 17:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在inputParser章节中,我们通过不断改进getArea函数对输入参数的处理方法,引入这样一个观点:一个可靠的科学工程计算项目必须有一套测试系统,才能防止开发的过程中算法退化,工程项目的推进必须在算法开发和算法测试之间不断迭代完。在inputParser章节的最后,还根据直觉提出了一个测试系统所应该有的基本功能。在本章中,我们将学习MATLAB提供的测试解决方案:MATLAB单元测试(MATLAB Unit Test)。

基于函数的(Function-Based)单元测试的构造

MATLAB基于函数的单元测试构造很简单,如图1所示:用户通过一个主测试函数和若干局部测试函数(也叫做测试点,Local Function)来组织各个测试。而测试的运行则交给MATLAB的单元测试架构(以下简称Framework)去完成。

关于MATLAB单元测试的过程以及结果分析

图1 单元测试Framework和测试函数

主测试函数和局部测试函数看上去和普通的MATLAB函数没有区别,其结构如图2所示,只是命名上有一些规定而已,这些特殊的规定是为了Framework可以和测试函数契合而规定的。

关于MATLAB单元测试的过程以及结果分析

图2 简单的主测试函数和若干局部的测试函数构成的一个单元测试

命名规则如下:

主函数的名称由用户任意指定,和其他的MATLAB函数文件一样,该文件的名称需要和函数的名称的相同(如果主函数的名称是testmainfunc,该文件名称则是testmainfunc.m)

在主函数中,必须调用一个叫做functiontests的函数,搜集该函数中的所有局部函数,产生一个包含这些局部函数的函数局部的测试矩阵并返回给Framework

如下所示:

关于MATLAB单元测试的过程以及结果分析

其中localfunctions是一个MATLAB函数,用来返回所有局部函数的函数句柄。局部函数的命名必须以test开头,局部函数只接受一个输入参数,即测试对象,即下面例子中的形参testCase:

关于MATLAB单元测试的过程以及结果分析

其中testCase由单元测试Framework提供,即Framework将自动的调用该函数,并且提供testCase参数。按照规定,要运行单元测试中的所有测试,必须调用runtests函数:

关于MATLAB单元测试的过程以及结果分析

下面用我们用基于函数的单元测试来给getArea函数的构造其单元测试。

getArea函数的单元测试:版本 I

首先给主测试文件起个名字叫做testGetArea,该名字是任意的,为了便于理解名字里面通常包含test,并包含要测试的主要函数的名字:

关于MATLAB单元测试的过程以及结果分析

在该主函数中,localfunctions将搜集所有的局部函数,构造函数句柄数组并返回测试矩阵。这里自然会有一个问题,这个tests句柄数组将返回给谁,这就要了解Framework是如何和测试相互作用的。如图3所示,整个测试从runtests('testmainfunc.m')命令开始, 命令函数,Framework将首先调用testGetArea的主函数,得到所有的局部函数的函数句柄,如空心箭头线段所示,然后Framework再负责调用每一个测试局部函数,并且把testCase当做参数提供给每个局部函数,如虚线线段所示。我们可以把Framework想象成一个流水线,用户只需要通过runtests('testmainfunc.m')把“testmainfunc.m”放到流水线上并且“打开开关”就可以了。它是MATLAB的类matlab.unittest.FunctionTestCase的对象。

关于MATLAB单元测试的过程以及结果分析

图3 单元测试Framework和测试函数的相互作用

返回的testCase是类matlab.unittest.FunctionTestCase的对象,有很多成员验证方法可以提供给用户调用,我们的第一版的getArea函数如下, 要求函数接受两个参数,并且都是数值类型:

关于MATLAB单元测试的过程以及结果分析

我们先给这个getArea写第一个测试点,确保测试getArea函数在接受两个参数的时候,能给出正确的答案:

关于MATLAB单元测试的过程以及结果分析

我们给testGetArea.m添加一个局部函数叫做testTwoInputs,按照规定,该局部函数的名字要以test开头,后面的名字要能够尽量反应该测试点的实际测试的内容。verifyTrue是一个testCase对象所支持的方法,它用来验证其第一个参数,作为一个表达式,是否为真。verifyTrue的第二个参数接受字符串,在测试失败时提供诊断提示。一个很常见的问题是:getArea是一个极其简单的函数,内部的工作就是把两个输入相乘,在这里验证getArea(10,22) == 220真的有必要吗?请读者记住这个问题,它是理解单元测试的精要之一。下面我们来运行这个测试:

关于MATLAB单元测试的过程以及结果分析

测试返回一个matlab.unittest.TestResult对象,其中包括运行测试的结果,不出意料我们的函数通过了这轮简单的测试。如果函数没有通过测试,比如我们故意要验证一个错误的结果:getArea(10,22) ==0。

关于MATLAB单元测试的过程以及结果分析

Framework将给出详尽的错误报告, 其中Test Diagnostic栏目中报告的就是verifyTrue函数中的第二个参数所提供的诊断信息。

关于MATLAB单元测试的过程以及结果分析

我们再添加一个负面测试,回忆第一版的函数getArea不支持单个参数,如下:

关于MATLAB单元测试的过程以及结果分析

我们可以利用lasterr函数得到了这个错误的Error ID,这个Error ID将在负面测试中用到。下面是这个负面测试,验证在只有一个输入的情况下,getArea函数能够如预期报错。我们给测试添加一个新的测试点,叫做testTwoInputsInvalid。

关于MATLAB单元测试的过程以及结果分析

在testTwoInputsInvalid中,我们使用了测试对象的verifyError成员函数,它的第一个参数是函数句柄,即要执行的语言(会出错的语句),第二个参数是要验证的MATLAB错误的Error ID, 就是我们前面用lasterr函数得到的信息。verifyError内部还有try和catch,可以运行函数句柄,捕捉到错误,并且把Error ID和第二个参数做比较。再举一个例子,我们先在getArea函数中规定所有的输入必须是数值类型,所以如果输入的是字符串,getArea将报错,先再命令行中实验一下,以便得到Error ID:

关于MATLAB单元测试的过程以及结果分析

然后再把这个负面测试添加到testGetArea中去:

关于MATLAB单元测试的过程以及结果分析

运行一遍,一个正面测试,一个负面测试都全部通过。

关于MATLAB单元测试的过程以及结果分析

getArea函数的单元测试: 版本II & III

测试的准备和清理工作: Tests Fixtures

验证方法: Types of Qualification

测试方法论和以测试驱动开发(Test-Driven Development)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符串
    +关注

    关注

    1

    文章

    596

    浏览量

    23216
  • 函数
    +关注

    关注

    3

    文章

    4422

    浏览量

    67866
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用VectorCAST/C++的AI辅助测试功能

    从2026版本开始,VectorCAST/C++推出首批AI辅助测试功能,旨在帮助开发团队解决单元测试过程中的两个核心难点:
    的头像 发表于 04-27 14:37 262次阅读

    前端的单元测试

    https://www.bilibili.com/opus/1178756596191199237 从入门到会写:前端单元测试最佳学习路径 在当今的互联网开发江湖中,前端技术栈的更新迭代速度令人咋舌
    的头像 发表于 03-19 16:05 585次阅读

    半导体嵌入式单元测试的核心技术、工具选型与落地全流程

    函数能够满足实际业务需求。4.2.3 持续优化测试流程随着项目的进展,测试流程需要不断优化。要定期对测试用例库进行维护,删除无效的测试用例,添加新的
    发表于 03-06 14:55

    嵌入式软件单元测试必要性与专业工具重要性的系统性专业研究报告

    。‌单元测试‌作为在代码编写阶段对最小功能单元(函数、模块)进行验证的实践,成为突破这一困境的核心手段。 ‌2. 必要性:实证数据与行业强制要求 ‌2.1 缺陷修复成本的指数级差异 表格 阶段 缺陷修复成本
    发表于 03-05 10:41

    资料] 汽车软件质量跃迁的系统性路径:基于ISO 26262标准的单元测试体系重构与中日实践深度对比(2026学术研究报告)

    各位伙伴,请问一个问题,[资料] 汽车软件质量跃迁的系统性路径:基于ISO 26262标准的单元测试体系重构与中日实践深度对比(2026学术研究报告),这份数据谁有源参考文献,有酬感谢
    发表于 01-08 10:09

    汽车软件质量跃迁的系统性路径:基于ISO 26262标准的单元测试体系重构与中日实践深度对比(2026学术研究报告)

    %源于软件逻辑错误,其中32%因单元测试边界条件未覆盖(TÜV SÜD《2024汽车软件召回分析》)。典型案例包括某新势力车企因制动模块未测试导致1.2万辆召回,损失超5亿元。 1.2 软件定义汽车
    发表于 01-05 14:58

    嵌入式软件单元测试中AI自动化与人工检查的协同机制研究:基于专业工具的实证分析

    ‌ ‌摘要****‌ 本文系统探讨嵌入式软件相较于通用软件在单元测试层面的特殊性,分析其对高覆盖率、可追溯性与实时性验证的严苛需求,并以专业工具winAMS为技术载体,深入研究AI驱动的自动化测试
    发表于 12-31 11:22

    C语言单元测试在嵌入式软件开发中的作用及专业工具的应用

    功能包括: 测试通过/失败统计 代码覆盖率可视化 执行时间分析 缺陷跟踪和报告生成 winAMS的图形化界面可以直观展示测试结果和覆盖率数据。 七、总结与展望 C语言
    发表于 12-18 11:46

    嵌入软件单元测试的全面研究与实践

    作为软件开发过程中最早进行的测试活动,能够有效隔离代码片段,验证其功能是否符合设计预期,从而在早期阶段发现潜在缺陷,提升代码质量。本文将系统探讨嵌入软件单元测试的标准流程、方法论、工具选择、工程师能力要求、实际案例
    的头像 发表于 12-01 14:31 885次阅读

    新能源汽车质量保证体系与传统汽车单元测试规范的融合研究

    摘要 随着新能源汽车产业的快速发展,其质量保证体系面临前所未有的挑战。本文探讨了将传统汽车成熟的单元测试规范应用于新能源汽车领域的可行性,重点分析了ISO 26262标准体系在新能源汽车电子控制系统
    的头像 发表于 11-07 10:10 407次阅读

    单元测试专业工具在新能源开发中的作用研究

    单元测试的历史由来与发展 单元测试的概念可以追溯到20世纪60年代,伴随着计算机科学和软件工程学科的发展而逐步形成。早期的计算机科学研究(20世纪60年代)中,程序员意识到仅依靠手工调试和集成测试
    的头像 发表于 11-03 16:03 569次阅读

    边聊安全 | 软件单元测试的设计方法

    上海磐时PANSHI“磐时,做汽车企业的安全智库”软件单元测试的设计方法写在前面:软件单元测试的设计是一个系统化的过程,旨在验证代码的最小可测试部分(通常是函数或方法)是否按预期工作。
    的头像 发表于 09-05 16:18 9745次阅读
    边聊安全 | 软件<b class='flag-5'>单元测试</b>的设计方法

    HarmonyOSAI编程单元测试用例

    根据选中的ArkTS方法名称,CodeGenie支持自动生成对应单元测试用例,提升测试覆盖率。 在ArkTS文档中,光标放置于方法名称上或框选完整的待测试方法代码块,右键选择CodeGenie
    发表于 08-27 14:33

    新能源车软件单元测试深度解析:自动驾驶系统视角

    分之一以下。 ‌ 案例分析: ‌ 2022年某车企因电机控制算法中的整数溢出未在单元测试中发现,导致车辆在高速行驶时突然动力中断,引发大规模召回。该事件凸显了单元测试在预防系统性故障中的核心作用
    发表于 05-12 15:59

    新能源车背后的隐形守护者:软件单元测试的生死较量‌

    。这个教科书级的避让动作背后,是超过8000万行代码的精密协作,而确保这些代码绝对可靠的秘密武器,正是我们今天要揭秘的软件单元测试。 ‌一、代码世界的显微镜:单元测试为何重要‌ 如果把整车软件比作一座摩天大楼,单元测试就是检查
    的头像 发表于 05-12 11:00 723次阅读