爲什麼一定要做SIL測試

0. SIL測試的背景

 

SIL測試的目的是爲了驗證自動生成的代碼和用於代碼生成的模型的一致性,做這項測試的初衷是因爲代碼生成過程可能會引入錯誤。注意,我這裏提到的代碼生成過程出錯,這裏面可能涵蓋兩方面的錯誤,一是來自於代碼生成工具本身,代碼生成工具作爲一款軟件,它和其他所有軟件一樣,都是可能有bug的,沒有哪個軟件公司可以承諾自己公司的軟件產品沒有bug,MathWorks也不例外;二是來自於代碼生成用戶,代碼生成過程是一個可以定製化的過程,用戶在這個過程中可能做一些自己的定製,如果定製化的內容沒有經過嚴格、充分的驗證,那麼也是很容易引入bug的。並且,相比之下,第二種錯誤發生的概率會更大一些。

既然這個過程可能引入bug,那麼,即便是正確的模型,也可能被生成出來不正確的代碼。爲了防止這類bug,SIL測試是有必要做的。當然,也有人說他們對代碼生成過程不做定製,並且,他們也充分信任MathWorks的代碼生成工具……。

我們選擇了代碼生成工具,選擇了代碼生成的開發模式,我們自然是信任代碼生成工具的。問題是,信任不能保證代碼生成工具就不發生錯誤,儘管代碼生成工具發生錯誤的概率非常小,小到很多用戶可能從來沒有遇到過,但概率小不代表沒有,咱們中國有句老話,叫做“以防萬一”,即便是非常小概率發生的事情,可一旦發生,很可能會帶來很嚴重的後果。如果可以通過增加一個環節,在基本上不增加開發成本的情況下,就可以驗證代碼和模型的一致性,就可以避免代碼生成過程出錯導致的最終結果出錯,那我們又有什麼理由拒絕呢?

沒錯,SIL就是這樣一種測試,基本上不增加你的開發時間,又能夠“以防萬一”

1. 爲什麼SIL測試能夠“以防萬一”


如上圖所示,SIL測試是對比測試,測試過程中,我們給代碼編譯成的可執行文件和用於代碼生成的模型相同的輸入,我們觀測它們的輸出是否一致,如果輸入信號的數據量足夠大,能夠覆蓋各種路徑,涵蓋各種信號範圍,並且兩者的輸出結果一致,我們可以大致認爲代碼和模型做行爲上是一致的。

2. 爲什麼SIL基本上不增加開發時間

2.1. 測試用例創建

SIL測試發生在代碼生成之後,我們知道,代碼生成的前提是模型經過充分驗證,所以SIL測試階段,模型的單元測試早已完成,我們可以複用模型單元測試時使用的測試用例,所以,測試過程中耗時最多的測試用例設計環節在SIL測試的時候就不再是問題。

前面我們提到,SIL測試的測試數據越多越好,如果我們認爲單元測試的測試用例不夠多,沒有關係,除了使用單元測試的測試用例之外,還可以通過工具自動產生測試用例,在MathWorks工具鏈中,Simulink Design Verifier就可以用於自動生成測試用例。注意,我在SIL測試的時候提到自動產生測試用例,這種測試用例不能用於功能測試,因爲這種測試用例不能表達功能意義,但卻能滿足覆蓋率要求。我們做SIL測試的時候,驗證的就是相同的測試輸入條件下,代碼和模型產生出相同的輸出,所以這個環節沒有必要關心功能,這個環節裏,我們希望有覆蓋各種狀況的大量數據。

2.2. 測試過程的執行

在有了測試用例之後,可以通過幾行命令執行測試過程。假如我們使用了slvnvmakeharness(‘demo_model’)命令創建了測試框架,如下圖:

假如測試數據已經導入到SignalBuilder模塊,那麼,SIL測試只需執行如下命令:

test_frame_name= ‘demo_model_harness’;

set_param(test_frame_name,‘SaveOutput’, ‘on’);

set_param(test_frame_name,‘OutputSaveName’,’model_output’);

set_param(‘demo_model_harnss/TestUnit’,’SimulationMode’,’Normal’);

sim(test_frame_name);

set_param(test_frame_name,‘OutputSaveName’,’SIL_output’);

set_param(‘demo_model_harnss/TestUnit’,’SimulationMode’,’Software-in-the-Loop (SIL)’);

sim(test_frame_name);

compare_and_report(model_output,SIL_output);

兩次仿真的結果被分別保存在model_output和SIL_output裏面,對比這兩個變量,並給出報告,就算是完成SIL過程了。這裏compare_and_report()不是MATLAB內置的函數,需要用戶按照自己的要求自行編寫,無非是把兩次仿真的結果做對比,並生成報告,僅此而已。

現在可以理解我爲什麼一直強調一定要做SIL的原因了吧?

因爲: SIL不增加開發時間,又能夠做到”以防萬一“。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章