如何使用MATLAB寫測試(1)初識unittests

WHAT:

本文介紹如何在MATLAB中寫簡單的單元測試。

WHY:

在學生時代,我作為一名工科生喜歡用MATLAB的首要原因是可以進行快速的開發。無論是對演算法的驗證,調試,還是最後的展示,MATLAB都優於很多其他工具。

進入職場後,我發現學生時代的「一次性開發」,2000行的腳本,甚至是10+個函數相互調用,都不能滿足一個成熟項目的穩定性和可維護性。相信很多不是CS背景的工科生都會有類似的經歷。隨後我接觸到了Test-Driven Development(TDD)的概念,對於開發工作有相當大的幫助。

希望這篇文章可以幫助大家了解MATLAB中的測試環境和可用的工具,提高開發效率。

HOW:

MATLAB版本:本文基於MATLAB R2016a,但是MATLAB中的單元測試基本功能在R2013a就可以使用。

  • 開發環節

我們假設開發了一個產生0矩陣的程序,定義如下:

function out = foo(in)n validateattributes(in,{numeric},{nonempty}); %Not nown % Returns zeron out = zeros(size(in),like,in);nendn

該程序的作用為產生一個和輸入矩陣一樣大小,一樣類型的全0矩陣。第一行validateattributes限定了輸入必須為數值且非空。

  • 測試環節

MATLAB提供的所有單元測試工具可以在這裡找到, 今天這裡展示的是Class-Based Unit Tests

%% 所有的單元測試都需要從matlab.unittest.TestCase繼承nclassdef myTest < matlab.unittest.TestCasen n %% 定義以Test為attribute的methodsn methods (Test)n % 定義你自己的測試n function testSingle(test) %function唯一的參數test是你的測試對象n % Verifies single input casen in = single(10); %輸入n expOut = zeros(1,single); %期待的輸出n actualOut = foo(in); %調用待測程序n test.verifyEqual(actualOut,expOut); %比較實際輸出與期待輸出n endn endnendn

至此一個簡單的測試例子就寫好了,接下來就是要跑測試了。在MATLAB命令行輸入:

>> result = runtests(myTest)nRunning myTestn.nDone myTestn__________nnnresult = nn TestResult with properties:nn Name: myTest/testSinglen Passed: 1n Failed: 0n Incomplete: 0n Duration: 0.0164n Details: [1x1 struct]nnTotals:n 1 Passed, 0 Failed, 0 Incomplete.n 0.016414 seconds testing time.n

測試通過。

十天後,我們不靠譜的實習生修改了foo函數

function out = foo(in)n validateattributes(in,{numeric},{nonempty}); %Not nown % Returns zeron out = 1 + zeros(size(in),like,in);nend n

他沒有忘記提交前跑一下現有的測試

>> result = runtests(myTest)nRunning myTestnn================================================================================nVerification failed in myTest/testSingle.nn ---------------------n Framework Diagnostic:n ---------------------n verifyEqual failed.n --> The values are not equal using "isequaln".n --> Failure table:n Actual Expected Error RelativeErrorn ______ ________ _____ _____________n n 0 1 -1 -1 n n Actual single:n 0n Expected single:n 1nn ------------------n Stack Information:n ------------------n In /users/matlab/myTest.m (myTest.testSingle) at 12n================================================================================n.nDone myTestn__________nnFailure Summary:nn Name Failed Incomplete Reason(s)n ================================================================n myTest/testSingle X Failed by verification.n nnresult = nn TestResult with properties:nn Name: myTest/testSinglen Passed: 0n Failed: 1n Incomplete: 0n Duration: 0.1812n Details: [1x1 struct]nnTotals:n 0 Passed, 1 Failed, 0 Incomplete.n 0.18124 seconds testing time.n

發現錯誤後,他做出了修改,保住了工作,他感謝TDD,感謝MATLAB Unittest……

至此,我們有了一個再也沒有bug的程序(並沒有

希望對大家有幫助。

參考資料:

Class-Based Unit Tests

Testing Frameworks

Test-driven development


推薦閱讀:

某測試模擬器性能優化-選對你的庫
論文導讀 | DeepXplore:深度學習系統的自動化白盒測試
移動無線測試技能樹
第一屆 Geek Testing in ShangHai 會議總結

TAG:MATLAB | 软件测试 |