0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

MATLAB ? 來源:djl ? 作者:oopmatlab ? 2019-09-17 17:26 ? 次閱讀

在inputParser章節(jié)中,我們通過不斷改進getArea函數(shù)對輸入參數(shù)的處理方法,引入這樣一個觀點:一個可靠的科學工程計算項目必須有一套測試系統(tǒng),才能防止開發(fā)的過程中算法退化,工程項目的推進必須在算法開發(fā)和算法測試之間不斷迭代完。在inputParser章節(jié)的最后,還根據(jù)直覺提出了一個測試系統(tǒng)所應(yīng)該有的基本功能。在本章中,我們將學習MATLAB提供的測試解決方案:MATLAB單元測試(MATLAB Unit Test)。

基于函數(shù)的(Function-Based)單元測試的構(gòu)造

MATLAB基于函數(shù)的單元測試構(gòu)造很簡單,如圖1所示:用戶通過一個主測試函數(shù)和若干局部測試函數(shù)(也叫做測試點,Local Function)來組織各個測試。而測試的運行則交給MATLAB的單元測試架構(gòu)(以下簡稱Framework)去完成。

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

圖1 單元測試Framework和測試函數(shù)

主測試函數(shù)和局部測試函數(shù)看上去和普通的MATLAB函數(shù)沒有區(qū)別,其結(jié)構(gòu)如圖2所示,只是命名上有一些規(guī)定而已,這些特殊的規(guī)定是為了Framework可以和測試函數(shù)契合而規(guī)定的。

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

圖2 簡單的主測試函數(shù)和若干局部的測試函數(shù)構(gòu)成的一個單元測試

命名規(guī)則如下:

主函數(shù)的名稱由用戶任意指定,和其他的MATLAB函數(shù)文件一樣,該文件的名稱需要和函數(shù)的名稱的相同(如果主函數(shù)的名稱是testmainfunc,該文件名稱則是testmainfunc.m)

在主函數(shù)中,必須調(diào)用一個叫做functiontests的函數(shù),搜集該函數(shù)中的所有局部函數(shù),產(chǎn)生一個包含這些局部函數(shù)的函數(shù)局部的測試矩陣并返回給Framework

如下所示:

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

其中l(wèi)ocalfunctions是一個MATLAB函數(shù),用來返回所有局部函數(shù)的函數(shù)句柄。局部函數(shù)的命名必須以test開頭,局部函數(shù)只接受一個輸入?yún)?shù),即測試對象,即下面例子中的形參testCase:

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

其中testCase由單元測試Framework提供,即Framework將自動的調(diào)用該函數(shù),并且提供testCase參數(shù)。按照規(guī)定,要運行單元測試中的所有測試,必須調(diào)用runtests函數(shù):

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

下面用我們用基于函數(shù)的單元測試來給getArea函數(shù)的構(gòu)造其單元測試。

getArea函數(shù)的單元測試:版本 I

首先給主測試文件起個名字叫做testGetArea,該名字是任意的,為了便于理解名字里面通常包含test,并包含要測試的主要函數(shù)的名字:

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

在該主函數(shù)中,localfunctions將搜集所有的局部函數(shù),構(gòu)造函數(shù)句柄數(shù)組并返回測試矩陣。這里自然會有一個問題,這個tests句柄數(shù)組將返回給誰,這就要了解Framework是如何和測試相互作用的。如圖3所示,整個測試從runtests('testmainfunc.m')命令開始, 命令函數(shù),F(xiàn)ramework將首先調(diào)用testGetArea的主函數(shù),得到所有的局部函數(shù)的函數(shù)句柄,如空心箭頭線段所示,然后Framework再負責調(diào)用每一個測試局部函數(shù),并且把testCase當做參數(shù)提供給每個局部函數(shù),如虛線線段所示。我們可以把Framework想象成一個流水線,用戶只需要通過runtests('testmainfunc.m')把“testmainfunc.m”放到流水線上并且“打開開關(guān)”就可以了。它是MATLAB的類matlab.unittest.FunctionTestCase的對象。

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

圖3 單元測試Framework和測試函數(shù)的相互作用

返回的testCase是類matlab.unittest.FunctionTestCase的對象,有很多成員驗證方法可以提供給用戶調(diào)用,我們的第一版的getArea函數(shù)如下, 要求函數(shù)接受兩個參數(shù),并且都是數(shù)值類型:

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

我們先給這個getArea寫第一個測試點,確保測試getArea函數(shù)在接受兩個參數(shù)的時候,能給出正確的答案:

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

我們給testGetArea.m添加一個局部函數(shù)叫做testTwoInputs,按照規(guī)定,該局部函數(shù)的名字要以test開頭,后面的名字要能夠盡量反應(yīng)該測試點的實際測試的內(nèi)容。verifyTrue是一個testCase對象所支持的方法,它用來驗證其第一個參數(shù),作為一個表達式,是否為真。verifyTrue的第二個參數(shù)接受字符串,在測試失敗時提供診斷提示。一個很常見的問題是:getArea是一個極其簡單的函數(shù),內(nèi)部的工作就是把兩個輸入相乘,在這里驗證getArea(10,22) == 220真的有必要嗎?請讀者記住這個問題,它是理解單元測試的精要之一。下面我們來運行這個測試:

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

測試返回一個matlab.unittest.TestResult對象,其中包括運行測試的結(jié)果,不出意料我們的函數(shù)通過了這輪簡單的測試。如果函數(shù)沒有通過測試,比如我們故意要驗證一個錯誤的結(jié)果:getArea(10,22) ==0。

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

Framework將給出詳盡的錯誤報告, 其中Test Diagnostic欄目中報告的就是verifyTrue函數(shù)中的第二個參數(shù)所提供的診斷信息

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

我們再添加一個負面測試,回憶第一版的函數(shù)getArea不支持單個參數(shù),如下:

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

我們可以利用lasterr函數(shù)得到了這個錯誤的Error ID,這個Error ID將在負面測試中用到。下面是這個負面測試,驗證在只有一個輸入的情況下,getArea函數(shù)能夠如預期報錯。我們給測試添加一個新的測試點,叫做testTwoInputsInvalid。

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

在testTwoInputsInvalid中,我們使用了測試對象的verifyError成員函數(shù),它的第一個參數(shù)是函數(shù)句柄,即要執(zhí)行的語言(會出錯的語句),第二個參數(shù)是要驗證的MATLAB錯誤的Error ID, 就是我們前面用lasterr函數(shù)得到的信息。verifyError內(nèi)部還有try和catch,可以運行函數(shù)句柄,捕捉到錯誤,并且把Error ID和第二個參數(shù)做比較。再舉一個例子,我們先在getArea函數(shù)中規(guī)定所有的輸入必須是數(shù)值類型,所以如果輸入的是字符串,getArea將報錯,先再命令行中實驗一下,以便得到Error ID:

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

然后再把這個負面測試添加到testGetArea中去:

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

運行一遍,一個正面測試,一個負面測試都全部通過。

關(guān)于MATLAB單元測試的過程以及結(jié)果分析

getArea函數(shù)的單元測試: 版本II & III

測試的準備和清理工作: Tests Fixtures

驗證方法: Types of Qualification

測試方法論和以測試驅(qū)動開發(fā)(Test-Driven Development)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    575

    瀏覽量

    20471
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4290

    瀏覽量

    62342
收藏 人收藏

    評論

    相關(guān)推薦

    利用Matlab函數(shù)實現(xiàn)深度學習算法

    Matlab中實現(xiàn)深度學習算法是一個復雜但強大的過程,可以應(yīng)用于各種領(lǐng)域,如圖像識別、自然語言處理、時間序列預測等。這里,我將概述一個基本的流程,包括環(huán)境設(shè)置、數(shù)據(jù)準備、模型設(shè)計、訓練過程、
    的頭像 發(fā)表于 07-14 14:21 ?1815次閱讀

    鴻蒙語言基礎(chǔ)類庫:ohos.application.testRunner TestRunner 測試

    TestRunner模塊提供了框架測試的能力。包括準備單元測試環(huán)境、運行測試用例。
    的頭像 發(fā)表于 07-12 09:32 ?251次閱讀

    matlab神經(jīng)網(wǎng)絡(luò)工具箱結(jié)果分析

    MATLAB神經(jīng)網(wǎng)絡(luò)工具箱的使用和結(jié)果分析。 MATLAB神經(jīng)網(wǎng)絡(luò)工具箱概述 MATLAB神經(jīng)網(wǎng)絡(luò)工具箱提供了一系列的函數(shù)和工具,用于構(gòu)建、
    的頭像 發(fā)表于 07-03 10:32 ?508次閱讀

    單元測試、集成測試自動化工具

    機能安全ISO26262軟件工具的認證 產(chǎn)品概要 [Coverage master winAMS]是以嵌入式軟件的函數(shù)為單位,實施模塊單元測試以及C
    的頭像 發(fā)表于 06-26 13:41 ?370次閱讀
    <b class='flag-5'>單元測試</b>、集成<b class='flag-5'>測試</b>自動化工具

    【電磁兼容技術(shù)案例分享】燃料電池發(fā)動機不同額定功率下的RE測試結(jié)果分析案例

    【電磁兼容技術(shù)案例分享】燃料電池發(fā)動機不同額定功率下的RE測試結(jié)果分析案例
    的頭像 發(fā)表于 06-13 08:17 ?321次閱讀
    【電磁兼容技術(shù)案例分享】燃料電池發(fā)動機不同額定功率下的RE<b class='flag-5'>測試</b><b class='flag-5'>結(jié)果</b><b class='flag-5'>分析</b>案例

    接口測試的工具有哪些種類

    單元測試框架 單元測試框架主要用于測試單個模塊或函數(shù)的功能。雖然它們主要用于開發(fā)階段,但也可以用于接口測試。 1.1 JUnit (Java) JUnit 是 Java 語言的
    的頭像 發(fā)表于 05-30 15:07 ?602次閱讀

    影響氣密性測試結(jié)果的原因分析及解決方案分享

    影響氣密性測試結(jié)果的原因分析及解決方案分享現(xiàn)在的制造業(yè),對產(chǎn)品的氣密性能都是要求很高的,通過氣密性測試能檢測出產(chǎn)品在使用時是否會出現(xiàn)滲漏、漏氣等質(zhì)量問題,確保產(chǎn)品的可靠性和安全性。不過
    的頭像 發(fā)表于 05-30 08:30 ?1586次閱讀
    影響氣密性<b class='flag-5'>測試</b><b class='flag-5'>結(jié)果</b>的原因<b class='flag-5'>分析</b>及解決方案分享

    基于MATLAB的信號處理系統(tǒng)與分析

    基于MATLAB的信號處理系統(tǒng)與分析,包括信號的導入、預處理、分析、特征提取以及頻譜分析等關(guān)鍵步驟,并通過實例展示
    的頭像 發(fā)表于 05-17 14:24 ?941次閱讀

    嵌入軟件單元測試工具的作用

    嵌入軟件單元測試工具是現(xiàn)代軟件開發(fā)過程中不可或缺的一環(huán)。它的作用在于幫助開發(fā)人員對軟件中的各個單元進行測試,以確保其功能的正確性和穩(wěn)定性。單元測試
    的頭像 發(fā)表于 04-23 15:31 ?393次閱讀
    嵌入軟件<b class='flag-5'>單元測試</b>工具的作用

    LitePoint推出其最新的5G O-RAN無線電單元測試技術(shù)

    無線測試解決方案先進供應(yīng)商LitePoint宣布將參加于4月12日在臺北舉行的2024年D Forum移動通信論壇,展示其最新的5G O-RAN無線電單元測試技術(shù)。
    的頭像 發(fā)表于 04-11 15:26 ?446次閱讀

    鴻蒙OS開發(fā)實戰(zhàn):【自動化測試框架】使用指南

    為支撐HarmonyOS操作系統(tǒng)的自動化測試活動開展,我們提供了支持JS/TS語言的單元及UI測試框架,支持開發(fā)者針對應(yīng)用接口進行單元測試,并且可基于UI操作進行UI自動化腳本的編寫。
    的頭像 發(fā)表于 04-08 14:49 ?1248次閱讀
    鴻蒙OS開發(fā)實戰(zhàn):【自動化<b class='flag-5'>測試</b>框架】使用指南

    單元/集成測試服務(wù)

    單元/集成測試旨在證明被測軟件實現(xiàn)其單元/架構(gòu)設(shè)計規(guī)范、證明被測軟件不包含非預期功能。經(jīng)緯恒潤測試團隊擁有豐富的研發(fā)經(jīng)驗、嚴格的流程管控,依據(jù)ISO26262/ASPICE等開展符合要
    的頭像 發(fā)表于 02-29 13:27 ?352次閱讀
    <b class='flag-5'>單元</b>/集成<b class='flag-5'>測試</b>服務(wù)

    Tessy—嵌入式軟件單元測試/集成測試工具

    搭建測試環(huán)境、執(zhí)行測試、評估測試結(jié)果并生成測試報告。目前Tessy被廣泛應(yīng)用在汽車電子客戶中,在V模型開發(fā)中,Tessy主要應(yīng)用在
    的頭像 發(fā)表于 01-15 14:39 ?740次閱讀
    Tessy—嵌入式軟件<b class='flag-5'>單元測試</b>/集成<b class='flag-5'>測試</b>工具

    HamronyOS自動化測試框架使用指南

    ,運行方面提供了識別測試腳本、調(diào)度執(zhí)行測試腳本以及匯總測試腳本執(zhí)行結(jié)果的能力。 實現(xiàn)原理 框架重要分為兩大部分:
    發(fā)表于 12-19 10:26

    軟件單元測試真的有必要嗎?(下)

    本篇將深入討論單元測試過程中,如何在保質(zhì)保量完成測試任務(wù)的同時,縮減時間成本、提高測試效率,并分享目前行業(yè)內(nèi)的實踐經(jīng)驗以及相關(guān)自動化測試工具
    的頭像 發(fā)表于 11-17 15:18 ?583次閱讀
    軟件<b class='flag-5'>單元測試</b>真的有必要嗎?(下)