如何使用MATLAB寫測試(1)初識unittests
本文介紹如何在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 會議總結