1. <th id="6wyyy"><address id="6wyyy"></address></th>
        <th id="6wyyy"><video id="6wyyy"></video></th>
        <th id="6wyyy"><address id="6wyyy"></address></th>

            1. <strike id="6wyyy"></strike>

              开心彩票网开心彩票网官网开心彩票网网址开心彩票网注册开心彩票网app开心彩票网平台开心彩票网邀请码开心彩票网网登录开心彩票网开户开心彩票网手机版开心彩票网app下载开心彩票网ios开心彩票网可靠吗
              網站地圖 原創論文網,覆蓋經濟,法律,醫學,建筑,藝術等800余專業,提供60萬篇論文資料免費參考
              主要服務:論文發表、論文修改服務,覆蓋專業有:經濟、法律、體育、建筑、土木、管理、英語、藝術、計算機、生物、通訊、社會、文學、農業、企業

              嵌入式系統的持續集成和自動化測試探析

              來源:原創論文網 添加時間:2020-04-03

                摘    要: 本文探討如何對嵌入式系統進行持續集成和自動化測試,并對其中的要點和難點提供解決方案。介紹了基于Gerrit系統,Jenkins系統和LAVA系統的測試框架設計與實現,并提供了基于嵌入式硬件的常見固件部署方法和測試交互方法,形成從框架到落地的完整方案介紹。

                關鍵詞: 嵌入式系統; 自動化測試; 持續集成;

                1 、背景介紹

                現代智能設備上使用的軟件系統越來越大,模塊眾多且功能復雜,加上生命周期長(如工業產品可能需要提供7-10年的軟硬件支持),使得軟件的維護難度和成本變高,這在嵌入式領域尤為突出。以典型的安卓操作系統為例,使用Git為基礎的REPO進行軟件版本管理,整個系統包含上百個倉庫,每個倉庫由不同的開發人員獨立維護,這么多不同模塊的持續開發和升級的過程給系統的集成和測試帶來極大的挑戰。

                持續集成是一種軟件開發實踐,即團隊開發成員在代碼提交進入主線之前,都通過自動化的構建(包括編譯、發布、自動化測試)來驗證代碼,保證進入主線的是相對穩定的代碼,保持主線隨時可用。

                相對于傳統的一些軟件開發方法,進行模塊劃分并分別開發和測試,到最后的階段才進行集成和測試,持續集成測試可以更早地發現軟件錯誤。持續集成的目的,是讓產品可以快速迭代,同時還能保持代碼高質量[1]。持續集成并不能消除軟件錯誤,但是可以非常容易的發現和改正軟件問題。在互聯網的一些軟件開發實踐中,在仿真環境進行持續集成測試后,配合持續交付和持續部署,可以實現敏捷開發進行快速的軟件版本升級迭代。

                2 、持續集成測試的應用

                為了提高系統代碼質量,需要在開發過程的各個環節都進行質量把控,包括代碼風格檢查、靜態代碼檢查、代碼編譯結果檢查、代碼實際運行效果等。這些都可以通過自動化測試系統來實現,減少開發人員的重復工作量。

                與互聯網應用程序這類運行于安卓或i OS的應用軟件不一樣的是,嵌入式軟件的運行需要依托特定的硬件,不同硬件的差異包括CPU的架構指令集、總線及外設、電源管理、PCB電路設計等各方面,同時對于部分接口如USB、PCIe等還存在外設類型多而雜等兼容性問題。

                在測試的實現上,需要把固件部署到具體的硬件上,同時測試過程中還需要與硬件進行交互。所以在嵌入式領域很難像互聯網軟件一樣利用自動化集成測試系統直接進行軟件的持續部署交付實現快速版本迭代,但這套系統對于嵌入式系統代碼質量的提高和降低維護成本仍然能夠起到很大的作用。由于實現難度較高但同時有較好的收益前景,嵌入式系統的自動化集成測試一直是近年來各種行業會議上的熱門議題。

                3、 自動化測試系統

                在集成測試的過程中,合理的設計流程并使用多個系統進行配合,在代碼審核環節加入自動化測試系統,就可以實現系統開發過程中對每個代碼提交都做驗證測試,達到提升效率和提高系統穩定性的目的。
               

              嵌入式系統的持續集成和自動化測試探析
               

                代碼審核系統有多種不同的類型,比較常見的有:企業內部較多使用的Gerrit審核系統;Linux內核主線和U-Boot等很多開源軟件使用郵件列表審核補丁;而隨著Github的大行其道,也有很多開源軟件是通過Github的Pull Request來完成審核。

                在實際的軟件實踐中,自動化測試系統需要適配代碼審核系統才能實現在審核過程中對代碼提前進行驗證。這些系統中最適合自動化集成的是Gerrit系統,這也是在企業中大量使用的免費開源自動化審核系統。

                本文以Gerrit系統為例來說明系統開發過程中如何通過審核環節提高代碼質量并通過LAVA系統進行自動化測試來加強代碼可靠性。

                3.1、 Gerrit系統簡介

                Gerrit是基于版本管理軟件Git的代碼審核系統,可以提供web頁面操作界面,同時保留API接口給第三方,并能夠根據配置主動發出事件通知或廣播,便于與Jenkins等軟件配合實現自動化集成測試。

                圖1 基于Gerrit審核系統的開發流程
              圖1 基于Gerrit審核系統的開發流程

                如圖1所示,基于Gerrit審核系統的開發流程包含以下步驟[2]:

                (1)開發工程師從Git服務器主線獲取最新代碼。

                (2)工程師在本地開發,修改代碼后,把補丁推送到Gerrit系統進行審核。

                (3)Jenkins監測到新的提交,觸發測試任務,把Gerrit的新提交補丁提取下來。

                (4)Jenkins按照測試任務的內容進行驗證。

                (5)Jenkins把驗證結果返回Gerrit,在Gerrit對應提交上會有Jenkins Verify+/-1的反饋意見。

                (6)審核者查看Gerrit上的代碼提交,并參考Jenkins驗證結果對補丁進行審核。

                (7)代碼審核通過后,補丁合并到Git服務器主線。

                以上7個步驟就是一個完整的開發流程。如果沒有Jenkins配合,就不存在以上第3~5步步驟。Gerrit審核只能完全依靠審核者的個人素質進行全面的代碼檢查。

                3.2、 Jenkins系統簡介

                Jenkins是一個開源的持續集成工具,主從服務器結構。主機負責監聽上游的事件、任務管理調度,從機負責執行編譯、部署測試等所有任務。Jenkins支持大量的插件,比如自動進行代碼更新、設置觸發器、發送郵件通知相關人員,任務以陣列形式同時支持多個設備測試等等。

                除了本身支持的插件,也可以自己使用Shell腳本來寫需要執行的任務,這樣在任務的設置上非常的靈活和自由。一般會在Jenkins任務的腳本中加入用于代碼風格檢查、代碼靜態檢查、全方位編譯等與硬件無關的任務。到這一步,已經可以輔助實現很多檢查內容,減少人力消耗,而如果需要進一步地讓剛剛修改的代碼在實際的硬件上運行來檢查代碼的影響,則需要用到LAVA系統的輔助。

                3.3、 LAVA系統

                前文提到在嵌入式系統的驗證上,主要的難點是在實際的硬件上部署固件和運行測試。LAVA(Linaro Automation and Validation Architecture)系統就是Linaro為了解決嵌入式系統的硬件驗證而提出來的系統。

                LAVA是主從架構,可以使用一主多從或多主多從的架構[3]。服務器端負責接收任務、調度任務、結果存儲和顯示,有前臺HTTP網頁提供直觀的結果顯示。從機端也叫Worker,每個從機可運行多個LAVA dispatcher。每個LAVA dispatcher對一個DUT(Device Under Test)進行一個完整的測試。

                圖2 基于LAVA的自動化測試系統
              圖2 基于LAVA的自動化測試系統

                如圖2所示,Jenkins的任務是由觸發器來啟動任務的。Jenkins支持多種觸發方式,包括定時器觸發和Gerrit事件觸發。Gerrit上有新的補丁提交或補丁有更新時,會生成對應的事件,可以被Jenkins系統監測到。Gerrit補丁的驗證一般需要比較快速的返回,對應的測試用例通常是較為簡單的啟動測試。另外一種測試需求是比較完整的功能測試或壓力測試。它耗時較長且沒必要每個補丁都進行測試,就可以采用定時器觸發的方式來實現。通過設定對特定系統和硬件進行每天、每周的測試任務,來進行全方位的測試。另外在調試或其他有需求的時候,Jenkins的管理員可以手動觸發某個任務開始測試。

                Jenkins任務被觸發后,Jenkins服務器就會開始進行調度,分配到可用的Jenkins slave來執行對應任務。對于需要LAVA輔助的任務,Jenkins slave要準備好所需的固件和任務內容后,把任務提交給LAVA服務器。LAVA服務器首先檢查任務的內容,包括待測設備及其所屬LAVA Dispatcher的健康狀況和可用狀況,確定都可用后將任務分配到對應的Dispatcher。

                由圖2可以發現,LAVA的dispatcher與DUT之間連接包括網絡連接和USB連接,另外可能需要額外的硬件來輔助控制DUT供電開關、進入升級模式等。網絡連接可以根據需要,作為固件獲取通道,如U-Boot等BootLoader支持的TFTP boot通過網絡啟動;也可以在系統進入kernel后,作為測試交互通道,如通過ssh登錄到DUT執行后續的測試命令。USB連接一方面是實現DUT的調試串口終端連接,另一方面也可以根據需求實現固件升級,如安卓設備通過usb的fastboot功能來升級固件。

                LAVA測試中DUT要運行的固件和DUT要運行的測試任務,是相互獨立得到的。其中固件直接由Jenkins系統提供,而測試任務是在Jenkins提供的LAVA任務中指定。由于測試任務有一定的通用性,提供一個獨立的測試用例倉庫,Jenkins只需要提供測試用例的名稱和參數即可。LAVA在執行任務的過程中,需要自己獲取測試用例倉庫并把實際需要運行的測試用例與參數結合后,更新到DUT的固件中。

                LAVA的Dispatcher完成對DUT的測試后,將結果發送給LAVA Server。這樣在LAVA Server的前段網頁中就可以完整地看到整個任務從部署得到測試結果情況的詳細信息,使開發者可以詳細地了解每一個步驟的具體情況。

                在此,有必要深入地介紹LAVA Dispatcher的實現流程,以便了解LAVA系統對硬件DUT進行測試這個關鍵環節的細節。典型的LAVA Dispatcher的Pipeline測試流程圖3所示。

                圖3 LAVA dispatcher測試流程
              圖3 LAVA dispatcher測試流程

                整個測試過程包含部署、啟動、測試、結束四個階段。

                部署(deploy)階段就是把所需固件部署到目標DUT硬件上。首先解析任務內容,獲取測試任務,通過Git下載測試用例倉庫(test-definition)并提取所需的用例,與任務提供的測試參數結合后,形成一個包含所有測試內容的overlay壓縮包。這個壓縮包需要打包到Jenkins提供固件里面的rootfs中。這樣DUT的系統運行起來后,就能直接訪問到所有測試資源。Dispatcher準備好固件后,就可以讓DUT進入固件下載模式,然后把固件升級到DUT的存儲介質中。基于不同DUT的實現模式,有可能實際通過USB把固件寫到e MMC里面,也可能只是準備好網絡環境,讓DUT可以從預設的網絡地址啟動。

                啟動(boot)階段首先需要連接DUT的串口終端以便獲取啟動信息。然后復位DUT使DUT重新啟動,并監測啟動信息的內容,等待預設的提示符(prompt)出現,如果預設信息出現則認為啟動完成。

                測試(test)階段是在啟動階段完成后,自動調用預設好的測試命令,并監測測試信息輸出。測試命令通常是調用測試腳本,測試腳本按照已有的測試框架和測試項逐項進行測試,并把每一項的測試結果通過預設的協議發送給LAVA。

                結束(finalize)階段是所有DUT和測試都通用的環節,包括讓DUT下電、清理臨時文件、總結測試情況等。

                4、 總結

                嵌入式系統的持續集成和自動化測試,有非常多的內容,各個環節都還有很多值得研究的系統和框架。本文介紹的LAVA系統只是其中一種目前較為廣泛用于ARM Linux系統的測試平臺框架。還有很多其他測試框架,如Google的Chrome OS團隊使用的是AutoTest框架[4],另外也有一些如Fuego、Avacado框架在不同的團隊使用[5]。當前開發者最多、影響最為廣泛的開源項目Linux kernel在自動化測試方面,是由KernelCI(https://kernelci.org/)負責,使用的就是本文介紹的LAVA系統。

                在測試用例方面,也有各種不同的框架,有很多值得研究分析的內容,比如針對Linux Kernel就有LTP(Linux Test Project)、Kselftest(Linux Kernel Testing Framework)、LKFT(Linux Kernel Functional Test framework)等等框架。

                參考文獻

                [1] Continuous integration, https://en.wikipedia.org/wiki/Continuous_integration
                [2] TeamForge Git/Gerrit Integration with Jenkins CI, https://resources.collab.net/blogs/teamforge-git-gerrit-integration-with-jenkins-ci,2012,11,14
                [3] Introduction to LAVA, https://docs.lavasoftware.org/lava/,2019,12,31
                [4] Autotest-Testing the Untestable, https://autotest.readthedocs.io/en/latest/_downloads/admanski.pdf, 2009,07,13
                [5] Test standards-can Fuego, Lava and others agree? https://connect.linaro.org/resources/sfo17/sfo17-116/, 2017,10,06

              重要提示:轉載本站信息須注明來源:原創論文網,具體權責及聲明請參閱網站聲明。
              閱讀提示:請自行判斷信息的真實性及觀點的正誤,本站概不負責。
              开心彩票网{{转码主词}官网{{转码主词}网址