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

    文章

    594

    浏览量

    23049
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

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

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

    HarmonyOSAI编程单元测试用例

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

    HarmonyOS AI辅助编程工具(CodeGenie)代码测试

    本功能从DevEco Studio 5.1.0 Release版本开始支持。 根据选中的ArkTS方法名称,CodeGenie支持自动生成对应单元测试用例,提升测试覆盖率。 在ArkTS文档中,光标
    发表于 07-14 17:33

    普源示波器如何连接MATLAB实现数据采集与分析

    普源示波器(Rigol)作为国内知名的测试测量仪器品牌,广泛应用于电子工程、科研实验、教学等领域。为了进一步扩展其功能,用户常需将示波器与MATLAB等数据分析平台连接,实现自动化测试
    的头像 发表于 05-29 09:34 728次阅读

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

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

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

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

    电机瞬态过程分析MATLAB建模与仿真

    时均可引起电机的瞬态过程。例如,变压器的空载合闸、电动机的启动、制动、调速,发电机的励磁调节,电机正常运行时的负载改变以及突然不正常运行等。电机的瞬态过程一般来说持续时间很短,但在不利的情况下,可能导致
    发表于 04-29 16:29

    单元测试在嵌入式软件中的关键作用及winAMS工具的卓越贡献

    1. 单元测试概述 ‌定义与核心目标‌ 单元测试是软件开发过程中针对程序模块(如函数、类或组件)的最小可测试单元进行的验证活动。其核心目标在
    的头像 发表于 04-11 14:31 771次阅读

    嵌入式软件单元测试的必要性、核心方法及工具深度解析

    一、为什么嵌入式软件必须重视单元测试? ‌嵌入式系统的特殊性‌ 在汽车 ECU、医疗设备控制器等场景中,软件直接操控硬件,‌单比特错误可能导致刹车失灵或呼吸机故障‌。不同于 PC 软件可频繁热更新
    的头像 发表于 03-21 14:53 990次阅读

    功率分析仪测量结果的影响因素

    在使用功率分析仪进行测试过程中,有时虽然面对同样的信号,因使用设备的不同测量结果会出现较大偏差,即使更换同一品牌功率分析仪,也可能出现一些差异,这些时候,往往是现场
    的头像 发表于 03-14 10:22 576次阅读
    功率<b class='flag-5'>分析</b>仪测量<b class='flag-5'>结果</b>的影响因素

    在橡胶体积表面电阻率测试过程中,电磁干扰对测试结果的影响,如何有效屏蔽

    在使用体积表面电阻率测试仪对橡胶进行电学性能测试时,电磁干扰是一个不容忽视的关键因素。测试仪的工作原理基于对通过橡胶试样的电流进行精准测量,进而推算出电阻值。然而,电磁干扰会对这一过程
    的头像 发表于 03-13 13:14 646次阅读
    在橡胶体积表面电阻率<b class='flag-5'>测试过程</b>中,电磁干扰对<b class='flag-5'>测试</b><b class='flag-5'>结果</b>的影响,如何有效屏蔽

    影响OTDR测试结果的因素

    光时域反射仪(OTDR)是光纤通信领域中不可或缺的测试工具。它通过发送光脉冲并测量反射回来的光信号,来确定光纤链路的长度、损耗和故障位置。然而,OTDR测试结果的准确性受到多种因素的影响。 1.
    的头像 发表于 12-31 09:22 1625次阅读