孫軍梅 戴雅婕 姚茂群 肖蕾
摘要:為了使軟件測試技術(shù)學(xué)習(xí)者更好地掌握軟件測試技術(shù)的概念、方法和原理,并提高學(xué)習(xí)者的興趣,作者設(shè)計(jì)了基于游戲模式的實(shí)踐教學(xué)環(huán)境,設(shè)計(jì)開發(fā)了一個(gè)基于角色扮演類游戲的軟件測試技術(shù)實(shí)驗(yàn)系統(tǒng)。學(xué)習(xí)者通過分別扮演不同的角色進(jìn)行實(shí)驗(yàn),寓教于樂并體驗(yàn)如何進(jìn)行軟件測試,以及如何編寫可靠性高的軟件代碼來提高軟件質(zhì)量。
關(guān)鍵詞:軟件測試技術(shù)實(shí)驗(yàn);游戲模式;變異體
中圖分類號(hào):G434 ?文獻(xiàn)標(biāo)識(shí)碼:A ?論文編號(hào):1674-2117(2020)12-0000-05
軟件測試是軟件開發(fā)活動(dòng)中不可或缺的一部分,但調(diào)查顯示,計(jì)算機(jī)或軟件工程類專業(yè)課程中更多重視程序的設(shè)計(jì)和實(shí)現(xiàn)。[1]
文獻(xiàn)[2]指出,測試在軟件開發(fā)人員的日?;顒?dòng)中扮演的角色遠(yuǎn)不如人們希望的那樣,而且新聞?lì)l繁地報(bào)道關(guān)于軟件漏洞造成的影響,使人們對軟件測試在實(shí)踐中產(chǎn)生的效果產(chǎn)生了懷疑。與編程和設(shè)計(jì)相比,測試通常被認(rèn)為是無聊和困難的。[3]教學(xué)中主要體現(xiàn)在教學(xué)內(nèi)容抽象與學(xué)生學(xué)習(xí)興趣不高。
文獻(xiàn)[4]對軟件測試教育對軟件代碼可靠性的影響進(jìn)行了實(shí)證研究,研究發(fā)現(xiàn)軟件測試知識(shí)能提高編寫的代碼的可靠性。國內(nèi)軟件行業(yè)也普遍存在“重開發(fā),輕測試”的觀點(diǎn),這種觀點(diǎn)延伸到軟件測試技術(shù)課程的教學(xué)中,導(dǎo)致部分學(xué)生對軟件測試這個(gè)職業(yè)存在認(rèn)識(shí)偏差。因此,軟件測試課程必須改變原來偏重理論講解、學(xué)生缺乏實(shí)踐經(jīng)驗(yàn)的教學(xué)模式,加強(qiáng)實(shí)踐教學(xué)環(huán)節(jié),讓學(xué)生在實(shí)踐中體會(huì)到軟件測試技術(shù)的重要性。[5]因此該課程迫切需要一個(gè)既能夠體現(xiàn)軟件測試技術(shù)相關(guān)知識(shí),增強(qiáng)學(xué)生實(shí)踐操作能力,又能夠吸引學(xué)生興趣的實(shí)驗(yàn)環(huán)境。
基于游戲模式的軟件測試技術(shù)實(shí)驗(yàn)系統(tǒng)將軟件測試技術(shù)的知識(shí)點(diǎn)融入到游戲關(guān)卡中,為學(xué)習(xí)者提供了一個(gè)充滿挑戰(zhàn)和樂趣的實(shí)驗(yàn)環(huán)境,讓學(xué)習(xí)者在快樂中學(xué)習(xí)相關(guān)概念并在通關(guān)的實(shí)踐中提升實(shí)踐動(dòng)手能力。本系統(tǒng)在設(shè)計(jì)時(shí)借鑒了變異測試的理念,變異測試是一種基于缺陷的在細(xì)節(jié)方面對程序源代碼進(jìn)行改進(jìn)的動(dòng)態(tài)的軟件測試方法。[6]變異測試首創(chuàng)于20世紀(jì)70年代,發(fā)展至今,在學(xué)術(shù)界已得到了廣泛的關(guān)注和研究,但在工業(yè)應(yīng)用上仍比較少。在大學(xué)的軟件測試技術(shù)教材中也提得比較少,一般不作為基本的教學(xué)內(nèi)容。但通過對變異測試的研究,筆者發(fā)現(xiàn)變異測試的思想雖然在實(shí)際應(yīng)用中還不完全成熟,但通過變異測試的練習(xí),可以加深學(xué)習(xí)者對軟件測試基本概念、方法和原理的理解,[7-9]基于此,筆者設(shè)計(jì)開發(fā)了本實(shí)驗(yàn)系統(tǒng)。該系統(tǒng)是基于一個(gè)角色扮演類游戲而設(shè)計(jì)的,學(xué)習(xí)者可以分別扮演不同的角色來創(chuàng)建變異體和測試用例,體會(huì)如何編寫可靠性高的軟件,學(xué)習(xí)進(jìn)行軟件測試的基本方法和原理。
● 實(shí)驗(yàn)內(nèi)容
1.白盒測試/黑盒測試方法
白盒測試方法和黑盒測試方法[10-11]是軟件測試中用得最多得兩種測試技術(shù),也是目前工業(yè)界仍舊在普遍使用的兩種方法。白盒測試是基于程序源代碼對程序內(nèi)部的邏輯結(jié)構(gòu)以及相關(guān)信息進(jìn)行測試的方法,測試者需先了解程序的內(nèi)部結(jié)構(gòu),根據(jù)被測程序的內(nèi)部結(jié)構(gòu)設(shè)計(jì)測試用例,檢驗(yàn)程序中的每條通路是否能按照預(yù)定的要求正確工作。白盒測試最常用的方法有語句覆蓋、分支覆蓋、條件覆蓋等。黑盒測試是基于程序功能的測試方法,目的是檢查軟件的各項(xiàng)功能是否實(shí)現(xiàn)或軟件中是否存在功能上的錯(cuò)誤。黑盒測試最常見的方法有等價(jià)類劃分法、邊界值分析法等。
①語句覆蓋:為了發(fā)現(xiàn)或確認(rèn)程序中的錯(cuò)誤,程序代碼必須被執(zhí)行。直觀地說,如果包含bug的語句從未被任何測試執(zhí)行過,那么就無法檢測到bug。語句覆蓋率是衡量測試質(zhì)量的最通用的標(biāo)準(zhǔn)。圖1是一個(gè)演示語句覆蓋的游戲程序:圖1(a)為被測試的程序,圖1(b)是測試程序。此測試程序中設(shè)計(jì)的測試用例僅涵蓋了if條件語句的true分支,而未涵蓋第二個(gè)return語句,因此此測試程序沒有達(dá)到語句覆蓋的要求。
②分支覆蓋:分支覆蓋要求程序控制流圖中的所有邊至少執(zhí)行一次,這意味著每個(gè)if條件語句都需要取一次真值和假值。圖2給出了一個(gè)分支覆蓋示例游戲程序。圖2(a)是被測程序,圖2(b)是測試程序,初始測試集涵蓋了所有語句,即滿足語句覆蓋的要求,但沒有達(dá)到分支覆蓋的要求。
③循環(huán)測試:系統(tǒng)已經(jīng)定義了各種覆蓋標(biāo)準(zhǔn)來處理循環(huán)引起的挑戰(zhàn)。例如,不同的循環(huán)迭代次數(shù)可能導(dǎo)致發(fā)現(xiàn)不同的錯(cuò)誤。圖3顯示了一個(gè)循環(huán)測試示例游戲程序,其中現(xiàn)有的測試套件涵蓋了循環(huán)未執(zhí)行和僅執(zhí)行一次的情況,但不包括循環(huán)多次執(zhí)行的情況。
④邊界值測試。圖4顯示了邊界值測試的示例,其中現(xiàn)有測試集實(shí)現(xiàn)了分支覆蓋,但是沒有在x>100的邊界上進(jìn)行測試。
2.測試用例概念
在進(jìn)行軟件測試時(shí),設(shè)計(jì)測試用例是一個(gè)非常重要的環(huán)節(jié),測試用例設(shè)計(jì)的好壞直接影響到是否能發(fā)現(xiàn)缺陷,測試用例設(shè)計(jì)得好就能發(fā)現(xiàn)缺陷,并可能會(huì)發(fā)現(xiàn)比較多的缺陷,設(shè)計(jì)得不好,也許就發(fā)現(xiàn)不了缺陷或者只能發(fā)現(xiàn)一些比較容易發(fā)現(xiàn)的缺陷。所以,編寫測試用例是軟件測試中必不可少的環(huán)節(jié)。本實(shí)驗(yàn)系統(tǒng)學(xué)習(xí)者通過扮演防御者角色來設(shè)計(jì)測試用例,掌握一些設(shè)計(jì)測試用例的技巧,并積累設(shè)計(jì)好的測試用例的經(jīng)驗(yàn)。
● 實(shí)驗(yàn)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
1.實(shí)驗(yàn)系統(tǒng)框架結(jié)構(gòu)
本系統(tǒng)結(jié)構(gòu)由游戲模式和學(xué)習(xí)模式兩個(gè)模塊組成如圖5所示。學(xué)習(xí)模式主要提供給對相關(guān)知識(shí)還不是很熟悉的學(xué)習(xí)者在進(jìn)入游戲模式之前進(jìn)行學(xué)習(xí)、練習(xí)的模塊。游戲模式主要提供給學(xué)習(xí)者實(shí)操使用。
2.游戲模式設(shè)計(jì)
游戲包括攻擊者模式和防御者模式兩種游戲模式,學(xué)習(xí)者可以通過攻擊者模式來對源程序進(jìn)行修改,通過防御者模式來創(chuàng)建測試用例檢測出修改的部分。通過兩種模式的操作,學(xué)習(xí)者可以對軟件測試的相關(guān)概念、方法和原理進(jìn)行實(shí)操訓(xùn)練。
(1)攻擊者模式
在攻擊者模式中,學(xué)習(xí)者最主要的目標(biāo)就是改變源程序,使改變的部分盡可能難被測試用例檢測出來,如下頁圖6所示,學(xué)習(xí)者可在此模塊看到詳細(xì)源代碼,并且可對源代碼進(jìn)行合法的微小的修改。學(xué)習(xí)者在修改程序時(shí)須遵守以下規(guī)則:①不能修改源程序的類名、函數(shù)名、變量名以及數(shù)據(jù)類型;②修改后的程序必須可運(yùn)行,即沒有語法上的缺陷;③不能向程序中添加新的if語句或循環(huán)語句;④修改的部分必須有輸出值;⑤每次修改程序只能引入一個(gè)故障(fault)。
以圖1所示的語句覆蓋示例為例。當(dāng)學(xué)習(xí)者作為攻擊者時(shí),系統(tǒng)將向?qū)W習(xí)者玩家展示源程序和測試集,學(xué)習(xí)者的任務(wù)是修改源程序創(chuàng)建測試集不能檢測到的變異體,下頁圖7所示的游戲程序?yàn)楣粽邉?chuàng)建的一個(gè)變異體。
(2)防御者模式
在防御者模式中,學(xué)習(xí)者最主要的目標(biāo)就是創(chuàng)建測試用例,找出攻擊者模式中玩家創(chuàng)建的變異體。如下頁圖8所示,學(xué)習(xí)者可根據(jù)修改后的源代碼在界面上輸入測試用例。測試數(shù)據(jù)需要滿足以下條件:①輸入的測試數(shù)據(jù)必須對源程序和修改后的源程序引起不同的程序狀態(tài);②修改的輸出值的語句必須被執(zhí)行且該輸出值能夠被測試數(shù)據(jù)檢測出來。
判斷學(xué)習(xí)者是否殺死當(dāng)前變異體的最主要的方式是,學(xué)習(xí)者創(chuàng)建測試用例后,在源代碼和修改代碼中運(yùn)行該測試用例,然后判斷兩者的輸出值是否相同。如果源代碼和修改代碼的輸出值不同,則說明學(xué)習(xí)者創(chuàng)建的測試用例成功檢測出了修改部分,即殺死了當(dāng)前變異體,反之則說明沒有檢測出程序的修改。還是以圖1的語句覆蓋為例,如果防御者輸入的測試用例為x=10,則運(yùn)行源代碼和修改代碼后的輸出結(jié)果是一樣的,說明防御者設(shè)計(jì)的測試用例沒有發(fā)現(xiàn)缺陷,據(jù)此判定攻擊者勝,攻擊者得分。如果輸入測試用例為x=3,則運(yùn)行源代碼和修改后代碼的輸出結(jié)果是不一致的,據(jù)此可以判定防御者在這一局中勝,防御者得分。
● 教學(xué)評(píng)估
1.課程管理
教師可以使用這個(gè)基于游戲模式的實(shí)驗(yàn)系統(tǒng)來進(jìn)行軟件測試技術(shù)課程的實(shí)驗(yàn)教學(xué),并通過這個(gè)系統(tǒng)對課程進(jìn)行管理。系統(tǒng)在實(shí)際使用時(shí)教師可以以管理員的角色來對源代碼進(jìn)行管理。教師可以根據(jù)教學(xué)進(jìn)度更換或者新增符合當(dāng)前教學(xué)知識(shí)點(diǎn)的比較典型的游戲代碼,讓學(xué)習(xí)者根據(jù)當(dāng)前所學(xué)的內(nèi)容,針對新的源代碼進(jìn)行代碼修改;同時(shí),學(xué)習(xí)者也可以針對新修改的程序來設(shè)計(jì)測試用例。
教師可以查看每位學(xué)習(xí)者的參與度,也可以根據(jù)每個(gè)學(xué)習(xí)者修改的程序數(shù)量、檢測出來的變異體數(shù)量等信息來判斷學(xué)習(xí)者對知識(shí)的掌握程度。
2.教學(xué)效果
使用基于游戲的軟件進(jìn)行實(shí)踐學(xué)習(xí),寓教于樂,還可以增強(qiáng)學(xué)習(xí)過程中的競爭性,增強(qiáng)學(xué)習(xí)者學(xué)習(xí)的積極性,同時(shí)也增強(qiáng)學(xué)習(xí)者實(shí)踐教學(xué)的參與度。軟件記錄了每位學(xué)習(xí)者修改的源程序數(shù)量、檢查出多少修改代碼的數(shù)量以及在練習(xí)模式中答對的習(xí)題數(shù)量,學(xué)習(xí)者和教師均可以通過這些數(shù)據(jù)分析學(xué)習(xí)成果,學(xué)習(xí)者可以通過在游戲中扮演不同的角色,在游戲通關(guān)中掌握知識(shí),也能夠了解自己在哪些方面存在不足,需要改進(jìn)。教師可以根據(jù)學(xué)習(xí)者的實(shí)踐教學(xué)參與度來調(diào)整課堂教學(xué)內(nèi)容、教學(xué)方法以及教學(xué)難度,適當(dāng)增加源代碼以及習(xí)題的難度,可以提升學(xué)習(xí)者學(xué)習(xí)的積極性、競爭性。
本系統(tǒng)不僅可以作為實(shí)驗(yàn)用工具,還可以作為評(píng)價(jià)工具。例如,將課程考試由筆試的形式改為在游戲軟件中進(jìn)行,在規(guī)定的時(shí)間內(nèi)創(chuàng)建一定數(shù)量的有效新代碼,創(chuàng)建測試用例檢查新代碼。
● 結(jié)語
在本文中,我們提出了基于游戲的軟件測試技術(shù)實(shí)驗(yàn)教學(xué)模式,使學(xué)生在游戲中掌握軟件測試技術(shù)的相關(guān)概念、方法和原理。學(xué)生在創(chuàng)建新程序以及創(chuàng)建測試用例的同時(shí),不僅可以掌握軟件測試的相關(guān)知識(shí),還能對如何編寫高質(zhì)量軟件有一定的理解。同時(shí),由于實(shí)驗(yàn)是在游戲中進(jìn)行的,這樣就為枯燥的軟件測試課程增加了樂趣,更加吸引學(xué)生。接下來我們所面對的挑戰(zhàn)就是評(píng)估此款游戲軟件對使用者產(chǎn)生的影響,評(píng)估游戲軟件在學(xué)習(xí)者使用的過程中是否有不合理或需要優(yōu)化的地方。
參考文獻(xiàn):
[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]董玉坤.“軟件測試”課程教學(xué)現(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進(jìn)行變異測試[EB/OL].https://blog.csdn.net/wkw1125/article/details/51967630.
[8]茆亮亮.變異測試技術(shù)應(yīng)用研究[D].合肥:中國科學(xué)技術(shù)大學(xué),2010.
[9]陳翔,顧慶.變異測試:原理、優(yōu)化和應(yīng)用[J].計(jì)算機(jī)科學(xué)與探索, 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—),女,山西大同人,博士,副教授,碩士生導(dǎo)師,研究方向?yàn)檐浖y試技術(shù)、機(jī)器學(xué)習(xí)、教育技術(shù)
基金項(xiàng)目:杭州師范大學(xué)教改項(xiàng)目,杭州師范大學(xué)研究生核心課程建設(shè)項(xiàng)目(Yjskc19),福建省軟件評(píng)測工程技術(shù)研究中心開放課題。