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