2011-09-07 233 views
20

如何在Simulink或Stateflow中執行單元測試?單元測試/持續集成Simulink/Stateflow

我是敏捷軟件方法的粉絲,包括測試驅動開發。我負責安全關鍵控制軟件的開發,我們正在使用Matlab/Simulink/Stateflow開發它。選擇此工具集是因爲與工廠(硬件)模型的鏈接。 (模型在中環,硬件在中環)

我發現#2一些鏈接:Unit-testing framework for MATLABxunitslunitdoctest

  • 有沒有人有使用這些或不同的單元測試框架的經驗?
  • 如何將其與持續集成系統(即Hudson)連接起來?

回答

7

克雷格提到的確有MATLAB在R2013a推出了一個框架。 ,該框架在R2014a中添加了一個TAPPlugin,輸出Test Anything Protocal。使用該協議,您可以用TAPPlugin(例如。 Jenkins,TeamCity),這樣如果測試失敗,CI系統可能會失敗構建。

你的CI版本可能看起來像一個shell命令來啓動MATLAB和運行所有測試:

/your/path/to/matlab/bin/matlab -nosplash -nodisplay -nodesktop -r "runAllMyTests" 

然後runAllMyTests創建一套運行,並與抽頭輸出重定向到一個文件中運行它。你需要在這裏調整細節,但或許這可以幫助你開始:

function runAllMyTests 

import matlab.unittest.TestSuite; 
import matlab.unittest.TestRunner; 
import matlab.unittest.plugins.TAPPlugin; 
import matlab.unittest.plugins.ToFile; 

try 
    % Create the suite and runner 
    suite = TestSuite.fromPackage('packageThatContainsTests', 'IncludingSubpackages', true); 
    runner = TestRunner.withTextOutput; 

    % Add the TAPPlugin directed to a file in the Jenkins workspace 
    tapFile = fullfile(getenv('WORKSPACE'), 'testResults.tap'); 
    runner.addPlugin(TAPPlugin.producingOriginalFormat(ToFile(tapFile))); 

    runner.run(suite); 
catch e; 
    disp(e.getReport); 
    exit(1); 
end; 
exit force; 

編輯:我用這個主題作爲new developer oriented blogfirsttwo帖子今年

+0

是的,最後。 R2013開始成爲專業軟件開發的真正平臺,而R2014變得更加完善。基本的配置管理也是一個很好的補充。回到2011年,這個問題嚴重失蹤,很高興他們趕上了。 – Adriaan

+0

我也嘗試在simulink模型上設置單元測試,並使用matlab.unittest框架,使用上面的例子我得到一個tapFile與testresults,但也想導出覆蓋信息,我從運行cvsim從測試。 任何想法? – Otzen

4

不幸的是,單元測試Simulink並不簡單。 Mathworks擁有SystemTest。或者,您可以推出自己的Simulink測試框架,這是我們所遵循的方法,並且不是太困難,但您可能需要以編程方式構建測試用具。

爲了與CI集成,您需要創建一個執行所有測試的函數/腳本,然後您可以使用MATLAB.exe的命令行參數在啓動時運行腳本。不過,我不確定任何人都有將CI測試報告與CI軟件集成的好方法。請看Unit-testing framework for MATLAB中的評論數量。

+0

非常真實。通常Simulink模型被視爲單塊模塊; Mathworks還是我的首選方法,它是小型的,可獨立測試的模塊,可以由一羣人並行工作。此外,Mathworks傾向於提出另一種新工具(具有獨立許可證計劃,並非所有團隊成員都不需要)。生活中一些最好的東西是免費的;我相信xUnit就是其中之一.....可能是Matlab/Simulink/Stateflow社區尚未準備好進行敏捷/測試驅動開發。感謝您爲此介紹賞金。 – Adriaan

2

如果您的系統比較複雜,您應該使用Model Reference對其進行分解,然後分別對其進行測試。

另一個解決方案(更「老派」)是把你的主要塊放在一個庫中,並創建小型模型。

要測試這些子模型,尤其是那些具有狀態機(Stateflow)的子模型,最好的方法是創建帶有Signal builder塊的時間測試用例 。你有一個強大的功能signalbuilder與這個塊交互並加載測試用例。我的方法是爲每個子模型的每個案例獲取一個輸入文件和一個輸出文件。您的模型輸出是「正確的」輸出和塊中的輸出。該模型以sim(無外部輸入)運行,2個輸出與腳本進行比較,指示哪個信號不同(以及何時)。

您可以使用現有的系統,但我更喜歡用我自己的軟件來運行每個案例(或其中一些案例)。

我沒有任何公共代碼,但這就是我使用的方式。我不使用CIS,因此我無法回答您問題的第二部分。

+0

這個答案並沒有真正的幫助,但看起來它會得到賞金,除非有人想出更好的東西。 – Nzbuu

+1

我已經這樣做了,爲了使用SVN進行版本管理。對於測試,我預見了很大的問題。尤其是,因爲一個小小的改變需要編譯一個新的「正確的」輸出。 – Adriaan

2

Matlab(自2013b以來)內置了對xUnit的支持,形式爲Unit Testing Framework。 我沒有使用它,但是因爲可以通過sim()從Matlab運行simulink,那麼這個框架可以用來測試你的simulink模型。您的圖書館和模型可能需要一個包裝來執行它,正如其他答覆者所指出的那樣。

Mathworks網站上有很多例子,不幸的是它們並不運行simulink模型。我會爲你編寫一個例子,但我沒有ML2013b :-(

爲了從一個CI啓動你的測試(我使用Jenkins),那麼你可以調用matlab來運行一個.m文件運行測試套件,這個例子在cmd腳本將調用Run_Tests.m從MATLAB:

IF EXIST "C:\Program Files (x86)\MATLAB\R2013b\bin\win32\matlab.exe" (
    REM WinXP 
    "C:\Program Files (x86)\MATLAB\R2013b\bin\win32\matlab.exe" -r "Run_Tests;exit" -logfile matlab.log 
) ELSE (
    REM Win7 
    "C:\Program Files\MATLAB\R2013b\bin\win32\matlab.exe" -r "Run_Tests;exit" -logfile matlab.log 
) 

注意,如果另外startup.m exists in the directory that you call Matlab from, then it'll be executed automatically before Run_Tests.m`

+0

快速更正。 R2013a中引入了MATLAB單元測試框架。但是在R2013b和R2014a中添加了其他功能。 –

3

推出,2015A Matlab引入了一個新的產品名稱「Simulink Test」。也許這會簡化這個混亂。

http://www.mathworks.com/products/simulink-test/features.html#manage-test-plans-and-test-execution

+0

Simulink測試看起來非常有用,並且解決了問題的測試部分,您是否有關於與CI系統集成的想法? – Craig

+0

您可以從命令行運行matlab腳本。我使用teamcity編排和matlab腳本來運行測試。查看matlab.unittest.plugins.TAPPlugin以查看CI前端中的測試報告。 –

0

我認爲你正在尋找類似EZTEST。它旨在用於您的特殊用途:在單元級別上測試Simulink和Stateflow的開發。對於安全至關重要的軟件,還包含一本安全手冊,其中介紹了有關ISO 26262的內容。

編輯:我是該軟件的開發人員,所以我的意見可能有偏差。但我不參與產品的營銷或銷售。我只是發佈這個,因爲我知道那裏幾乎沒有單元測試框架,滿足提問者的需求(如答案可能假設)。

還支持使用SIL和PIL的測試單元。不幸的是,我對哈德森不熟悉,所以我無法解決這部分問題。

0

我見過單元測試Simulink模型問題的不同解決方案。 Simulink Verification & Validation在檢查時不支持xUnit測試運行者和測試套件的概念,TPT在功能上超載,不易於使用並且在可變性和可維護性方面非常困難。

此外,我已經看到了Matlab腳本和Excel表格的自定義解決方案,這些解決方案既輕便又易於理解和維護。我仍然不推薦使用任何這些方法,至少不能用於單元測試。最後,我們最終使用一個C單元測試框架(CUnit)來測試生成的代碼。雖然這肯定有,你必須生成測試之前的代碼的缺點,它也有很多的優點,如易於集成導入CI系統,高靈活性的編寫單元測試快速的單元測試執行和最後但並非不重要重構功能從Simulink切換到另一種基於模型的環境或手寫代碼。特別是最後一點不應該被低估,因爲我看到很多Simulink模型本來應該是手寫模塊。如今,我推薦使用GoogleTest而不是CUnit

+0

當然,你可以單元測試生成的代碼。但是我正在尋找關於它的模型和算術的證明。代碼生成後單元測試可以重用,以證明生成的代碼產生相同的結果。我使用大型數據集進行了集成測試。 – Adriaan

2

R2016b引入了Simulink TestMATLAB Unit Testing framework之間的集成。使用測試管理器(* .mldatx)通過Simulink測試創建的測試可以使用MATLAB單元測試運行器進行本地識別並運行,因此您可以生成便於持續集成工作流程的JUnit樣式XML測試結果或TAP測試結果。

更多信息請參見該參考文獻:代替一樣容易https://www.mathworks.com/help/sltest/ug/run-test-files-using-matlab-unit-test.html?s_tid=gn_loc_drop

文檔顯示製造使用matlab.unittest.plugins.TAPPlugin TAP結果的一個例子,但是可以使用XMLPlugin(https://www.mathworks.com/help/matlab/ref/matlab.unittest.plugins.xmlplugin-class.html)。

在MATLAB環境下,即使沒有CI,也可以在同一個測試套件中集成MATLAB和Simulink測試,並使它們無縫地一起運行。例如,如果你有兩個本地MATLAB單元測試和Simulink測試目錄MYDIR,你可以做簡單的東西作爲如下一次性執行兩種類型的測試:

結果= runtests(MYDIR )