999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于doctest的Python程序自動評測方法研究

2021-04-29 06:56:22亓雪冬葛元康
微型電腦應(yīng)用 2021年4期
關(guān)鍵詞:程序

亓雪冬, 葛元康

(中國石油大學(xué)(華東) 1.信息化建設(shè)處; 2.計算機科學(xué)與技術(shù)學(xué)院, 山東 青島 266580)

0 引言

近年來,Python語言以其簡潔的語法、靈活的交互性與動態(tài)性和豐富的第三方程序庫等特點快速被國內(nèi)外高校所認(rèn)可。嵩天等提出,Python語言是程序設(shè)計課程教學(xué)改革的理想選擇[1]。眾多高校中開設(shè)了大量以Python語言為載體的程序設(shè)計類課程,以我校為例,2019—2020學(xué)年約12個專業(yè)(20多個班級)在全校公共基礎(chǔ)課《程序設(shè)計》課程中,將授課編程語言改變?yōu)镻ython。新的選擇給教學(xué)工作帶來機遇的同時也帶來了挑戰(zhàn)。

程序自動評測系統(tǒng)能夠快速對學(xué)生編寫的程序進(jìn)行自動評判[2-3],實現(xiàn)了批改和反饋的自動化[4-5],是程序設(shè)計類課程教學(xué)實踐環(huán)節(jié)不可或缺的教學(xué)工具,是提高學(xué)習(xí)效率、保障教學(xué)效果和提升教學(xué)質(zhì)量的重要技術(shù)手段。因此,研究Python程序自動評判方法對于教學(xué)改革具有重要的現(xiàn)實意義。本文在充分研究Python標(biāo)準(zhǔn)庫原有測試模塊doctest的基礎(chǔ)上,根據(jù)教學(xué)實踐環(huán)節(jié)的實際需求,提出了擴展和改造doctest編程模型的思路和方法,實現(xiàn)了Python程序的全自動評判。

1 doctest自動化測試工具

doctest是Python標(biāo)準(zhǔn)庫中的自動化測試模塊,根據(jù)編寫在文檔字符串中的測試用例對待測試模塊的功能進(jìn)行測試。文檔字符串(DocStrings)是Python模塊、類或函數(shù)定義中的起始語句,可看作多行注釋,定界符為三個單引號(' ' ')或者三個雙引號(""")。將測試用例放入文檔字符串中,易于查看和修改。測試用例格式與Python交互式環(huán)境中執(zhí)行語句的格式完全一致。

1.1 doctest對象模型

doctest的核心測試功能由2個容器類和4個處理類提供。對象模型[6],如圖1所示。

圖1 doctest對象模型

兩個容器類分別為Example和DocTest,用于存儲測試文本中提取的測試用例。其中,Example表示單個測試用列,由一條Python語句和其對應(yīng)的輸出組合而成;DocTest表示Example(測試用例)的集合。

四個處理類分別為DocTestFinder、DocTestParser、DocTestRunner和OutputChecker。其中,DocTestFinder用于發(fā)現(xiàn)測試模塊中的文檔字符串;DocTestParser用于分析并返回文檔字符串中的測試用例集合DocTest;DocTestRunner控制執(zhí)行DocTest中每一個測試用例,同時調(diào)用OutputChecker檢查用例的輸出,最后統(tǒng)計并輸出測試結(jié)論。

1.2 doctest測試示例

(1) 描述測試用例

例如對于求取n階乘的函數(shù)factorial(n),設(shè)計測試用例對其進(jìn)行測試。程序結(jié)構(gòu),如圖2所示。

圖2 包含doctest測試用例的程序結(jié)構(gòu)

程序上部的文檔字符串描述了對factorial(n)進(jìn)行測試的測試用例,程序下部為factorial函數(shù)的定義。

測試用例的設(shè)計上,根據(jù)階乘定義factorial(n)=1*2*…*n,可選取n≥1的正整數(shù)作為測試用例,如n=10時,階乘為3 628 800。另外對于特殊情況n=0時,階乘為1,這一點經(jīng)常有同學(xué)出錯,這個特例也可作為一個測試用例。每個測試用例中,三個右箭頭(>>>)起始的行表示待執(zhí)行的Python語句,隨后的行表示期待的正確輸出結(jié)果,格式與在IDLE或Python Shell中執(zhí)行Python語句類似。

(2) 執(zhí)行測試

上述程序代碼存儲在文件example.py中。使用doctest對其執(zhí)行測試的命令如下。

import doctest, example

doctest.testmod(example)

第1句導(dǎo)入測試工具doctest和用戶程序example.py。example中不僅包含了階乘函數(shù)的定義,而且包含了對其進(jìn)行測試的兩個測試用例。第2句調(diào)用doctest.testmod函數(shù)對example模塊進(jìn)行測試。測試過程如1.1節(jié)描述,包含發(fā)現(xiàn)和分析測試用例,執(zhí)行測試用例,返回測試結(jié)果等步驟。

(3) 返回測試結(jié)果

假設(shè)編寫的factorial函數(shù)沒有考慮0的階乘這種特殊情況,第1個測試通過,第2個測試失敗。返回的測試結(jié)果,如圖3所示。

圖3 測試結(jié)果

測試結(jié)果整體分為兩部分,上部為對每一個測試用例的詳細(xì)描述,如果測試失敗,還會給出程序?qū)嶋H輸出的錯誤結(jié)果以及期待的正確結(jié)果;下部為整體測試結(jié)論,包含測試數(shù)目以及測試失敗的數(shù)目。

2 doctest在程序自動評測中存在的不足

doctest雖具備較完整的程序測試功能,但程序測試與教師對學(xué)生程序的評測這兩者概念不完全相同,將doctest應(yīng)用在Python課程的作業(yè)和考試評測環(huán)節(jié)中時,仍存在一些不足,主要體現(xiàn)在以下三個方面。

(1) 測試用例的部署。doctest中的測試用例與被測試代碼在同一個文件中。如果在學(xué)生編寫程序的文件中提前設(shè)置好測試用例,由于學(xué)生可以看到測試用例,會降低考查的難度甚至失去考查的意義。因此需要在獲得學(xué)生提交的程序之后,動態(tài)部署教師設(shè)置的測試用例,然后再進(jìn)行評測。

(2) 測試用例無權(quán)重設(shè)定。doctest測試用例中沒有權(quán)重屬性,這將無法區(qū)分不同測試用例的重要程度。然而在教學(xué)實踐中,教師往往會根據(jù)授課內(nèi)容的先后順序、難易程度和課程目標(biāo)等,調(diào)整不同知識點對應(yīng)的分值。對應(yīng)到程序評測中,則需要能夠?qū)^重要的測試用例設(shè)置較高的權(quán)重,而對相對次要的測試用例設(shè)置較低的權(quán)重。

(3) 評測結(jié)果難于理解。doctest的測試結(jié)果缺乏測試用例的編號項,基于文本的輸出形式布局過于簡潔,對初學(xué)程序的學(xué)生來說難于理解。教學(xué)實踐中,需將評測結(jié)果修改為HTML格式,每行描述一個測試用例,方便學(xué)生查看,并易于和其它Web教學(xué)系統(tǒng)結(jié)合。

針對以上三點不足,筆者嘗試通過擴展doctest對象模型加以解決。通過擴展DocTestFinder類實現(xiàn)測試用例的動態(tài)部署;通過擴展Example類和DocTestParser類實現(xiàn)測試用例權(quán)重的設(shè)定;通過擴展DocTestRunner類實現(xiàn)評測結(jié)果以HTML格式進(jìn)行輸出。

3 擴展doctest實現(xiàn)程序自動評測

3.1 動態(tài)部署測試用例

為了能夠動態(tài)部署測試用例,并且對題庫題目及測試數(shù)據(jù)進(jìn)行管理,筆者擴展了doctest對象模型,實現(xiàn)了測試數(shù)據(jù)遠(yuǎn)程存儲和訪問管理。相關(guān)功能結(jié)構(gòu),如圖4所示。

圖4 測試數(shù)據(jù)的存儲和訪問管理

首先在遠(yuǎn)程服務(wù)器端搭建了MySQL數(shù)據(jù)庫,建立了TestBank表,用于存儲題庫數(shù)據(jù),字段ID、Topic、DocStr和Answer分別表示題目編號、題目描述、測試用例和標(biāo)準(zhǔn)答案;另外在服務(wù)器端設(shè)立了基于Python Flask框架的Web服務(wù),提供了Add、Delete、Update和Get等接口,分別用于向數(shù)據(jù)庫添加、刪除、更新和獲取題目數(shù)據(jù);最后在doctest中增加了WebTestFinder和WebTestManager兩個類,WebTestFinder用于替換DocTestFinder,其功能為根據(jù)題目編號獲取遠(yuǎn)程的測試用例,WebTestManage則根據(jù)題目編號對遠(yuǎn)程題庫中的數(shù)據(jù)進(jìn)行增加、刪除和修改等維護(hù)性操作。

學(xué)生程序評測時,doctest通過擴展后的WebTestFinder自動從遠(yuǎn)程數(shù)據(jù)庫中獲取測試用例,實現(xiàn)了測試用例的動態(tài)部署。

3.2 測試用例權(quán)重設(shè)定

為了給測試用例增加權(quán)重設(shè)定項,主要在以下三個方面對doctest做出修改。

(1) 存儲測試用例權(quán)重。實現(xiàn)思路為擴展測試用例父類Example建立子類MyExample,子類中增加Weight屬性,用于存儲每個測試用例實例的權(quán)重。

(2) 修改測試用例格式。原測試用例由兩部分組成:Python語句和輸出結(jié)果。為了能夠描述測試用例權(quán)重,筆者約定,在Python語句之前若出現(xiàn)#Weight=N形式的行,則N表示此測試用例的權(quán)重。如下方示例,該測試用例的權(quán)重為3。

#Weight=3

>>>factorial(10)

3 628 800

(3) 分析識別測試用例權(quán)重。實現(xiàn)思路為擴展父類DocTestParser建立子類MyDocTestParser,子類中重寫了識別測試用例的parse方法,其中用于識別測試用例的正則表達(dá)式從二元組(語句-結(jié)果)修改為三元組(權(quán)重-語句-結(jié)果)。

3.3 HTML格式的評測結(jié)果

將doctest的評測輸出結(jié)果由文本格式改為HTML格式,其思路如下。

(1) 擴展父類DocTestRunner建立子類MyDocTestRunner,子類中設(shè)立Results列表,存儲測試結(jié)果數(shù)據(jù),每個Result包含測試用例、實際運行結(jié)果和是否通過測試三個屬性;

(2) 子類中重寫summarize方法,功能為循環(huán)遍歷Results列表,按照HTML表格(Table)的語法格式總結(jié)輸出評測結(jié)果。表格中每一行展示一個測試用例的評測信息,包括編號、Python語句、正確結(jié)果、實際結(jié)果、權(quán)重和是否通過測試六列數(shù)據(jù)。

3.4 改進(jìn)后doctest測試示例

仍以階乘函數(shù)factorial(n)為例,按本文方法對doctest擴展后,測試用例采用后期動態(tài)部署方式進(jìn)行設(shè)置,如圖5所示。

圖5 動態(tài)部署測試用例

學(xué)生在編寫程序和提交程序時看不到測試用例,系統(tǒng)接收到學(xué)生程序后,按照題目編號搜索與之匹配的測試用例,將兩者組合后再進(jìn)行測試。

這里,測試用例采用三元組的形式,加入了權(quán)重項。改進(jìn)后的評測結(jié)果改為HTML格式,便于查看和數(shù)據(jù)統(tǒng)計,如圖6所示。

圖6 HTML格式的評測結(jié)果

4 總結(jié)

Python標(biāo)準(zhǔn)庫中的doctest模塊通過文檔字符串中的測試用例實現(xiàn)程序的自動化測試,測試功能較完備,內(nèi)部編程模型和評測思路對于教學(xué)實踐環(huán)節(jié)中Python程序自動評判方法的研究具有較高的參考價值和指導(dǎo)意義。本文深入研究了doctest的內(nèi)部對象模型,通過實例討論了doctest的測試步驟,分析和總結(jié)了doctest的缺點與不足,并針對這些不足之處提出了相應(yīng)的改進(jìn)方案,通過擴展doctest編程模型實現(xiàn)了測試用例的動態(tài)部署、測試用例權(quán)重設(shè)定和評測結(jié)果的格式化輸出。

2019—2020學(xué)年第1學(xué)期,在我校19級經(jīng)濟(jì)和會計兩個專業(yè)(6個班,180名學(xué)生)的Python程序設(shè)計課程中,應(yīng)用了以本文方法為核心設(shè)計實現(xiàn)的Python程序自動評測系統(tǒng),對上機實踐環(huán)節(jié)學(xué)生編程作業(yè)進(jìn)行全自動評測,結(jié)果顯示該系統(tǒng)能夠靈活管理和部署測試用例,評測準(zhǔn)確、效率高,長期運行穩(wěn)定,滿足了較大規(guī)模場景下教學(xué)和考試的需要。

猜你喜歡
程序
給Windows添加程序快速切換欄
電腦愛好者(2020年6期)2020-05-26 09:27:33
試論我國未決羈押程序的立法完善
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
基于VMM的程序行為異常檢測
偵查實驗批準(zhǔn)程序初探
我國刑事速裁程序的構(gòu)建
創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 制服丝袜亚洲| 亚洲中文字幕久久精品无码一区| 国产一级在线播放| 亚洲Aⅴ无码专区在线观看q| 亚洲电影天堂在线国语对白| 国产成人禁片在线观看| 亚洲制服丝袜第一页| 亚洲av成人无码网站在线观看| 久久久成年黄色视频| 国产香蕉在线视频| 久久人人妻人人爽人人卡片av| 亚洲色图狠狠干| 国产毛片高清一级国语| 制服丝袜 91视频| 国产第一页屁屁影院| 日韩欧美国产另类| 国产精品免费入口视频| 91国内视频在线观看| 99热这里只有精品国产99| 亚洲天堂日韩av电影| 一级爱做片免费观看久久| 欧美精品三级在线| 国产真实乱子伦视频播放| 国产在线无码av完整版在线观看| 国产精品欧美激情| 国产精品亚洲а∨天堂免下载| 国产理论最新国产精品视频| 在线观看亚洲成人| a免费毛片在线播放| 狠狠做深爱婷婷综合一区| 欧美三級片黃色三級片黃色1| 操国产美女| 91亚洲免费| 欧美一级高清视频在线播放| 国产精品男人的天堂| 又黄又爽视频好爽视频| 日韩无码视频专区| 久久www视频| 国产91线观看| 一级看片免费视频| 伊人中文网| 国产精品久久久久久久久久久久| 四虎影视永久在线精品| 91福利在线观看视频| 野花国产精品入口| 亚洲伊人天堂| 国产精品成人第一区| 国产幂在线无码精品| 国产精品一区二区久久精品无码| 91精品伊人久久大香线蕉| 青青青视频免费一区二区| 免费无码AV片在线观看国产| 国产精品综合久久久| 色老二精品视频在线观看| 国产精品美女网站| 欧美色99| 超碰精品无码一区二区| 国产成人91精品免费网址在线| 国产欧美日韩一区二区视频在线| 永久天堂网Av| 欧美人在线一区二区三区| 国产精品19p| 综合网天天| 日韩国产另类| 综合成人国产| 香蕉在线视频网站| 狠狠做深爱婷婷综合一区| 久久久亚洲色| 人人爽人人爽人人片| 9cao视频精品| 57pao国产成视频免费播放| 色偷偷一区二区三区| 毛片基地美国正在播放亚洲 | 91视频国产高清| 亚洲一级毛片在线播放| 无码av免费不卡在线观看| 伊人成人在线| 欧美精品成人一区二区在线观看| 日韩欧美中文亚洲高清在线| 亚洲福利视频一区二区| 色婷婷在线播放| 亚洲人成网站色7777|