劉會(huì)穎 任紅彬 顏明會(huì) 劉紫陽
面向航天軟件的半實(shí)物仿真測試平臺(tái)構(gòu)建
劉會(huì)穎任紅彬顏明會(huì)劉紫陽
(北華航天工業(yè)學(xué)院,河北 廊坊 065000)
為了進(jìn)一步提高軟件自動(dòng)化測試程度,降低在人力、時(shí)間的成本投入,并切實(shí)提高航天軟件測試質(zhì)量和效率,文章以Qt為開發(fā)框架,實(shí)現(xiàn)一個(gè)基于半實(shí)物的仿真測試平臺(tái),該平臺(tái)設(shè)計(jì)實(shí)現(xiàn)了半自動(dòng)化測試以及用戶自定義測試模式,旨在為地面測發(fā)控軟件提供半實(shí)物仿真的測試環(huán)境。通過測試,該平臺(tái)可在Windows系統(tǒng)上穩(wěn)定運(yùn)行,滿足對(duì)航天軟件可靠、高效、便捷的測試需求。
自動(dòng)化測試;Qt;半實(shí)物;仿真;半自動(dòng)化測試
隨著航天技術(shù)的快速發(fā)展,航天軟件愈加復(fù)雜,智能化、集成化程度不斷提高,軟件間交互模式和交互類型更加多樣化。此外,研制周期逐漸縮短,軟件迭代愈加頻繁,這些都對(duì)軟件的測試提出了更多的要求和新的挑戰(zhàn)。
半實(shí)物仿真是航空航天領(lǐng)域中應(yīng)用較為廣泛的仿真技術(shù),能夠?qū)崿F(xiàn)在不做任何實(shí)物的條件下對(duì)航天軟件進(jìn)行測試,很大程度上節(jié)省了測試成本。航天軟件測試的復(fù)雜程度大多取決于它的保密性,半實(shí)物仿真技術(shù)對(duì)解決由于設(shè)備涉密而無法在真實(shí)測試中拿到真正的被測件時(shí)有切實(shí)的幫助。
目前應(yīng)用于航天軟件中的仿真平臺(tái)僅支持各類設(shè)備之間的通信功能,不具備數(shù)據(jù)延遲處理、數(shù)據(jù)發(fā)送觸發(fā)方式、數(shù)據(jù)分析、數(shù)據(jù)類型設(shè)定等能力。仿真平臺(tái)利用以太網(wǎng)實(shí)現(xiàn)遠(yuǎn)程通信,傳統(tǒng)的軟件開發(fā)方法是利用Socket套接字來編寫程序,套接字本身比較復(fù)雜,難以掌握和使用[1]。本文探討了利用Qt實(shí)現(xiàn)半實(shí)物仿真測試平臺(tái),旨在為地面測發(fā)控軟件提供半實(shí)物仿真的測試環(huán)境。
Qt是一款跨平臺(tái)的面向?qū)ο蟮慕缑嬖O(shè)計(jì)框架,支持在當(dāng)前主流操作系統(tǒng)中的正常運(yùn)行且支持多語言編程,目前通過Qt還衍生了Qt Designer/ Creator等優(yōu)秀產(chǎn)品。Qt為使用者提供了已完成的封裝庫,通過信號(hào)槽機(jī)制連接按鍵及需要調(diào)用的函數(shù),使得各部分的銜接工作更加簡便,可以讓使用者進(jìn)行更高效率的開發(fā)[2]。
Qt Creator是一款簡單易用的開發(fā)工具,版本不斷地更新使Qt Creator的功能更加豐富強(qiáng)大,支持跨平臺(tái)運(yùn)行,使得開發(fā)人員能更加容易地在不同的運(yùn)行環(huán)境下完成開發(fā)任務(wù)[3]。
結(jié)合對(duì)被測件的了解以及平臺(tái)需要支持的特性,對(duì)平臺(tái)的功能進(jìn)行整體的設(shè)計(jì)。平臺(tái)的功能主要包括能夠完成三種類型的地面測發(fā)控軟件的創(chuàng)建,一是對(duì)連接的被測件進(jìn)行通信測試;二是建立觸發(fā)半自動(dòng)化測試技術(shù)的命令字;三是添加不同發(fā)送類型,發(fā)送模式的回令信息。具體的功能如圖1所示。
半實(shí)物仿真測試平臺(tái)實(shí)現(xiàn)三種通信接口,模擬PLX、箭地系統(tǒng)等多種地面測發(fā)控軟件,為被測件與外圍設(shè)備交互提供可靠的通信環(huán)境。簡單來講,所有模擬的軟件都可以被認(rèn)為是服務(wù)端,用來接收并解析被測件發(fā)出的數(shù)據(jù),而被測件可通俗地認(rèn)為是不同通信的客戶端,這樣解釋外圍設(shè)備與被測件之間的聯(lián)系,更容易讓人理解。
三種通信接口分別為TCP、UDP、串口,以TCP為例,平臺(tái)運(yùn)行首先建立新的外圍設(shè)備,根據(jù)外圍設(shè)備所屬類型選擇對(duì)應(yīng)的通信接口類型,設(shè)置連接參數(shù)與對(duì)應(yīng)的配置文件,這里的配置文件指的是包含該設(shè)備對(duì)應(yīng)的命令字及回令的XML文件。配置文件設(shè)為可選項(xiàng),若不填寫,則有平臺(tái)自動(dòng)生成;若填寫,利用Qt提供良好的XML解析功能對(duì)文件進(jìn)行讀寫。Qt中解析XML文件的方式有三種,一種是通過QXmlStreamReader方式,其它兩種是通過DOM或者回調(diào)函數(shù)方式,在選擇配置文件進(jìn)行解析時(shí)使用DOM方式。DOM解析通過把整個(gè)XML文件都讀入到內(nèi)存中這種方式來構(gòu)造一個(gè)樹結(jié)構(gòu),通過在程序中對(duì)樹節(jié)點(diǎn)的操作來完成文件的讀寫[4]。
運(yùn)行設(shè)備,監(jiān)聽被測件的連接,接受被測件的連接之后進(jìn)行數(shù)據(jù)處理,讀入接收數(shù)據(jù),對(duì)數(shù)據(jù)按照命令字設(shè)定的索引長度進(jìn)行切割,對(duì)比切分得到的數(shù)據(jù)與設(shè)定的命令字信息,匹配成功則觸發(fā)回令按照設(shè)定的發(fā)送模式與類型進(jìn)行數(shù)據(jù)的回復(fù),多次執(zhí)行驗(yàn)證回復(fù)信息是否能對(duì)被測件起到驗(yàn)證作用。
將耗時(shí)的操作放在主線程之外的線程中執(zhí)行能夠有效地解決軟件卡頓或異常退出的情況。運(yùn)行平臺(tái),開啟設(shè)備連接,不可能每次只運(yùn)行一個(gè)設(shè)備,這樣對(duì)于軟件的測試效率有著很大的影響。平臺(tái)使用多線程機(jī)制,運(yùn)行設(shè)備,每當(dāng)一個(gè)被測件進(jìn)行連接的時(shí)候就開啟一個(gè)新的線程。多線程的實(shí)現(xiàn)有兩種方法,第一種就是繼承重寫QThread中的run函數(shù),再一種就是使用moveToThread函數(shù)來進(jìn)行線程的轉(zhuǎn)移[5]。這里采用后者的實(shí)現(xiàn)方法,從QObject派生一個(gè)類,將對(duì)收到的數(shù)據(jù)信息進(jìn)行解析操作寫到該類的槽函數(shù)中,啟動(dòng)線程,這樣就開始了一條線程的工作,當(dāng)被測件與設(shè)備斷開連接時(shí),線程退出。上述的操作都使用到了信號(hào)槽機(jī)制。
半自動(dòng)化測試技術(shù)通過命令字匹配來最終實(shí)現(xiàn),仿真平臺(tái)實(shí)時(shí)監(jiān)聽被測件請求,解析請求中的命令字,并根據(jù)命令字類型完成相應(yīng)的回復(fù)。把需要的回復(fù)信息簡稱為回令,回令是設(shè)置在所屬命令字下面的。
每個(gè)設(shè)備下可以添加多個(gè)命令字,命令字的類型可分為兩種,一種是常規(guī)命令字,需要監(jiān)聽請求才能觸發(fā)的;另一種是定時(shí)器觸發(fā),由使用者來控制它是否可以被觸發(fā)。
設(shè)置常規(guī)命令字時(shí),重點(diǎn)在于填寫它的解析值、長度與索引信息,這是信息匹配的依據(jù)。將一個(gè)設(shè)備下所用命令字中的長度、索引、解析值放入一個(gè)列表中,當(dāng)收到被測件發(fā)出的信息時(shí)開始根據(jù)列表中所保存的索引與長度進(jìn)行信息的切割,將得到的結(jié)果與解析值進(jìn)行比較,若相等,那么則認(rèn)為命令字匹配成功。該步驟具體算法實(shí)現(xiàn)如下:
由命令字匹配或定時(shí)器觸發(fā)的回令包括三種發(fā)送類型:Data、File、Script。當(dāng)發(fā)送類型為Data時(shí),需要將發(fā)送數(shù)據(jù)設(shè)置為包含幀頭、數(shù)據(jù)區(qū)、填充字節(jié)、校驗(yàn)和CRC、填充字節(jié)、數(shù)據(jù)區(qū)長和幀尾的數(shù)據(jù)。被測件主要是根據(jù)收到的回復(fù)數(shù)據(jù)中這些分區(qū)對(duì)應(yīng)的信息來做出回應(yīng)與操作的。幀類型包含Modbus、自定義幀兩種,若需要更多可進(jìn)行擴(kuò)展。當(dāng)發(fā)送類型為File時(shí),即選擇發(fā)送文件,文件類型未進(jìn)行指定。文件發(fā)送時(shí)將其轉(zhuǎn)為被測件可識(shí)別的編碼。
若發(fā)送類型是Script,即python腳本。這里選擇的文件必須是.py類型的,文件內(nèi)容由使用者根據(jù)被測件的需要進(jìn)行編寫,腳本內(nèi)容中在得到被測件發(fā)送的數(shù)據(jù)之后對(duì)其進(jìn)行操作,返回要回復(fù)的信息。
在進(jìn)行python腳本解析時(shí)需要提前進(jìn)行環(huán)境配置,在.cpp文件中添加Python.h的頭文件,這是調(diào)用python腳本必須的步驟,同時(shí)還要配置這個(gè)工程的.pro文件,將python的libs和include包含進(jìn)來。完成這些之后還需要將python腳本文件放在與exe文件同級(jí)目錄下才可保證正確的執(zhí)行。解析python腳本文件算法實(shí)現(xiàn)如下:
命令字的觸發(fā)實(shí)現(xiàn)方法分為兩種,一種是命令字匹配的形式進(jìn)行觸發(fā),還有一種就是通過定時(shí)器的設(shè)置進(jìn)行命令字的觸發(fā)。傳統(tǒng)意義上來說,第一種觸發(fā)方式的使用性較為廣泛,但是對(duì)于某些特定的被測件的連接通信要求來說,定時(shí)器的觸發(fā)方式是十分關(guān)鍵的,由于保密性要求,在此就不對(duì)被測件進(jìn)行舉例說明了。
單說定時(shí)器在QT中的應(yīng)用,就要涉及到線程的知識(shí),而又是因?yàn)槠脚_(tái)實(shí)現(xiàn)的多線程機(jī)制使得在這個(gè)基礎(chǔ)上實(shí)現(xiàn)定時(shí)器有一定的困難性,首先需要弄清楚每一條可被開啟的線程,其次是在定時(shí)器這個(gè)線程中做到命令字的觸發(fā)。功能的增加不能影響平臺(tái)通信的時(shí)效性,因此就要做到將定時(shí)器觸發(fā)命令字放在獨(dú)立的線程中去實(shí)現(xiàn)。
定時(shí)器的實(shí)現(xiàn)主要是通過設(shè)置周期和次數(shù)進(jìn)行的,周期指的是循環(huán)發(fā)送的周期時(shí)間,次數(shù)指的是周期性回復(fù)消息需要進(jìn)行的次數(shù)。這里的觸發(fā)和命令字的觸發(fā)不盡相同,定時(shí)器觸發(fā)不需要對(duì)接收到的被測件所發(fā)送來的數(shù)據(jù)進(jìn)行切分、遍歷等一系列的處理。在開啟設(shè)備且與被測件進(jìn)行連接成功后,被測件發(fā)送數(shù)據(jù),仿真設(shè)備接收數(shù)據(jù),從接收數(shù)據(jù)開始就已經(jīng)觸發(fā)了定時(shí)器操作,根據(jù)已經(jīng)設(shè)置好的周期與次數(shù)進(jìn)行回令發(fā)送。例如周期是1000 ms,次數(shù)是3次,則通信方式就是以周期為1000 ms的時(shí)間給被測件回復(fù)回令。
定時(shí)器觸發(fā)功能的添加并不會(huì)影響命令字觸發(fā),這兩個(gè)是在不同的線程中進(jìn)行處理的,具有同時(shí)同步性但是不具有互相干擾及阻塞性,不會(huì)出現(xiàn)等待現(xiàn)象或者讓步現(xiàn)象。因此在定時(shí)器觸發(fā)的情況下,設(shè)備仍然對(duì)接收到的數(shù)據(jù)進(jìn)行解析,按照命令字進(jìn)行匹配,解決了對(duì)于不同的被測件對(duì)測試的不同類別的需求。相關(guān)代碼段如下:
對(duì)于數(shù)據(jù)模式的要求有兩種,一種是ASCII,另一種是Hex十六進(jìn)制。兩種模式的提供使得數(shù)據(jù)的發(fā)送更具有擴(kuò)展性。在添加回令時(shí)設(shè)置回令的數(shù)據(jù)模式,一般情況下,在回令的發(fā)送類型為File時(shí),數(shù)據(jù)模式都會(huì)設(shè)定成ASCII模式,這樣方便文字及字母的發(fā)送,而Hex多數(shù)是在僅發(fā)送數(shù)據(jù)格式時(shí)設(shè)置。
在與被測件設(shè)備進(jìn)行通信時(shí),傳回來的數(shù)據(jù)經(jīng)常是十六進(jìn)制的,也就是說,在仿真設(shè)備對(duì)被測件發(fā)送數(shù)據(jù)時(shí),仍然需要的是十六進(jìn)制的支持。在QT封裝的通信協(xié)議中支持的字符格式是有一定的要求的,其中支持?jǐn)?shù)據(jù)發(fā)送的write函數(shù)中形參僅支持一個(gè)字節(jié)數(shù)組QByteArray,因此,需要將字符串轉(zhuǎn)化為字節(jié)數(shù)組才能使用此函數(shù)進(jìn)行發(fā)送。具體的操作步驟如下:
(1)把十六進(jìn)制字符串分成一個(gè)char數(shù)組,循環(huán)其中的兩個(gè)char,這兩個(gè)char的值一定都是在從0到9,從a到f之間的;
(2)先找到第一個(gè)char對(duì)應(yīng)的下標(biāo)位置,例如:char的值是a,那么下標(biāo)位置就是10,把數(shù)字10轉(zhuǎn)成byte類型,取低4位bit,然后用相同的辦法找到第二個(gè)char對(duì)應(yīng)的下標(biāo)數(shù)字,取到該數(shù)字的低4位bit;
(3)將剛剛?cè)〉降膬蓚€(gè)低4位bit拼在一起,第一個(gè)char對(duì)應(yīng)的4位bit為字節(jié)的高4位,第二個(gè)char對(duì)應(yīng)的4位bit為字節(jié)的低4位,這樣組成一個(gè)完整的8位字節(jié);
(4)循環(huán)完char數(shù)組,就得到了16進(jìn)制字符串對(duì)應(yīng)的字節(jié)數(shù)組。
軟件平臺(tái)提供了輔助工具,幫助使用者進(jìn)行CRC校驗(yàn)計(jì)算、浮點(diǎn)與十六進(jìn)制相互轉(zhuǎn)換、EB90校驗(yàn)和計(jì)算,方便用戶在操作數(shù)據(jù)發(fā)送與接收時(shí)對(duì)數(shù)據(jù)進(jìn)行簡單的翻譯與解讀。
平臺(tái)還提供了日志模塊,設(shè)置日志模塊的主要作用是為了顯示設(shè)備的運(yùn)行和停止?fàn)顟B(tài)、被測件的連接斷開狀態(tài)、被測件向外發(fā)送的信息記錄、命令字是否匹配成功與匹配成功后已經(jīng)發(fā)送的數(shù)據(jù)內(nèi)容。
用戶可根據(jù)關(guān)鍵字對(duì)日志模塊顯示的消息進(jìn)行查找,方便進(jìn)行數(shù)據(jù)的正確性判斷及查找比對(duì)。
根據(jù)對(duì)當(dāng)前日志的需求及日后要做的一些處理,平臺(tái)添加了日志保存功能,方便后期的查看分析與數(shù)據(jù)整合。
對(duì)于新建的設(shè)備,由于設(shè)備添加模塊是在其它的界面上操作完成的,所以在總體界面的左下角添加了設(shè)備屬性顯示功能,只要雙擊某一設(shè)備,它所對(duì)應(yīng)的有關(guān)屬性參數(shù)就會(huì)被顯示出來,平臺(tái)主界面如圖2所示。
圖2 主界面
在軟件開發(fā)過程中,測試是軟件質(zhì)量保證的關(guān)鍵,是產(chǎn)品發(fā)布并且提交給用戶的穩(wěn)定化階段。半實(shí)物仿真測試平臺(tái)的測試內(nèi)容主要為程序可擴(kuò)展性和用戶友好性兩個(gè)方面。
目前基于Windows 7、Windows10這兩種操作系統(tǒng)進(jìn)行測試,將由Release版本生成的myapp.exe執(zhí)行文件同libgcc_sdw2-1.dll、libstdc++-6.dll、libwinpthread-dll、Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll六個(gè)動(dòng)態(tài)銜接庫放置于一個(gè)文件夾中然后拷貝至兩種操作系統(tǒng)中[6]。通過測試發(fā)現(xiàn)該軟件平臺(tái)均可以在兩種操作系統(tǒng)上平穩(wěn)運(yùn)行,軟件平臺(tái)各個(gè)模塊間切換流暢。
該軟件在Windows7、Windows10操作系統(tǒng)上啟動(dòng)時(shí)間只需要幾秒,測試過程模擬了多個(gè)虛擬設(shè)備同時(shí)運(yùn)行,未出現(xiàn)異常。軟件平臺(tái)操作緊跟需求,界面簡潔美觀。
本文設(shè)計(jì)了基于Qt的半實(shí)物仿真測試平臺(tái),實(shí)現(xiàn)了從虛擬設(shè)備創(chuàng)建、命令字、回令添加到命令字匹配到信息發(fā)送的基本功能。通過測試該軟件平臺(tái)可以在Windows系統(tǒng)上平穩(wěn)運(yùn)行。值得一提的是,該軟件平臺(tái)增加新的回令發(fā)送模式,使消息回復(fù)的便捷程度提高,不過該平臺(tái)還僅適用于三種通信接口的半自動(dòng)化測試,希望將來通過完善實(shí)現(xiàn)更多通信接口以及受自動(dòng)化測試驅(qū)動(dòng)的功能??傊?,該軟件平臺(tái)在功能支持上對(duì)于地面測發(fā)控軟件的模擬與測試有著重要的意義。
[1]黃翩,張瓊,祝婷. 基于Qt的一個(gè)服務(wù)器多個(gè)客戶端的TCP通信[J]. 電子科技,2015,28(3): 76-78.
[2]王連慶,錢莉. 基于QT的3D相機(jī)軟件系統(tǒng)設(shè)計(jì)[J]. 軟件導(dǎo)刊,2021,20(3): 195-198.
[3]王維波,栗寶鵬,侯春望. Qt5.9 C++開發(fā)指南[M]. 北京:人民郵電出版社,2018.
[4]王宏明,林衛(wèi)永,王泉榮,等. 基于QT的XML文件自動(dòng)轉(zhuǎn)換方法[J]. 鐵路通信信號(hào)工程技術(shù),2021,18(2): 88-92.
[5]蘇州長風(fēng)航空電子有限公司. 一種基于QT控件的多線程數(shù)據(jù)通信方法: 中國,202110074862.9[P]. 2021-05-25.
[6]賴佳路,鐘仁明. 基于Qt的瘢痕疙瘩二維放療計(jì)劃快速設(shè)計(jì)平臺(tái)的構(gòu)建[J]. 中國醫(yī)療設(shè)備,2019,34(8): 108-111.
Construction of Hardware-in-the-Loop Simulation Test Platform for Aerospace Software
In order to further improve the degree of software automatic test, reduce the cost investment in manpower and time, and effectively improve the quality and efficiency of aerospace software testing. Taking Qt as the development framework, a hardware-in-the -loop simulation test platform is realized. The platform designs and implements semi-automatic test and user-defined test mode, which aims to provide a hardware in the loop simulation test environment for ground test, launch and control software. Through the test, the platform can run stably on Windows system and meet the requirements of reliable, efficient and convenient test of aerospace software.
automatic test; Qt; hardware-in-the-loop; simulation; semi-automatic test
TP27
A
1008-1151(2022)02-0005-04
2021-09-22
劉會(huì)穎(1998-),女,河北唐山人,北華航天工業(yè)學(xué)院計(jì)算機(jī)學(xué)院在讀碩士研究生,研究方向?yàn)檐浖y試。
劉紫陽(1993-),女,河北邢臺(tái)人,北華航天工業(yè)學(xué)院講師,研究方向?yàn)檐浖y試。