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

    文章

    548

    浏览量

    20105
  • 函数
    +关注

    关注

    3

    文章

    3864

    浏览量

    61307
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

    软件单元测试真的有必要吗?(下)

    本篇将深入讨论单元测试过程中,如何在保质保量完成测试任务的同时,缩减时间成本、提高测试效率,并分享目前行业内的实践经验以及相关自动化测试工具
    的头像 发表于 11-17 15:18 294次阅读
    软件<b class='flag-5'>单元测试</b>真的有必要吗?(下)

    一种通用的汽车车身电子单元测试工装的研究设计

    电子发烧友网站提供《一种通用的汽车车身电子单元测试工装的研究设计.pdf》资料免费下载
    发表于 11-07 10:07 0次下载
    一种通用的汽车车身电子<b class='flag-5'>单元测试</b>工装的研究设计

    软件单元测试真的有必要吗?(上)

    本文着重探讨单元测试的重要性及其正面临的困境,并介绍功能安全标准中罗列的单元测试方法。
    的头像 发表于 11-03 14:58 304次阅读
    软件<b class='flag-5'>单元测试</b>真的有必要吗?(上)

    如何提高嵌入式软件单元测试效率

    传统方法更快、更高效地运行单元测试。 我们在虚拟平台上运行一套单元测试,然后在物理硬件上运行。 然后我们将对结果进行分析
    发表于 08-28 06:31

    如何利用Simulink Test工具箱对模型进行单元测试

    创建完模型后,我们需要验证模型的行为,即仿真结果,是否跟我们预期的一致,这样才能保证由模型生成的代码在嵌入式系统中执行得到结果跟我们预期的一致。单元测试主要是以模型或者模型内的子系统为单位进行
    的头像 发表于 07-22 10:25 2606次阅读
    如何利用Simulink Test工具箱对模型进行<b class='flag-5'>单元测试</b>?

    083. 单元测试和案例:15.6 fixture

    单元测试
    充八万
    发布于 :2023年07月11日 21:31:03

    081. 单元测试和案例:15.4 断言 #硬声创作季

    单元测试
    充八万
    发布于 :2023年07月11日 21:29:53

    080. 单元测试和案例:15.3 unite discover #硬声创作季

    单元测试
    充八万
    发布于 :2023年07月11日 21:28:44

    079. 单元测试和案例:15.2 unittest suite #硬声创作季

    单元测试
    充八万
    发布于 :2023年07月11日 21:27:34

    078. 单元测试和案例:15.1 unite testcase #硬声创作季

    单元测试
    充八万
    发布于 :2023年07月11日 21:26:24

    嵌入软件单元测试/集成测试自动化工具

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

    嵌入式代码单元测试如何完成?

    软件开发中,每次需求的变更基本都需要改写代码,而代码变更后就需要进行功能测试,当然在功能测试之前需要代码的单元测试,避免代码改动后部分场景没有验证,最后出现各种问题。
    发表于 06-05 12:28 579次阅读