林喜文?李佳佳?高鳳毅?張淑桐
摘要:針對(duì)軟件工程課程教學(xué)中出現(xiàn)的重理論、輕實(shí)踐的現(xiàn)狀,從課賽融合的角度,以單元測(cè)試知識(shí)點(diǎn)為例,將全國(guó)職業(yè)院校技能大賽軟件測(cè)試賽項(xiàng)考察的核心技能引入教學(xué)中。但是,軟件工程課程的目的不在于深入學(xué)習(xí)編程技術(shù),而是側(cè)重于如何將工程的思想引入軟件的開(kāi)發(fā)和維護(hù)中。因此,教學(xué)案例要盡量降低對(duì)編程語(yǔ)言和編程技術(shù)的依賴(lài)。根據(jù)以上特點(diǎn),案例設(shè)計(jì)采用Python編程語(yǔ)言,借助海龜編輯器和PyCharm集成開(kāi)發(fā)環(huán)境,力求增加學(xué)生的學(xué)習(xí)動(dòng)力并達(dá)到教學(xué)目的。
關(guān)鍵詞:軟件工程;單元測(cè)試;課賽融合;Python
一、前言
軟件工程課程的教學(xué)實(shí)踐一直致力于培養(yǎng)學(xué)生的軟件開(kāi)發(fā)技能和工程思維能力。在現(xiàn)代軟件開(kāi)發(fā)中,高質(zhì)量的代碼和可靠的軟件系統(tǒng)是至關(guān)重要的,而單元測(cè)試作為軟件測(cè)試的基礎(chǔ),起著至關(guān)重要的作用。通過(guò)單元測(cè)試,開(kāi)發(fā)人員可以確保代碼的正確性、可靠性和健壯性,從而提高軟件的質(zhì)量并減少后期維護(hù)成本。為了改進(jìn)軟件工程課程的教學(xué)實(shí)踐,采用了基于課賽融合的教學(xué)方法,將單元測(cè)試作為一個(gè)重要的教學(xué)內(nèi)容進(jìn)行深入學(xué)習(xí)和實(shí)踐。通過(guò)將理論知識(shí)與實(shí)際項(xiàng)目結(jié)合起來(lái),學(xué)生可以親身參與到軟件開(kāi)發(fā)過(guò)程中,并在實(shí)踐中學(xué)習(xí)單元測(cè)試的重要性和實(shí)際應(yīng)用。
二、軟件工程教學(xué)現(xiàn)狀
軟件工程是計(jì)算機(jī)類(lèi)專(zhuān)業(yè)高年級(jí)的一門(mén)必修課程。該課程綜合性很高,立足于軟件開(kāi)發(fā)全生命周期(見(jiàn)圖1),將學(xué)過(guò)的各個(gè)課程有機(jī)融合在一起,因此在教學(xué)中容易給學(xué)生留下“知識(shí)面廣、知識(shí)點(diǎn)淺”的印象。這種重點(diǎn)不明確、過(guò)度強(qiáng)調(diào)理論知識(shí)的教學(xué)模式會(huì)極大損害學(xué)生的學(xué)習(xí)積極性[1]。針對(duì)以上現(xiàn)狀,有關(guān)軟件工程的課程改革研究層出不窮,但無(wú)一例外都倡導(dǎo)理論與實(shí)踐結(jié)合、案例式教學(xué)的思想。不同于任何一門(mén)編程類(lèi)課程,軟件工程課程的側(cè)重點(diǎn)在于如何將工程的思想引入軟件的開(kāi)發(fā)和維護(hù)中。知識(shí)、技術(shù)、工具是手段,最終目的是在有限的資源下按計(jì)劃完成特定目標(biāo)。因此,在開(kāi)展軟件工程課程的實(shí)踐教學(xué)時(shí),過(guò)度深入某個(gè)特定的技術(shù)點(diǎn)并不利于達(dá)到課程目標(biāo)。在選擇軟件工程教學(xué)案例時(shí),既需要滿足本課程側(cè)重點(diǎn),也需要遵循特定的學(xué)習(xí)方法[2]。
三、基于課賽融合的單元測(cè)試案例設(shè)計(jì)
在軟件生命周期中,軟件測(cè)試是保證軟件質(zhì)量的重要手段,其中,單元測(cè)試負(fù)責(zé)對(duì)最小的功能模塊進(jìn)行驗(yàn)證[3]。研究表明,單元測(cè)試能發(fā)現(xiàn)約80%的軟件缺陷,因此,單元測(cè)試在軟件開(kāi)發(fā)過(guò)程中的重要性不言而喻。本文中,單元測(cè)試教學(xué)案例參考2022年全國(guó)職業(yè)院校技能大賽“軟件測(cè)試”賽項(xiàng)(以下簡(jiǎn)稱(chēng)“國(guó)賽”)任務(wù)二題目1,但是進(jìn)行了以下適應(yīng)性調(diào)整:一方面,“國(guó)賽”中要求使用Java語(yǔ)言的JUnit框架,為適應(yīng)軟件工程課程的特點(diǎn),不刻意追求編程技術(shù)難度,在實(shí)際教學(xué)要求中調(diào)整為使用Python語(yǔ)言的Unittest框架;另一方面,“國(guó)賽”中項(xiàng)目二題目1只要求滿足語(yǔ)句覆蓋,但是在單元測(cè)試的教學(xué)范圍中還包括判定覆蓋、條件覆蓋、判定條件覆蓋、條件組合覆蓋以及路徑覆蓋,因此在教學(xué)要求中追加后幾種覆蓋方式[4]。
四、實(shí)驗(yàn)過(guò)程
(一)編寫(xiě)程序
為完成本案例,首先使用PyCharm創(chuàng)建項(xiàng)目unitTest,此時(shí)項(xiàng)目下會(huì)自動(dòng)創(chuàng)建__init__.py文件。此外,func.py文件中用來(lái)保存實(shí)現(xiàn)圖2中所示流程圖功能的函數(shù)getRes(x, y);__init__.py文件中用來(lái)編寫(xiě)針對(duì)func.py單元的測(cè)試代碼;getResult.py文件用來(lái)實(shí)現(xiàn)完整的輸入、輸出的功能。還需要在該項(xiàng)目下創(chuàng)建文件func.py和getResult.py,項(xiàng)目整體文件結(jié)構(gòu)見(jiàn)圖3。
由于軟件工程課程的目的不在于深入學(xué)習(xí)編程技術(shù),為消除學(xué)生對(duì)Python編程語(yǔ)言的依賴(lài),因此在定義func.py文件中的函數(shù)getRes(x, y)時(shí),引入海龜編輯器來(lái)完成[5]。海龜編輯器是面向國(guó)內(nèi)Python學(xué)習(xí)者的一款編程學(xué)習(xí)工具。其界面友好,可以讓用戶以搭積木的方式來(lái)學(xué)習(xí)Python,能有效提高學(xué)習(xí)興趣,降低編程的枯燥感。此外,由于其積木模式和代碼模式可以任意轉(zhuǎn)換,也保證了Python代碼編程的專(zhuān)業(yè)度。
海龜編輯器界面用不同的顏色區(qū)分積木類(lèi)型,為實(shí)現(xiàn)getRes(x, y)的函數(shù)定義,依次用到了函數(shù)、控制、運(yùn)算、變量中的不同積木。其主框架是使用了一塊大的“如果—否則”積木,并在其中嵌入兩塊小的“如果—否則”積木。要注意的是,需要在變量中創(chuàng)建變量a,用來(lái)保存函數(shù)返回值[6]。通過(guò)積木的拖動(dòng)以及匹配不同積木之間凹凸接頭,可以很容易得到getRes(x, y)的積木模式,如圖4所示。將積木模式切換為代碼模式,就可以得到getRes(x, y)的Python代碼,這部分代碼可以直接復(fù)制到func.py文件中。
__init__.py文件使用Unittest單元測(cè)試框架對(duì)func.py文件中定義的getRes(x, y)函數(shù)進(jìn)行測(cè)試,代碼分為三個(gè)部分,具體如下:
1.導(dǎo)入U(xiǎn)nittest框架與func.py文件中的MyClass類(lèi)。
import unittest
import func
2.定義mytest單元測(cè)試類(lèi),其中包括setUp、tearDown以及針對(duì)每個(gè)測(cè)試用例的測(cè)試類(lèi),以此對(duì)func單元進(jìn)行測(cè)試。
class mytest(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
#測(cè)試用例1_1,x和y的輸入為85和65,a的預(yù)期值為2
def test1_1(self):
self.assertEqual(func.getRes(85,65),2,'test1_1 success')
'''其他測(cè)試用例的輸入及預(yù)期值均可參考test1_1在下方定義測(cè)試類(lèi)'''
3.建立main()函數(shù),構(gòu)造測(cè)試集并執(zhí)行測(cè)試。
if __name__=='__main__':
unittest.main()
getResult.py文件中也需要首先導(dǎo)入func.py文件中的MyClass類(lèi),再使用input和print函數(shù)實(shí)現(xiàn)x值和y值的輸入以及a值的輸出。
import func
x = int(input('請(qǐng)輸入x:'))
y = int(input('請(qǐng)輸入y:'))
print('a=', func.getRes(x, y))
(二)選擇測(cè)試用例
單元測(cè)試包括語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定條件覆蓋、條件組合覆蓋以及路徑覆蓋等六種類(lèi)型。其含義分別為:
1.語(yǔ)句覆蓋:使程序中每個(gè)語(yǔ)句至少執(zhí)行一次;
2.判定覆蓋:使每個(gè)判定的真假分支都至少執(zhí)行一次;
3.條件覆蓋:使每個(gè)判定的每個(gè)條件的可能取值至少執(zhí)行一次;
4.判定條件覆蓋:能同時(shí)滿足判定、條件兩種覆蓋標(biāo)準(zhǔn)的取值;
5.條件組合覆蓋:使程序中所有判定的條件組合至少執(zhí)行一次;
6.路徑覆蓋:使程序中每條路徑至少執(zhí)行一次。
在充分解釋以上覆蓋原理后,學(xué)生將為本案例選擇測(cè)試用例,測(cè)試用例的選擇及其結(jié)果將按照表1的格式進(jìn)行填寫(xiě)。
(三)執(zhí)行程序
首先,執(zhí)行g(shù)etResult.py文件,確保程序可以從鍵盤(pán)得到x值和y值的輸入,并得到輸出的a值,控制臺(tái)的輸入、輸出界面見(jiàn)圖5。
接下來(lái)執(zhí)行__init__.py文件對(duì)func單元進(jìn)行測(cè)試。例如,為滿足語(yǔ)句覆蓋選擇了3個(gè)測(cè)試用例,在PyCharm執(zhí)行后得到圖6所示界面,測(cè)試結(jié)果均為綠色對(duì)號(hào),說(shuō)明3個(gè)測(cè)試用例均通過(guò)。為滿足條件覆蓋選擇了3個(gè)測(cè)試用例,執(zhí)行后得到圖7所示界面,測(cè)試結(jié)果中出現(xiàn)黃色的叉號(hào),說(shuō)明有測(cè)試用例沒(méi)有通過(guò)。這時(shí)候需要檢查被測(cè)單元的代碼或者測(cè)試用例的選擇以及預(yù)期結(jié)果是否正確[7]。
五、結(jié)語(yǔ)
為提高軟件工程課程授課效果,本文以單元測(cè)試知識(shí)點(diǎn)為例設(shè)計(jì)了一個(gè)教學(xué)案例。其中融入了全國(guó)職業(yè)院校技能大賽軟件測(cè)試賽題,以達(dá)到在教學(xué)中將理論與實(shí)踐相結(jié)合的目的。由于軟件工程側(cè)重點(diǎn)在于將工程的思想引入軟件的開(kāi)發(fā)和維護(hù)中,并不是一味追求編程技術(shù)的難度,而是為了在有限的資源下,借助知識(shí)、技術(shù)、工具,按計(jì)劃完成特定目標(biāo)。本案例的設(shè)計(jì)可以讓學(xué)生在學(xué)習(xí)過(guò)程中掌握單元測(cè)試知識(shí),熟悉Python編程技術(shù),了解海龜編輯器和PyCharm工具。
參考文獻(xiàn)
[1]楊波,許福,李冬梅,等.針對(duì)軟件工程課程的人工智能實(shí)驗(yàn)案例設(shè)計(jì)[J].計(jì)算機(jī)教育.2022,333(9):202-206.
[2]洪玫,嚴(yán)斌宇,余靜.面向?qū)W生能力培養(yǎng)的課程教學(xué)設(shè)計(jì)——以軟件工程專(zhuān)業(yè)為例[J].中國(guó)大學(xué)教學(xué).2022,383(7):39-44.
[3]郭永平,馬巧梅,龍飛,等.沉浸式軟件工程專(zhuān)業(yè)實(shí)訓(xùn)課程設(shè)計(jì)與實(shí)踐[J].計(jì)算機(jī)教育.2022,331(7):175-179.
[4]管青.沙盤(pán)模擬式項(xiàng)目驅(qū)動(dòng)的軟件工程教學(xué)模式[J].計(jì)算機(jī)教育.2021,322(10):143-146.
[5]蔣虹,祁小明.Python起步教學(xué)的有效策略探討[J].中國(guó)現(xiàn)代教育裝備.2023,402(0):43-45+49.
[6]張?zhí)K,楊元峰,陸公正.軟件測(cè)試中單元測(cè)試案例教學(xué)實(shí)踐[J].電腦知識(shí)與技術(shù).2020,16(13):132-135.
[7]趙春霞,曹莉,趙營(yíng)穎.基于“項(xiàng)目導(dǎo)向+任務(wù)驅(qū)動(dòng)”的課程教學(xué)模式研究——以軟件工程課程為例[J].科技視界.2021,365(35):46-47.