孫軍梅 戴雅婕 姚茂群 肖蕾
摘要:為了使軟件測試技術(shù)學習者更好地掌握軟件測試技術(shù)的概念、方法和原理,并提高學習者的興趣,作者設(shè)計了基于游戲模式的實踐教學環(huán)境,設(shè)計開發(fā)了一個基于角色扮演類游戲的軟件測試技術(shù)實驗系統(tǒng)。學習者通過分別扮演不同的角色進行實驗,寓教于樂并體驗如何進行軟件測試,以及如何編寫可靠性高的軟件代碼來提高軟件質(zhì)量。
關(guān)鍵詞:軟件測試技術(shù)實驗;游戲模式;變異體
中圖分類號:G434 ?文獻標識碼:A ?論文編號:1674-2117(2020)12-0000-05
軟件測試是軟件開發(fā)活動中不可或缺的一部分,但調(diào)查顯示,計算機或軟件工程類專業(yè)課程中更多重視程序的設(shè)計和實現(xiàn)。[1]
文獻[2]指出,測試在軟件開發(fā)人員的日?;顒又邪缪莸慕巧h不如人們希望的那樣,而且新聞頻繁地報道關(guān)于軟件漏洞造成的影響,使人們對軟件測試在實踐中產(chǎn)生的效果產(chǎn)生了懷疑。與編程和設(shè)計相比,測試通常被認為是無聊和困難的。[3]教學中主要體現(xiàn)在教學內(nèi)容抽象與學生學習興趣不高。
文獻[4]對軟件測試教育對軟件代碼可靠性的影響進行了實證研究,研究發(fā)現(xiàn)軟件測試知識能提高編寫的代碼的可靠性。國內(nèi)軟件行業(yè)也普遍存在“重開發(fā),輕測試”的觀點,這種觀點延伸到軟件測試技術(shù)課程的教學中,導致部分學生對軟件測試這個職業(yè)存在認識偏差。因此,軟件測試課程必須改變原來偏重理論講解、學生缺乏實踐經(jīng)驗的教學模式,加強實踐教學環(huán)節(jié),讓學生在實踐中體會到軟件測試技術(shù)的重要性。[5]因此該課程迫切需要一個既能夠體現(xiàn)軟件測試技術(shù)相關(guān)知識,增強學生實踐操作能力,又能夠吸引學生興趣的實驗環(huán)境。
基于游戲模式的軟件測試技術(shù)實驗系統(tǒng)將軟件測試技術(shù)的知識點融入到游戲關(guān)卡中,為學習者提供了一個充滿挑戰(zhàn)和樂趣的實驗環(huán)境,讓學習者在快樂中學習相關(guān)概念并在通關(guān)的實踐中提升實踐動手能力。本系統(tǒng)在設(shè)計時借鑒了變異測試的理念,變異測試是一種基于缺陷的在細節(jié)方面對程序源代碼進行改進的動態(tài)的軟件測試方法。[6]變異測試首創(chuàng)于20世紀70年代,發(fā)展至今,在學術(shù)界已得到了廣泛的關(guān)注和研究,但在工業(yè)應用上仍比較少。在大學的軟件測試技術(shù)教材中也提得比較少,一般不作為基本的教學內(nèi)容。但通過對變異測試的研究,筆者發(fā)現(xiàn)變異測試的思想雖然在實際應用中還不完全成熟,但通過變異測試的練習,可以加深學習者對軟件測試基本概念、方法和原理的理解,[7-9]基于此,筆者設(shè)計開發(fā)了本實驗系統(tǒng)。該系統(tǒng)是基于一個角色扮演類游戲而設(shè)計的,學習者可以分別扮演不同的角色來創(chuàng)建變異體和測試用例,體會如何編寫可靠性高的軟件,學習進行軟件測試的基本方法和原理。
● 實驗內(nèi)容
1.白盒測試/黑盒測試方法
白盒測試方法和黑盒測試方法[10-11]是軟件測試中用得最多得兩種測試技術(shù),也是目前工業(yè)界仍舊在普遍使用的兩種方法。白盒測試是基于程序源代碼對程序內(nèi)部的邏輯結(jié)構(gòu)以及相關(guān)信息進行測試的方法,測試者需先了解程序的內(nèi)部結(jié)構(gòu),根據(jù)被測程序的內(nèi)部結(jié)構(gòu)設(shè)計測試用例,檢驗程序中的每條通路是否能按照預定的要求正確工作。白盒測試最常用的方法有語句覆蓋、分支覆蓋、條件覆蓋等。黑盒測試是基于程序功能的測試方法,目的是檢查軟件的各項功能是否實現(xiàn)或軟件中是否存在功能上的錯誤。黑盒測試最常見的方法有等價類劃分法、邊界值分析法等。
①語句覆蓋:為了發(fā)現(xiàn)或確認程序中的錯誤,程序代碼必須被執(zhí)行。直觀地說,如果包含bug的語句從未被任何測試執(zhí)行過,那么就無法檢測到bug。語句覆蓋率是衡量測試質(zhì)量的最通用的標準。圖1是一個演示語句覆蓋的游戲程序:圖1(a)為被測試的程序,圖1(b)是測試程序。此測試程序中設(shè)計的測試用例僅涵蓋了if條件語句的true分支,而未涵蓋第二個return語句,因此此測試程序沒有達到語句覆蓋的要求。
②分支覆蓋:分支覆蓋要求程序控制流圖中的所有邊至少執(zhí)行一次,這意味著每個if條件語句都需要取一次真值和假值。圖2給出了一個分支覆蓋示例游戲程序。圖2(a)是被測程序,圖2(b)是測試程序,初始測試集涵蓋了所有語句,即滿足語句覆蓋的要求,但沒有達到分支覆蓋的要求。
③循環(huán)測試:系統(tǒng)已經(jīng)定義了各種覆蓋標準來處理循環(huán)引起的挑戰(zhàn)。例如,不同的循環(huán)迭代次數(shù)可能導致發(fā)現(xiàn)不同的錯誤。圖3顯示了一個循環(huán)測試示例游戲程序,其中現(xiàn)有的測試套件涵蓋了循環(huán)未執(zhí)行和僅執(zhí)行一次的情況,但不包括循環(huán)多次執(zhí)行的情況。
④邊界值測試。圖4顯示了邊界值測試的示例,其中現(xiàn)有測試集實現(xiàn)了分支覆蓋,但是沒有在x>100的邊界上進行測試。
2.測試用例概念
在進行軟件測試時,設(shè)計測試用例是一個非常重要的環(huán)節(jié),測試用例設(shè)計的好壞直接影響到是否能發(fā)現(xiàn)缺陷,測試用例設(shè)計得好就能發(fā)現(xiàn)缺陷,并可能會發(fā)現(xiàn)比較多的缺陷,設(shè)計得不好,也許就發(fā)現(xiàn)不了缺陷或者只能發(fā)現(xiàn)一些比較容易發(fā)現(xiàn)的缺陷。所以,編寫測試用例是軟件測試中必不可少的環(huán)節(jié)。本實驗系統(tǒng)學習者通過扮演防御者角色來設(shè)計測試用例,掌握一些設(shè)計測試用例的技巧,并積累設(shè)計好的測試用例的經(jīng)驗。
● 實驗系統(tǒng)的設(shè)計與實現(xiàn)
1.實驗系統(tǒng)框架結(jié)構(gòu)
本系統(tǒng)結(jié)構(gòu)由游戲模式和學習模式兩個模塊組成如圖5所示。學習模式主要提供給對相關(guān)知識還不是很熟悉的學習者在進入游戲模式之前進行學習、練習的模塊。游戲模式主要提供給學習者實操使用。
2.游戲模式設(shè)計
游戲包括攻擊者模式和防御者模式兩種游戲模式,學習者可以通過攻擊者模式來對源程序進行修改,通過防御者模式來創(chuàng)建測試用例檢測出修改的部分。通過兩種模式的操作,學習者可以對軟件測試的相關(guān)概念、方法和原理進行實操訓練。
(1)攻擊者模式
在攻擊者模式中,學習者最主要的目標就是改變源程序,使改變的部分盡可能難被測試用例檢測出來,如下頁圖6所示,學習者可在此模塊看到詳細源代碼,并且可對源代碼進行合法的微小的修改。學習者在修改程序時須遵守以下規(guī)則:①不能修改源程序的類名、函數(shù)名、變量名以及數(shù)據(jù)類型;②修改后的程序必須可運行,即沒有語法上的缺陷;③不能向程序中添加新的if語句或循環(huán)語句;④修改的部分必須有輸出值;⑤每次修改程序只能引入一個故障(fault)。
以圖1所示的語句覆蓋示例為例。當學習者作為攻擊者時,系統(tǒng)將向?qū)W習者玩家展示源程序和測試集,學習者的任務是修改源程序創(chuàng)建測試集不能檢測到的變異體,下頁圖7所示的游戲程序為攻擊者創(chuàng)建的一個變異體。
(2)防御者模式
在防御者模式中,學習者最主要的目標就是創(chuàng)建測試用例,找出攻擊者模式中玩家創(chuàng)建的變異體。如下頁圖8所示,學習者可根據(jù)修改后的源代碼在界面上輸入測試用例。測試數(shù)據(jù)需要滿足以下條件:①輸入的測試數(shù)據(jù)必須對源程序和修改后的源程序引起不同的程序狀態(tài);②修改的輸出值的語句必須被執(zhí)行且該輸出值能夠被測試數(shù)據(jù)檢測出來。
判斷學習者是否殺死當前變異體的最主要的方式是,學習者創(chuàng)建測試用例后,在源代碼和修改代碼中運行該測試用例,然后判斷兩者的輸出值是否相同。如果源代碼和修改代碼的輸出值不同,則說明學習者創(chuàng)建的測試用例成功檢測出了修改部分,即殺死了當前變異體,反之則說明沒有檢測出程序的修改。還是以圖1的語句覆蓋為例,如果防御者輸入的測試用例為x=10,則運行源代碼和修改代碼后的輸出結(jié)果是一樣的,說明防御者設(shè)計的測試用例沒有發(fā)現(xiàn)缺陷,據(jù)此判定攻擊者勝,攻擊者得分。如果輸入測試用例為x=3,則運行源代碼和修改后代碼的輸出結(jié)果是不一致的,據(jù)此可以判定防御者在這一局中勝,防御者得分。
● 教學評估
1.課程管理
教師可以使用這個基于游戲模式的實驗系統(tǒng)來進行軟件測試技術(shù)課程的實驗教學,并通過這個系統(tǒng)對課程進行管理。系統(tǒng)在實際使用時教師可以以管理員的角色來對源代碼進行管理。教師可以根據(jù)教學進度更換或者新增符合當前教學知識點的比較典型的游戲代碼,讓學習者根據(jù)當前所學的內(nèi)容,針對新的源代碼進行代碼修改;同時,學習者也可以針對新修改的程序來設(shè)計測試用例。
教師可以查看每位學習者的參與度,也可以根據(jù)每個學習者修改的程序數(shù)量、檢測出來的變異體數(shù)量等信息來判斷學習者對知識的掌握程度。
2.教學效果
使用基于游戲的軟件進行實踐學習,寓教于樂,還可以增強學習過程中的競爭性,增強學習者學習的積極性,同時也增強學習者實踐教學的參與度。軟件記錄了每位學習者修改的源程序數(shù)量、檢查出多少修改代碼的數(shù)量以及在練習模式中答對的習題數(shù)量,學習者和教師均可以通過這些數(shù)據(jù)分析學習成果,學習者可以通過在游戲中扮演不同的角色,在游戲通關(guān)中掌握知識,也能夠了解自己在哪些方面存在不足,需要改進。教師可以根據(jù)學習者的實踐教學參與度來調(diào)整課堂教學內(nèi)容、教學方法以及教學難度,適當增加源代碼以及習題的難度,可以提升學習者學習的積極性、競爭性。
本系統(tǒng)不僅可以作為實驗用工具,還可以作為評價工具。例如,將課程考試由筆試的形式改為在游戲軟件中進行,在規(guī)定的時間內(nèi)創(chuàng)建一定數(shù)量的有效新代碼,創(chuàng)建測試用例檢查新代碼。
● 結(jié)語
在本文中,我們提出了基于游戲的軟件測試技術(shù)實驗教學模式,使學生在游戲中掌握軟件測試技術(shù)的相關(guān)概念、方法和原理。學生在創(chuàng)建新程序以及創(chuàng)建測試用例的同時,不僅可以掌握軟件測試的相關(guān)知識,還能對如何編寫高質(zhì)量軟件有一定的理解。同時,由于實驗是在游戲中進行的,這樣就為枯燥的軟件測試課程增加了樂趣,更加吸引學生。接下來我們所面對的挑戰(zhàn)就是評估此款游戲軟件對使用者產(chǎn)生的影響,評估游戲軟件在學習者使用的過程中是否有不合理或需要優(yōu)化的地方。
參考文獻:
[1]Astigarraga, T., Dow, E.M., Lara, C., Prewitt, R., Ward, M.R., 2010. The emerging role of software testing in curricula. In: Proceedings of the IEEE Transforming Engineering Education: Creating Interdisciplinary Skills for Complex Global Environments. IEEE, pp. 1–26.
[2]M. Beller, G. Gousios, A. Panichella, and A. Zaidman. When, how, and why developers (do not) test in their IDEs. In ACM Symposium on the Foundations of Software Engineering (FSE), pages 179–190, 2015.
[3]Clegg B S , Rojas J M , Fraser G . Teaching Software Testing Concepts Using a Mutation Testing Game[C]// 2017 IEEE/ACM 39th International Conference on Software Engineering: Software Engineering Education and Training Track (ICSE-SEET). ACM, 2017.
[4]Lazzarini Lemos, Otávio Augusto, Fagundes Silveira, Fábio, Cutigi Ferrari F , et al. The impact of Software Testing education on code reliability: An empirical assessment[J].Journal of Systems and Software, 2017:S0164121217300419.
[5]董玉坤.“軟件測試”課程教學現(xiàn)狀分析[J].課程教育研究,2015(25):229-229.
[6]Jia Y, Harman M.An Analysis and Survey of the Development of Mutation Testing[J].IEEE Transactions on Software Engineering, 2011, 37(05):649-678.
[7]使用muJava進行變異測試[EB/OL].https://blog.csdn.net/wkw1125/article/details/51967630.
[8]茆亮亮.變異測試技術(shù)應用研究[D].合肥:中國科學技術(shù)大學,2010.
[9]陳翔,顧慶.變異測試:原理、優(yōu)化和應用[J].計算機科學與探索, 2012(12).
[10]Bill Hetzel.The Complete guide to Software Testing.1993:1057-1075.
[11]Corey Sandler, Glenford Myers, Tom Badgett, The Art of Software Testing, 3rd Edition,Wiley,2011.
通訊作者:孫軍梅(1974—),女,山西大同人,博士,副教授,碩士生導師,研究方向為軟件測試技術(shù)、機器學習、教育技術(shù)
基金項目:杭州師范大學教改項目,杭州師范大學研究生核心課程建設(shè)項目(Yjskc19),福建省軟件評測工程技術(shù)研究中心開放課題。