吳舒蓉
(福建省農(nóng)村信用社聯(lián)合社 福建 福州 350004)
隨著嵌入式計算機在生產(chǎn)和生活中的廣泛應用,它的可靠性和安全性變得愈加重要,嵌入式計算機軟件的可靠運行是保證日常生產(chǎn)生活順利進行的關(guān)鍵。 嵌入式計算機軟件是嵌入式系統(tǒng)中最復雜的部分之一,對嵌入式計算機軟件進行測試,可以及時發(fā)現(xiàn)軟件運行中的問題和代碼錯誤,對軟件中問題的及時修正和軟件改進有很大的幫助[1]。
嵌入式計算機軟件是指運行在嵌入式計算機系統(tǒng)中的應用程序或操作系統(tǒng)等。 嵌入式計算機是集成在其他設備中的微處理器系統(tǒng),通常用于控制和監(jiān)測設備。 與傳統(tǒng)的桌面計算機和服務器不同,嵌入式計算機通常需要滿足資源占用少、功耗低、穩(wěn)定可靠等要求[2]。 嵌入式計算機軟件測試是驗證嵌入式計算機軟件正確性、完整性和安全性的過程,包括功能測試、性能測試、安全測試等。
嵌入式計算機作為其他設備的一部分,通常與其他設備緊密耦合,且嵌入式計算機通常內(nèi)存容量較小,數(shù)據(jù)處理能力也較弱,因而在嵌入式計算機軟件測試時,必須考慮到資源受限以及資源占用的問題。 此外,嵌入式計算機的運行環(huán)境通常較為復雜,需要與多種外設設備交互,因而嵌入式計算機軟件測試還需要考慮軟件在真實的環(huán)境條件中測試是否順利的問題。
隨著嵌入式計算機技術(shù)的不斷發(fā)展,嵌入式計算機軟件測試也在不斷地演進和完善。 目前,嵌入式計算機軟件測試的主要方法包括仿真測試、靜態(tài)分析、動態(tài)測試、自動化測試等。 在實際應用中,各種測試方法相互結(jié)合,以提高測試效率和準確性。
隨著仿真技術(shù)的不斷發(fā)展和成熟,仿真測試已經(jīng)成為嵌入式計算機軟件測試中的重要手段。 嵌入式計算機的運行通常與外設設備有關(guān),因此采用動態(tài)測試技術(shù)進行測試是非常必要的。 自動化測試是指利用腳本或程序自動執(zhí)行測試用例,以提高測試效率和準確性。 對于嵌入式計算機的測試,如何實現(xiàn)自動化測試,是需要研究的關(guān)鍵技術(shù)[3]。
盡管目前嵌入式計算機軟件測試技術(shù)已經(jīng)發(fā)展得較為成熟,但嵌入式計算機軟件測試技術(shù)的發(fā)展依然面臨著許多挑戰(zhàn)。 首先,嵌入式計算機軟件測試的復雜性不斷增加的問題,隨著嵌入式計算機系統(tǒng)的不斷升級和改革,系統(tǒng)設計的復雜程度也在不斷提高,如何將日益復雜的測試需求簡單化,對復雜系統(tǒng)進行全面的測試,依然是研究人員需要考慮的問題。 其次,嵌入式計算機軟件的安全性測試問題依然突出,隨著互聯(lián)網(wǎng)和物聯(lián)網(wǎng)技術(shù)的發(fā)展成熟,嵌入式計算機軟件面臨的安全環(huán)境越來越復雜。 如何針對嵌入式計算機軟件的特點,進行安全測試和漏洞檢測,提高嵌入式計算機軟件代碼的測試覆蓋率和有效性,實現(xiàn)自動化測試,提高測試效率和準確性,也是下一步的研究重點。
進行嵌入式計算機軟件測試首先要進行軟件需求分析,其次是測試用例的設計,測試的執(zhí)行以及缺陷的追蹤和修復,最后是測試文檔的編寫和提交,如圖1 所示。
圖1 嵌入式計算機軟件測試流程圖
下面是嵌入式計算機軟件測試中的關(guān)鍵技術(shù)。
靜態(tài)代碼分析是一種在編譯之前或不運行程序的情況下對代碼進行檢查和分析的技術(shù),該技術(shù)可以對源代碼進行靜態(tài)檢測,發(fā)現(xiàn)代碼中如未初始化變量、內(nèi)存泄漏、空指針引用等潛在缺陷和錯誤[4]。
靜態(tài)代碼分析工具通常依賴于規(guī)則庫和算法,它們使用諸如控制流分析、數(shù)據(jù)流分析、符號執(zhí)行等技術(shù)來找出代碼中的錯誤。
靜態(tài)代碼分析可用于各個開發(fā)階段,包括需求分析、設計、編碼和測試。 它可以幫助開發(fā)人員更早地發(fā)現(xiàn)并糾正問題,以減少修復成本并加快開發(fā)周期。 另外,還可以幫助確保代碼符合標準和最佳實踐,提高代碼質(zhì)量和可維護性。
常見的靜態(tài)代碼分析工具包括Coverity、Lint 等。 這些工具通常支持多種編程語言,例如C/C++、Java、Python等,并提供了豐富的規(guī)則庫和定制選項,以適應不同項目的需求。
動態(tài)測試是一種程序運行時對其進行測試的技術(shù)。通常在軟件完成編譯和鏈接后進行,測試人員可以通過手動或自動化的方式,利用各種測試工具和框架來執(zhí)行測試用例并收集測試結(jié)果[5]。
常見的動態(tài)測試方法包括黑盒測試、白盒測試、灰盒測試等。 其中黑盒測試是一種基于需求規(guī)格或功能說明書的測試方法,測試人員只需關(guān)注軟件的輸入和輸出,而不需要了解內(nèi)部實現(xiàn)細節(jié);白盒測試則需要測試人員了解軟件的內(nèi)部結(jié)構(gòu)和算法,以設計測試用例并檢查驗證程序的邏輯流程是否正確;灰盒測試則是介于黑盒測試和白盒測試之間的測試方法[6]。
動態(tài)測試工具通常需要程序員在代碼中添加一些調(diào)試信息或鉤子,以使得測試工具能夠收集足夠的數(shù)據(jù)并生成報告。 常見的動態(tài)測試工具包括Valgrind、Gcov、JMeter 等。
該技術(shù)是一種粒度較小的測試方法,即對單個函數(shù)或模塊進行測試,以確保其功能正確性。 單元測試作為一種軟件測試技術(shù),目標是通過測試程序的最小可測試部分來發(fā)現(xiàn)和糾正問題,從而盡早地消除潛在缺陷和錯誤。 它通常由開發(fā)人員編寫并在開發(fā)過程中執(zhí)行,以確保代碼質(zhì)量和可維護性。
嵌入式計算機軟件測試中加入單元測試,可以更早發(fā)現(xiàn)在模塊中的問題,可以確保代碼符合標準和最佳實踐,并避免代碼復雜性和技術(shù)債務的累積。 單元測試也可以改善嵌入式計算機軟件的可維護性,通過提高代碼的可讀性和可測試性,可以使得未來的修改和擴展更加容易和安全[7]。 常見的測試框架包括Google Test、JUnit、NUnit、Unity 等。 斷言庫則是一組用于檢查程序輸出是否符合預期的工具,通常使用在測試用例中的語句中。 斷言庫通常提供了豐富的比較操作符和錯誤消息,以使得開發(fā)人員能夠更精確地描述和定位問題。
集成測試是將多個模塊組合起來進行測試,用于測試多個模塊或組件之間的交互和協(xié)作是否正確。 它通常在單元測試之后進行,以確保不同模塊的集成和整個系統(tǒng)的功能表現(xiàn)符合預期。 集成測試是一種必要的軟件測試技術(shù),它可以幫助測試人員在整個系統(tǒng)集成之前發(fā)現(xiàn)和糾正問題,以確保整個系統(tǒng)的正確性和魯棒性。
集成測試分為自下而上的集成測試和自上而下的集成測試。 自下而上的集成測試是從最底層的模塊開始逐步向上集成,直到整個系統(tǒng)集成完成。 自上而下的集成測試則是從整個系統(tǒng)開始逐步向下集成,最終涵蓋所有模塊和組件。
集成測試通常需要使用與實際系統(tǒng)環(huán)境相同的硬件和軟件環(huán)境來進行測試,并通過模擬用戶操作和各種場景來驗證系統(tǒng)的功能和性能。
在進行集成測試時需要注意以下幾點:
(1)測試順序。 測試應該按照集成的順序逐步進行,以確保已經(jīng)集成的模塊和組件是正確的,并能夠與新集成的部分協(xié)同工作。
(2)測試數(shù)據(jù)。 為了獲得高效和實際的測試結(jié)果,測試人員應該使用真實的數(shù)據(jù),如真實的輸入流和輸出流。
(3)虛擬化。 如果測試受到硬件或網(wǎng)絡的限制,可以使用虛擬化技術(shù)來模擬系統(tǒng)環(huán)境和資源。
(4)模擬。 測試人員應該考慮模擬不同的場景和條件,例如高負載、低帶寬等。
(5)自動化:測試應該通過可靠的自動化測試框架來執(zhí)行,以提高測試效率和覆蓋率。
可靠性測試通過長時間運行、較大數(shù)據(jù)量的輸入,對軟件系統(tǒng)的穩(wěn)定性和可靠性進行測試,用于評估軟件在給定條件下的穩(wěn)定性、可用性和可靠性。 它通常在功能測試和性能測試之后進行,以驗證系統(tǒng)在長時間運行和不斷使用的情況下是否仍然保持良好的性能和質(zhì)量。 常見的可靠性測試工具包括LoadRunner、JMeter、Appium、RapiTest、Tessy 等。
可靠性測試可以幫助開發(fā)人員找出潛在的缺陷和錯誤,并確定系統(tǒng)在特定條件下的故障率和失效率等指標。它需要模擬真實環(huán)境下的使用場景和負載,如高并發(fā)、高負載、長時間運行等,以測試軟件的穩(wěn)定性和魯棒性。
可靠性測試通常需要使用各種工具和技術(shù)來執(zhí)行,可靠性測試包括負載測試、異常測試、穩(wěn)定性測試、可用性測試。 負載測試需要測試系統(tǒng)在不同負載下的性能,例如壓力測試、容量測試、耐久測試等;異常測試用于測試系統(tǒng)對異常情況的響應和處理能力,例如網(wǎng)絡中斷、崩潰、數(shù)據(jù)損壞等;穩(wěn)定性測試用于測試系統(tǒng)的穩(wěn)定性和可靠性,例如運行時間長短測試、錯誤恢復測試等;可用性測試用于測試系統(tǒng)的易用性和用戶界面設計,例如人機交互測試、多語言測試等。
可靠性測試需要注意以下幾點:
(1)測試目標。 測試人員應該明確測試的目標和范圍,并制定相應的測試計劃和用例。
(2)環(huán)境模擬。 測試環(huán)境應該盡可能地模擬真實環(huán)境下的條件和負載,以確保測試結(jié)果的準確性和可靠性。
(3)測試數(shù)據(jù)。 測試數(shù)據(jù)應該足夠多樣化和真實,以覆蓋各種情況和場景。
(4)自動化測試。 測試應該通過可靠的自動化測試工具來執(zhí)行,以提高測試效率和覆蓋率。
性能測試常見的工具包括LoadRunner、JMeter 等。 通過模擬實際使用情況下的負載,用于評估系統(tǒng)在不同負載下的性能和穩(wěn)定性。 它通常在開發(fā)過程中進行,并嘗試模擬真實環(huán)境下的負載和使用情況,以確定軟件的響應時間、吞吐量、并發(fā)性和可擴展性等指標。
性能測試可以幫助開發(fā)人員找出系統(tǒng)的瓶頸和性能問題,并提出改進建議,以確保系統(tǒng)在生產(chǎn)環(huán)境中具有良好的性能和可靠性。
性能測試主要分為負載測試、壓力測試、容量測試、耐久測試、并發(fā)測試。 其中,壓力測試用于測試系統(tǒng)在高負載下的性能和穩(wěn)定性,例如同時連接多個用戶、大數(shù)據(jù)量輸入輸出等;容量測試用于確定系統(tǒng)在預期的容量下的性能和穩(wěn)定性,例如處理大量數(shù)據(jù)或請求時的表現(xiàn);耐久測試用于測試系統(tǒng)在長時間運行下的性能和穩(wěn)定性,例如連續(xù)運行數(shù)天或數(shù)周的測試;并發(fā)測試用于測試系統(tǒng)在多個用戶同時訪問情況下的性能和穩(wěn)定性,例如并發(fā)用戶登錄、查詢等。
性能測試通常需要使用各種工具和技術(shù)來執(zhí)行,主要有以下幾類:
(1)負載測試工具。 用于模擬真實環(huán)境下的負載情況和用戶行為,例如JMeter、LoadRunner 等。
(2)性能分析工具。 用于監(jiān)視系統(tǒng)性能指標并識別瓶頸,例如AppDynamics、Dynatrace 等。
(3)代碼優(yōu)化工具。 用于檢測和修復代碼中的性能問題和缺陷,例如GProf、Valgrind 等。
安全測試通過模擬不同類型的攻擊,測試系統(tǒng)的安全性能,以確保系統(tǒng)不會受到未授權(quán)訪問或其他安全問題的影響。 安全測試主要通過模擬惡意攻擊、驗證身份認證和授權(quán)機制、檢查數(shù)據(jù)加密和解密等方面來確定系統(tǒng)是否滿足安全需求。 常見的安全測試工具包括開放式Web 應用程序安全項目(open web application security project zed attack proxy,OWASP ZAP)、Nmap、Nessus、Burp Suite、交互式反匯編器專業(yè)版(interactive disassembler professional,IDA Pro)、Ghidra 等。
安全測試可以幫助開發(fā)人員找出潛在的安全漏洞和缺陷,幫助開發(fā)人員和測試人員評估系統(tǒng)的安全性和保護能力,并在發(fā)現(xiàn)潛在風險時提供改進建議,以確保系統(tǒng)在生產(chǎn)環(huán)境中具有良好的安全性和保護能力。
安全測試主要分為漏洞掃描、滲透測試、認證和授權(quán)測試、數(shù)據(jù)加密測試、安全審核。 漏洞掃描使用自動化軟件工具對系統(tǒng)進行掃描并識別未經(jīng)授權(quán)訪問或敏感數(shù)據(jù)泄露等問題;滲透測試使用手動或自動化工具對系統(tǒng)進行攻擊并測試其響應和防御能力;認證和授權(quán)測試系統(tǒng)對用戶身份認證和授權(quán)機制的有效性和正確性;數(shù)據(jù)加密測試用來測試系統(tǒng)中的敏感數(shù)據(jù)是否被合理地加密和解密;安全審核對系統(tǒng)架構(gòu)、源代碼、文檔等進行審核,以發(fā)現(xiàn)安全問題和缺陷。 安全測試通常需要使用各種工具和技術(shù)來執(zhí)行,常見的安全測試工具有Nessus、Burp Suite 等,漏洞數(shù)據(jù)庫有美國國家安全漏洞庫(National Vulnerability Database,NVD)、通用漏洞披露(Common Vulnerabilities & Exposures,CVE)等,反向工程和代碼審查工具主要有IDA Pro、Ghidra等,常見的網(wǎng)絡模擬器有Wireshark、Tcpdump 等。
安全測試需要注意以下幾點:
(1)測試目標。 測試人員應該明確測試的目標和范圍,并制定相應的測試計劃和用例。
(2)模擬攻擊。 測試應該盡可能地模擬真實環(huán)境下的攻擊和威脅,以確保測試結(jié)果的準確性和可靠性。
(3)數(shù)據(jù)隔離。 測試過程中要避免污染真實數(shù)據(jù),使用虛擬化或其他技術(shù)來隔離測試數(shù)據(jù)。
(4)安全性保護。 測試過程中要遵循安全原則,防止測試過程中導致系統(tǒng)被攻擊或受到損害。
對嵌入式計算機軟件進行測試是保證軟件運行質(zhì)量和穩(wěn)定性的重要手段,在具體測試時,需要針對其特點設計相應的測試方案和技術(shù)方法,并根據(jù)不同條件下的測試結(jié)果來對軟件代碼進行優(yōu)化調(diào)整,以保證軟件能夠穩(wěn)定運行并發(fā)揮出最佳性能。