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

    文章

    584

    浏览量

    20552
  • 函数
    +关注

    关注

    3

    文章

    4338

    浏览量

    62739
收藏 人收藏

    评论

    相关推荐

    嵌入式系统开发中的测试方法 嵌入式系统开发与AI结合应用

    嵌入式系统开发中的测试方法 嵌入式系统开发是一个复杂的过程,涉及到硬件和软件的紧密结合。测试是确保系统可靠性和性能的关键步骤。以下是一些常用的测试方法:
    的头像 发表于 12-09 10:22 401次阅读

    开发者必读!CircleCI 组件测试单元测试全解析

    在软件开发中,测试是保证软件质量和可靠性的关键环节。作为领先的 CI/CD 平台,CircleCI 提供了支持自动化测试的强大工具。其中,单元测试和组件测试是两种重要的
    的头像 发表于 12-03 09:18 249次阅读

    汽车软件单元测试的重要性

    测试不充分密切相关,这引发了社会各界对汽车软件健壮性的重要性进行深入思考。本文将探讨汽车软件的测试,尤其是单元测试的重要性,以及WinAMS单元测
    的头像 发表于 11-29 10:57 190次阅读

    严格的单元测试造就完美的软件

    关键系统时,更是对软件质量提出了极高的要求。而单元测试作为软件开发过程中的核心环节,其重要性不言而喻。 单元测试的作用 单元测试是指对软件中的最小可
    的头像 发表于 11-26 13:22 182次阅读

    嵌入软件单元/集成测试工具专业分析

    引言 在现代软件开发过程中,单元测试作为确保代码质量的重要环节,得到了广泛的关注和应用。随着嵌入式系统的复杂性日益增加,对高效、可靠的单元测试工具的需求也愈加迫切。WinAMS作为一款专为嵌入
    的头像 发表于 11-19 16:41 249次阅读

    ESD HBM测试差异较大的结果分析

    ESD HBM测试结果差异较大的原因,通常包括设备/仪器差异、‌校准和维护水平不同、‌环境条件差异、‌测试样本差异、‌测试操作员技能和经验差异以及
    的头像 发表于 11-18 15:17 491次阅读
    ESD HBM<b class='flag-5'>测试</b>差异较大的<b class='flag-5'>结果</b><b class='flag-5'>分析</b>

    matlab神经网络工具箱结果分析

    MATLAB神经网络工具箱的使用和结果分析MATLAB神经网络工具箱概述 MATLAB神经网络工具箱提供了一系列的函数和工具,用于构建、
    的头像 发表于 07-03 10:32 633次阅读

    单元测试、集成测试自动化工具

    机能安全ISO26262软件工具的认证 产品概要 [Coverage master winAMS]是以嵌入式软件的函数为单位,实施模块单元测试以及C
    的头像 发表于 06-26 13:41 460次阅读
    <b class='flag-5'>单元测试</b>、集成<b class='flag-5'>测试</b>自动化工具

    接口测试的工具有哪些种类

    单元测试框架 单元测试框架主要用于测试单个模块或函数的功能。虽然它们主要用于开发阶段,但也可以用于接口测试。 1.1 JUnit (Java) JUnit 是 Java 语言的
    的头像 发表于 05-30 15:07 751次阅读

    影响气密性测试结果的原因分析及解决方案分享

    影响气密性测试结果的原因分析及解决方案分享现在的制造业,对产品的气密性能都是要求很高的,通过气密性测试能检测出产品在使用时是否会出现渗漏、漏气等质量问题,确保产品的可靠性和安全性。不过
    的头像 发表于 05-30 08:30 1910次阅读
    影响气密性<b class='flag-5'>测试</b><b class='flag-5'>结果</b>的原因<b class='flag-5'>分析</b>及解决方案分享

    嵌入软件单元测试工具的作用

    嵌入软件单元测试工具是现代软件开发过程中不可或缺的一环。它的作用在于帮助开发人员对软件中的各个单元进行测试,以确保其功能的正确性和稳定性。单元测试
    的头像 发表于 04-23 15:31 446次阅读
    嵌入软件<b class='flag-5'>单元测试</b>工具的作用

    LitePoint推出其最新的5G O-RAN无线电单元测试技术

    无线测试解决方案先进供应商LitePoint宣布将参加于4月12日在台北举行的2024年D Forum移动通信论坛,展示其最新的5G O-RAN无线电单元测试技术。
    的头像 发表于 04-11 15:26 521次阅读

    单元/集成测试服务

    单元/集成测试旨在证明被测软件实现其单元/架构设计规范、证明被测软件不包含非预期功能。经纬恒润测试团队拥有丰富的研发经验、严格的流程管控,依据ISO26262/ASPICE等开展符合要
    的头像 发表于 02-29 13:27 396次阅读
    <b class='flag-5'>单元</b>/集成<b class='flag-5'>测试</b>服务

    Tessy—嵌入式软件单元测试/集成测试工具

    搭建测试环境、执行测试、评估测试结果并生成测试报告。目前Tessy被广泛应用在汽车电子客户中,在V模型开发中,Tessy主要应用在
    的头像 发表于 01-15 14:39 865次阅读
    Tessy—嵌入式软件<b class='flag-5'>单元测试</b>/集成<b class='flag-5'>测试</b>工具