鞠小林,陳 翔,文萬志,張艷梅
(1. 南通大學 計算機科學與技術學院, 江蘇 南通226019;2. 中國礦業大學 計算機科學與技術學院,江蘇 徐州221116)
人類社會正進入信息時代,軟件成為社會信息化轉型的第一推動力。軟件質量逐漸成為保障社會生產生活健康運行的核心要素。保障軟件質量的重要手段是軟件測試。探索如何培養大量優秀的軟件測試人才是我國信息化建設過程中亟待解決的問題。
目前,國內高校計算機相關學院已經將軟件測試作為計算機專業的一門重要專業基礎課程,面向本科生、研究生講授軟件測試理論、方法和技術[1]。由于軟件測試課程開設起步較晚,課程的理論教學和實踐環節常常與產業界對軟件測試人員的素質培養需求脫節[1,2],尤其是用于實訓環節的教學案例項目,往往是教科書中示例程序的翻版,這導致了學生機械地記住課程介紹的測試理論知識及方法,在課程實踐環節中也只是機械地照搬應用,而不能掌握軟件測試相關知識的本質,進而導致在實際的軟件開發環節不能靈活地運用所學理論和方法。最近,《國務院辦公廳關于深化產教融合的若干意見》提出[3]:“大力支持應用型本科和行業特色類高校建設,緊密圍繞產業需求,強化實踐教學,完善以應用型人才為主的培養體系。”本文探討了“產教研”融合的軟件測試課程案例庫構建思想。
在多年的軟件測試課程教學過程中,不少教師致力于構建一個用于實踐教學的案例庫,取得了一定的效果。深入調研后我們發現,目前已有的軟件測試教學案例庫現狀如下:①案例來源多樣。案例庫中的素材或者改編自教材中的示例程序,或者由任課老師自己構造設計,或者來自同行的貢獻。②案例覆蓋知識面狹窄。這些案例大多僅覆蓋了軟件測試領域的部分知識點,且可選案例數量較少。③案例與科學研究關系松散。很難從案例中提煉出科學問題,供任課老師深入開展研究。④案例很少迭代改進。案例庫在教學過程中及每輪教學結束之后被束之高閣,下一輪軟件測試課程教學大多還是基于同樣的案例。
分析課程教學中的案例可以發現,這些案例雖然可以初步滿足部分知識點的實踐教學需要,但結合知行合一的教學目的及新工科的專業建設要求,普遍存在如下問題。
(1)案例庫覆蓋的知識點零散,缺乏系統性。國內高校開設軟件測試課程起步較晚,課程使用的案例建設尚處于初級階段。在實踐環節,教師和學生缺乏統一的案例庫建設指導框架,只能采用分散的案例以覆蓋各部分知識點。這種實踐教學方式不利于學生領會軟件測試的核心理論和方法,也不利于培養學生實踐中的系統化思維能力。
(2)案例教學目的單一,案例內容與企業實際測試需求脫節。多數高校的軟件測試教師是博士畢業后直接到高校工作,這部分教師有堅實的理論基礎,但普遍缺乏IT企業工作背景[1]。這導致教師在軟件測試課程的教學上表現為兩種傾向:一是側重講授課程基礎理論知識以及傳統的軟件測試方法;二是在課程實踐安排上側重于已有的代碼案例。這些案例主要來源于教材或參考資料的示例程序,盡管這些重復使用的案例具有一定的代表性,但由于教材及參考資料的滯后性,多數案例已與現階段的企業實際軟件項目測試需求大不相同,學生很難得到身臨其境的實踐體驗。
(3)案例教學組織與教師的科學研究關聯松散。軟件測試課程致力于向學生傳授測試方法和技術,這些方法和技術能直接解決現實軟件開發過程當中的問題。實踐這些方法和技術的過程本身便是軟件開發(即測試腳本開發),同樣面臨軟件質量保障問題,同樣需要滿足測試腳本的質量保障需求。高校中普遍存在著重視科研、輕視教學的現象。建設教學案例庫需要耗費大量人力,而教師面臨著科研壓力,因此在課程教學的案例建設上投入的精力就受到制約。
科學地選取企業界的軟件開發數據作為軟件測試案例素材并開展教學設計,合理組織案例教學過程,提出科學問題,然后結合教學過程數據,探求科學問題的答案,形成一套行之有效的“產學研”融合的案例教學方案。設計思路如圖1所示。

圖1 “產學研”融合的案例教學方法
圖1中,來自IT企業的軟件源代碼、測試用例集、缺陷報告等構成軟件測試課程教學的第一手素材。這些來自產業一線的真實素材,反映了軟件質量保障中的真實需求。基于這些真實素材加以抽象建模,構建出教學案例庫,從而便于開展案例教學。在教學過程中,以“軟件工程知識體系指南(SWEBOK V3.0)” 中與軟件測試緊密相關的兩個知識域( “軟件測試”“軟件質量保證”)為理論基礎[4],以軟件測試思維導圖為教學路線圖[5],結合新工科背景下軟件實踐能力培養要求,組織實踐教學[6]。教師在教學的同時,對實踐教學進程進行跟蹤。組織學生作為測試用戶,度量學生的行為數據,學生的活動軌跡,敏銳地發現具備挑戰的科研問題,包括產業實踐問題、理論學術問題、實驗科學問題等,并利用這些數據更好地解決科研難題,做到IT產業、軟件教學和教師科研的“產業、教學、科研” 融會貫通,從而更好地帶領學生通過實踐接觸到一線IT企業,理解企業的需求;另一方面,教師可以根據在教學中發掘的科學問題,進一步設計教學組織并收集教學運行數據,深入探索并解決上述研究問題。
軟件測試技術重在實踐。將來自IT產業的軟件項目作為測試課程教學的實際案例,同時選用目前軟件企業的測試人員使用的主流軟件測試工具搭建測試環境。學生們在學習軟件測試理論的同時,借助課程搭建的實踐環境,運用常用的測試工具,針對現實的測試需求,基于來自企業的真實案例,開展習得性訓練,切實掌握軟件測試方法和技術,從而真正理解和認可軟件測試的價值。
為了獲得好的產業素材,教師平時要注意建立和加強與軟件企業的聯系。途徑如下:首先,教師可以參與軟件企業的軟件開發過程,特別是參與軟件項目測試環節;其次,教師也可以以技術顧問的身份,參加到軟件企業的測試團隊中去。通過這兩種方式,教師可以獲取到企業當前正在開發的軟件項目的資料,征得企業同意,脫敏后作為教學案例使用;第三,如果教師從身邊的企業獲取素材有困難,還可以從開源網站(如GitHub等)下載一些已有的開源軟件作為案例庫建設素材。
此外,我們目前正嘗試探索一條更為有效的IT企業與學校合作道路。通過與IT企業合作,引入企業正在開發的軟件項目,并將部分測試任務打包,在測試教學實踐環節,交由在校大學生完成相關測試任務。通過這種校企合作,巧妙化解測試教學案例庫建設的素材來源困境。
軟件測試是一門實踐性很強的課程,這決定了課程教學的實踐環節設計極具挑戰性。一方面,軟件測試的研究對象是軟件,另一方面,測試人員設計的測試腳本也是軟件,測試用例也需要測試人員另外設計。此外,測試過程還需要構建測試運行環境。例如,可能會使用到一些測試工具,這些工具同樣需要配置。
一般而言,來自IT企業的素材并不能直接作為教學案例使用,需要脫敏后根據教學要求加以抽象、提煉。一般而言,實際的軟件項目往往規模巨大,學生要在短時間內完整理解軟件非常困難,更不必說去測試該軟件項目。此時,教師可以選擇實際軟件項目的一部分代碼,輔助相關說明文檔,并進一步描述測試需求。學生在文檔資料的幫助下,理解待測軟件功能、性能等情況,依據測試需求開展實踐訓練。特別是對于一些企業正在開發的軟件項目,教師可以引導學生同步地參與到軟件項目的開發過程中去,分解部分測試需求,讓學生在真實項目背景下,通過實踐練習,掌握軟件測試的實戰方法和技巧。
對于課程實踐環境使用到的軟件測試工具,則建立工具倉庫,輔助相關的工具教學文檔、教學視頻和簡單練習素材等,讓學生可以在最短的時間內,通過自學掌握軟件測試工具的使用方法。
軟件測試的教學目的是讓學生掌握已有的知識,包括軟件測試理論、方法和技術。這些知識往往是研究人員在解決軟件開發實踐問題的過程中不斷總結提升獲得的。高校教師一方面承擔著教書育人的重任,另一方面還承擔著學科前沿的科學研究任務。因此,高校教師應具備敏銳的學術敏感性和洞察力,要擅長從日常教學工作中,發現、提煉學術研究問題,最終為所在學科的學術科研服務。
在教學過程中,將學生視為軟件案例的用戶,收集學生實踐活動的數據,觀察和分析學生的行為,提出更高層次的學術研究問題作為研究目標。并據研究目標,調整和組織學生參加新的實踐活動,同樣收集用戶行為數據,分析這些數據,探索、研究問題的答案。
通過上述辦法,從產業界獲取案例素材,加工整理后作為實踐教學案例庫,在教學過程中及時發現新的研究問題,并調整或優化已有的教學案例教學方案,收集學生的實踐活動數據,探尋科研問題的答案,從而形成一條“產學研”融合的軟件測試教學實踐之路。
與普通初等教育目標不同,高等教育專業課程教學具備兩個特征:一方面是教會學生掌握已知的專業知識。一般通過老師講解,學生實踐去掌握這些知識;另一方面,高等教育還有一項更為重要的目標,就是引導師生共同發現專業問題,并共同探索科學問題的解決之道。這兩個特征決定了在設計軟件測試專業課程實踐環節時,既要考慮讓學生掌握基礎的軟件測試理論、方法和技術,又要考慮便于教師和學生利用實踐平臺,開展專業問題研究。圖2展示了軟件測試課程的實訓平臺的設計要素。

圖2 軟件測試案例實訓教學平臺架構
圖2從數據層、工具層和用戶層描述了軟件測試實訓平臺的架構。其中①數據層主要解決案例庫的構建和教學進程數據的跟蹤記錄。實訓案例主要來自IT企業開源或共享的項目代碼、測試用例集、缺陷報告等;教學進程數據主要來自工具層收集的用戶行為、軟件行為數據等。軟件測試知識及項目領域知識主要用于為工具層的數據分析過程提供理論依據。②工具層主要提供了軟件測試各階段的常用工具及測試腳本,還提供用于跟蹤用戶行為、軟件行為的工具,此外,為了探索軟件測試相關的科研和教學問題,還提供了一組數據分析工具。③用戶層主要面向3類用戶的需求。IT企業提出測試任務需求、技術支持需求等;教師和學生一方面需要學習專業課程的理論和實踐知識,另一方面,需要就教學過程中產生的科研和教學問題展開探索。
根據上述案例庫構建思路,可以選擇學生熟悉和容易理解的軟件產品作為測試對象,隨后對實際的軟件產品進行改造,以方便測試課程的實踐教學。此外,為了讓學生更容易使用,有必要編寫相應的說明文檔,如軟件介紹、測試需求規格說明等。
例如,我們在構建移動應用測試案例庫的時候,選擇“去哪兒”“途牛”“驢媽媽” 等移動應用,下載了安裝包之后,對其進行插樁,然后根據課程實踐環節的不同目標,如功能測試、性能測試等,人工編寫相應的測試需求文檔;對于要編寫測試腳本的任務,事先給出腳本模板和腳本規則說明文檔。需要說明的是,對安裝包的插樁是為了收集數據用于后續的科學研究使用,對移動應用測試任務本身并無影響。此外,除了插樁可以自動進行之外,軟件介紹、測試需求兩個文檔需要教師實現針對每個案例分別編寫,這些工作需要耗費大量的人力。
教學組織以MoocTest平臺為基礎,集成了開發者測試(單元測試)、移動應用測試、Web功能測試、性能測試等教學任務。教師按照教學進度需要,有計劃地布置學生練習或考試。目前,開發者測試作業或考試可以實現全自動的評分,后幾種類型的測試可以實現自動腳本判分和人工閱讀測試報告結合的組合判分。
例如,在開發者測試練習或考試中,教師事先設置判分準則,如計算分支覆蓋率作為評分依據,則若學生設計的測試用例達到分支覆蓋90%,則學生可以得90分。教師還可以將缺陷檢出率、缺陷檢出速度等作為評分準則,更科學地綜合評判學生的實踐能力。此外,還可以在考試的過程中,給學生實時的反饋信息:如已經覆蓋的分支,已經檢出的缺陷,依據統計錯誤定位技術預測出的可疑語句等,從而可以跟蹤學生在這些引導信息下的軟件測試行為、程序調試行為等。
高校教師普遍存在科研的壓力,需要不斷提出學術研究問題并通過理論分析和實驗探索予以回答。在教學過程中,及時發現研究問題,并在組織教學的過程中安排相應的實驗、收集相應的數據,可以將科研和教學更好地融合。
例如,在開發者測試練習或考試中,我們發現機器自動生成的測試用例初期可以很快地達到約70%的覆蓋,而人工設計測試用例初期得分普遍不如機器。我們就可以跟蹤分析測試人員設計測試用例隨時間變化的特征,并將這些用例與機器自動生成的用例進行對比,從而研究人工設計測試用例特征;此外,還可以研究測試用例覆蓋隨模塊分布特征。除此之外,在移動應用測試中,我們可以對學生提交的測試用例(包括測試腳本)進行分析,研究對于移動應用而言,測試用例覆蓋率與缺陷檢出率的關系。
軟件測試作為一門專業基礎課程,在實踐教學組織上注重實踐性,通過選擇IT企業的真實項目作為實踐素材,加工整理后作為教學案例;同時,在教學組織上重視實踐平臺建設,注重提高教學反饋自動化程度。此外,重視科研和教學的結合,注重在教學中發現學術問題,在教學中收集學生的實驗數據以分析回答上述科研問題。下一步的工作是改進課程案例庫的組建方式,應用版本管理等工具提高自動化程度,同時對課程實驗平臺進行改進,完善數據跟蹤能力及提高平臺的兼容性和靈活性,進一步融合“產教研”3個環節,最終實現更有效地培養軟件測試人才。