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

C#語言GUI程序自動(dòng)評(píng)測(cè)關(guān)鍵技術(shù)研究

2022-04-20 11:14:56亓雪冬
微型電腦應(yīng)用 2022年3期
關(guān)鍵詞:程序學(xué)生

亓雪冬

(中國石油大學(xué)(華東),信息化建設(shè)處,山東,青島 266580)

0 引言

程序設(shè)計(jì)類課程是大學(xué)通識(shí)類教育課程中的重要組成部分,課程特點(diǎn)是理論與實(shí)踐緊密結(jié)合,上機(jī)編程練習(xí)對(duì)理解和消化課程內(nèi)容非常關(guān)鍵,同時(shí)為了更好地檢驗(yàn)學(xué)生的實(shí)際編程能力,程序設(shè)計(jì)類課程的考試環(huán)節(jié)中采用上機(jī)考試形式已成為趨勢(shì)[1]。上機(jī)練習(xí)或考試均需要以程序自動(dòng)評(píng)測(cè)系統(tǒng)作為支撐,目前常見的系統(tǒng)有Moodle和OJ。Moodle是一個(gè)課程管理系統(tǒng),最初由澳大利亞教師Martin Dougiamas開發(fā),初期不具有程序評(píng)測(cè)功能,后作為一個(gè)插件加入[2-3]。OJ是Online Judge系統(tǒng)的統(tǒng)稱,主要用于程序競(jìng)賽時(shí)對(duì)程序進(jìn)行評(píng)測(cè),國內(nèi)比較有影響力的主要有北京大學(xué)和哈爾濱工業(yè)大學(xué)的OJ系統(tǒng)[4]。

Moodle和OJ的程序評(píng)測(cè)原理基本類似,通過操作系統(tǒng)的輸入輸出重定向捕獲控制臺(tái)程序(也被稱為命令行程序)的輸入輸出,適合于對(duì)C、C++和數(shù)據(jù)結(jié)構(gòu)等程序算法類課程進(jìn)行自動(dòng)評(píng)測(cè)[5-7]。然而在C#程序設(shè)計(jì)課程中,程序的表現(xiàn)形式主要以GUI(Graphic User Interface,圖形用戶界面)程序?yàn)橹鳎琈oodle和OJ均不能對(duì)該類程序進(jìn)行評(píng)測(cè)。此外Moodle和OJ均采用服務(wù)器集中評(píng)測(cè)架構(gòu),易導(dǎo)致服務(wù)器負(fù)載過重,無法支撐大規(guī)模(1 000人以上)用戶同時(shí)使用。本研究以C#程序的自動(dòng)評(píng)測(cè)為背景,研究了可支持大規(guī)模用戶的分散式程序評(píng)測(cè)架構(gòu),分析GUI程序與控制臺(tái)程序的區(qū)別,提出針對(duì)GUI程序的管控模式評(píng)測(cè)方案,并討論評(píng)測(cè)過程中的關(guān)鍵技術(shù)細(xì)節(jié)。

1 分散式程序評(píng)測(cè)架構(gòu)

在程序評(píng)測(cè)系統(tǒng)的架構(gòu)設(shè)計(jì)上,Moodle和OJ都采用服務(wù)器集中評(píng)測(cè)架構(gòu),如圖1(a)所示。這種架構(gòu)中,服務(wù)器通常由Web服務(wù)器、數(shù)據(jù)庫服務(wù)器和程序評(píng)測(cè)服務(wù)器等部件組成,客戶端(學(xué)生機(jī)端)僅需安裝瀏覽器。這種架構(gòu)的優(yōu)點(diǎn)是客戶端部署簡(jiǎn)便,無須安裝專用的軟件,缺點(diǎn)是學(xué)生端僅充當(dāng)程序的編寫工具,而所有學(xué)生程序的編譯和評(píng)測(cè)均需在服務(wù)器端完成,服務(wù)器端負(fù)載壓力聚集易出現(xiàn)資源瓶頸。

(a)服務(wù)器端集中式評(píng)測(cè)架構(gòu)

為了分散負(fù)載壓力,支持大規(guī)模用戶量下的程序評(píng)測(cè),調(diào)整了學(xué)生機(jī)和服務(wù)器的負(fù)載分配,提出了學(xué)生端分散式評(píng)測(cè)架構(gòu),如圖1(b)所示。新的架構(gòu)中,服務(wù)器端程序評(píng)測(cè)服務(wù)器被移除,程序的編寫、編譯和評(píng)測(cè)等工作均在學(xué)生機(jī)中完成,僅需將評(píng)測(cè)結(jié)果發(fā)布到服務(wù)器保存,這使得所有學(xué)生機(jī)均分了原服務(wù)器中的程序評(píng)測(cè)工作量,分散了負(fù)載壓力,解除了資源瓶頸,提高了系統(tǒng)用戶承載規(guī)模。

2 GUI程序管控運(yùn)行評(píng)測(cè)方案

控制臺(tái)程序的特點(diǎn)是使用標(biāo)準(zhǔn)輸入輸出流與操作系統(tǒng)進(jìn)行數(shù)據(jù)交互。借助這個(gè)特點(diǎn),使用操作系統(tǒng)輸入輸出重定向功能,將輸入輸出流對(duì)接到外部文件,在不干擾程序正常運(yùn)行的情況下,對(duì)比程序?qū)嶋H輸出和預(yù)設(shè)輸出,即可完成程序評(píng)測(cè)。

GUI程序具有圖形用戶界面,不使用標(biāo)準(zhǔn)輸入輸出流而是通過界面元素(如文本框、按鈕等)與外界進(jìn)行數(shù)據(jù)交互,采用事件機(jī)制驅(qū)動(dòng)程序執(zhí)行,與控制臺(tái)程序有本質(zhì)區(qū)別,因此原控制臺(tái)程序的評(píng)測(cè)方案對(duì)GUI程序并不適用。

在深入分析GUI程序運(yùn)行特點(diǎn)基礎(chǔ)上,提出基于管控模式的程序評(píng)測(cè)方案,如圖2所示。這種方案中,管控模塊和待評(píng)測(cè)的GUI窗體模塊組合為單一程序,管控模塊是自動(dòng)評(píng)測(cè)的核心,管理和控制整個(gè)評(píng)測(cè)過程。評(píng)測(cè)過程由5個(gè)步驟組成:①程序啟動(dòng)后首先執(zhí)行管控模塊,再由管控模塊引導(dǎo)啟動(dòng)待評(píng)測(cè)的GUI窗體;②管控模塊根據(jù)評(píng)測(cè)用例將輸入數(shù)據(jù)填充到控件中;③管控模塊執(zhí)行控件的事件委托,實(shí)際效果相當(dāng)于觸發(fā)控件相關(guān)事件;④管控模塊讀取控件輸出數(shù)據(jù)并與預(yù)設(shè)的觸發(fā)事件后的結(jié)果數(shù)據(jù)進(jìn)行比較,輸出評(píng)測(cè)結(jié)果;⑤管控模塊關(guān)閉GUI窗體并結(jié)束自身程序,評(píng)測(cè)完成。

圖2 基于管控模式的程序評(píng)測(cè)方案

3 C#語言GUI程序自動(dòng)評(píng)測(cè)關(guān)鍵技術(shù)

3.1 組合管控模塊與窗體模塊

C#程序設(shè)計(jì)課程中,一個(gè)基本的GUI程序包含F(xiàn)orm1.cs、Form1.Designer.cs和Program.cs等3個(gè)文件,其中,Form1.cs和Form1.Designer.cs為窗體模塊,F(xiàn)orm1.cs包含窗體的功能邏輯代碼,F(xiàn)orm1.Designer.cs包含窗體的布局代碼,Program.cs主要包含Main函數(shù)用于啟動(dòng)Form1窗體。與學(xué)生相關(guān)的代碼全部集中在Form1.cs和Form1.Designer.cs中,與Program.cs無關(guān)。因此將管控模塊置入Program.cs中。編譯時(shí),管控模塊與窗體模塊組合在一個(gè)程序中;運(yùn)行時(shí),管控模塊管理和控制窗體模塊的評(píng)測(cè)過程。

3.2 管控模塊內(nèi)部邏輯

根據(jù)評(píng)測(cè)方案,管控模塊應(yīng)包含啟動(dòng)和關(guān)閉窗體模塊、執(zhí)行評(píng)測(cè)處理以及窗體模塊運(yùn)行超時(shí)時(shí)強(qiáng)制關(guān)閉程序等功能。管控模塊內(nèi)部邏輯核心代碼如下。

01 System.Threading.Timer timer;//定義定時(shí)器變量

02 TestRule[]testRules;//定義存儲(chǔ)測(cè)試規(guī)則的數(shù)組

03 void Main(){

04 timer = new System.Threading.Timer(OnTimeOut,null,5 000,-1);

05 Form1 testForm = new Form1();//創(chuàng)建窗體對(duì)象

06 testRules = ReadTestRules();//讀取測(cè)試規(guī)則

07 foreach(TestRule rule in testRules)//循環(huán)處理每一個(gè)測(cè)試規(guī)則

08 TestForm(testForm, rule);

09 OutputResult(testRules);//輸出測(cè)試結(jié)果

10 Form1.Close();//關(guān)閉窗體對(duì)象

11 }

12 void OnTimeOut(object state){//定時(shí)器處理程序

13 Environment.Exit(1);//強(qiáng)制結(jié)束程序

14 }

①第5行和第10行中,管控模塊在評(píng)測(cè)前和評(píng)測(cè)后分別啟動(dòng)和關(guān)閉窗體模塊。②第4行設(shè)置了定時(shí)器timer,用于對(duì)窗體模塊進(jìn)行超時(shí)檢測(cè),避免學(xué)生程序進(jìn)入死循環(huán)干擾評(píng)測(cè)過程。此處設(shè)置時(shí)間閾值為5 s(5 000 ms),超時(shí)后管控模塊調(diào)用第12行的OnTimeOut函數(shù),強(qiáng)制結(jié)束程序。③第6行讀取測(cè)試用例集,每個(gè)測(cè)試用例包含輸入數(shù)據(jù)、觸發(fā)的事件、輸出數(shù)據(jù)、評(píng)測(cè)結(jié)果等數(shù)據(jù)項(xiàng);第7、8行循環(huán)使用每一個(gè)測(cè)試用例對(duì)窗體進(jìn)行評(píng)測(cè);第9行將捕獲的測(cè)試結(jié)果輸出。

3.3 管控模塊讀寫窗體模塊的數(shù)據(jù)

C#語言GUI程序通過界面控件(如文本框、按鈕等)與外界進(jìn)行數(shù)據(jù)交互。為了使評(píng)測(cè)過程自動(dòng)化,管控模塊需要能夠按照評(píng)測(cè)規(guī)則讀取和寫入控件數(shù)據(jù)。然而管控模塊在窗體模塊外部,不能直接讀寫窗體模塊內(nèi)部的控件數(shù)據(jù),需要借助C#反射功能實(shí)現(xiàn)。

以文本框控件textBox1為例,讀寫該控件數(shù)據(jù)主要包括以下2個(gè)步驟。

(1)管控模塊通過反射取得窗體模塊textBox1的引用。這里,F(xiàn)orm1為窗體模塊名,textBox1為控件名。因?yàn)榇绑w內(nèi)的控件均為窗體的私有變量,因此需要NonPublic和Instance樣式的綁定說明。

TextBox textBox1 =(TextBox)Form1.GetType()

.GetField("textBox1", BindingFlags.NonPublic|BindingFlags.Instance)

.GetValue(Form1);

(2)通過賦值語句讀寫控件數(shù)據(jù)

textBox1.Text = 寫入的數(shù)據(jù)

讀取的數(shù)據(jù) = textBox1.Text

3.4 管控模塊模擬觸發(fā)事件

GUI程序依賴事件機(jī)制驅(qū)動(dòng)程序執(zhí)行,C#語言中觸發(fā)事件時(shí)會(huì)自動(dòng)調(diào)用該事件對(duì)應(yīng)的委托函數(shù)。為了模擬觸發(fā)事件的行為,管控模塊通過C#反射功能直接提取事件對(duì)應(yīng)的委托函數(shù)并執(zhí)行。

以按鈕控件button1的鼠標(biāo)單擊事件為例,事件委托函數(shù)原型為

void button1_Click(object sender, EventArgs e)

模擬觸發(fā)該事件的過程主要包括以下3個(gè)步驟。

(1)獲取button1所有事件委托函數(shù)列表,這其中包含了鼠標(biāo)單擊事件的委托函數(shù)。

EventHandlerList events =(EventHandlerList)(typeof(Button)

.GetProperty("Events", BindingFlags.NonPublic|BindingFlags.Instance)

.GetValue(button1, null));

(2)在上述委托函數(shù)列表中,以鼠標(biāo)單擊事件名“EventClick”作為鍵值,得到鼠標(biāo)單擊事件的委托函數(shù)。處理后,handler變量即表示button1_Click委托函數(shù)。

object key = typeof(Control)

.GetField("EventClick", BindingFlags.NonPublic|BindingFlags.Static)

.GetValue(null);

Delegate handler = events[key];

(3)調(diào)用委托函數(shù),模擬觸發(fā)鼠標(biāo)單擊事件。

handler.DynamicInvoke(button1, EventArgs.Empty);

4 應(yīng)用中出現(xiàn)的問題及改進(jìn)思路

評(píng)測(cè)系統(tǒng)在應(yīng)用過程中出現(xiàn)的問題及后續(xù)改進(jìn)思路總結(jié)如下。

(1)可評(píng)測(cè)控件種類不夠豐富。目前可評(píng)測(cè)的控件包括標(biāo)簽Label、文本框TextBox、單選按鈕RadioButton、復(fù)選框CheckBox、組合框ComboBox、列表框ListBox和進(jìn)度條ProgressBar等常用控件。下一步需要加入菜單MenuStrip、列表視圖ListView和樹形視圖TreeView等功能更復(fù)雜的控件,進(jìn)一步豐富題目類型。

(2)學(xué)生編寫的程序與測(cè)評(píng)的程序不一致。部分學(xué)生在評(píng)測(cè)前未對(duì)最新修改的程序進(jìn)行保存,導(dǎo)致評(píng)測(cè)結(jié)果與學(xué)生程序不匹配。下一步對(duì)評(píng)測(cè)系統(tǒng)進(jìn)行改進(jìn),在評(píng)測(cè)前顯示提示信息,提醒學(xué)生對(duì)修改后的程序進(jìn)行保存。

(3)編寫評(píng)測(cè)規(guī)則較繁瑣、效率低。評(píng)測(cè)規(guī)則采用Json格式,每一道題目的評(píng)測(cè)規(guī)則由多個(gè)子規(guī)則構(gòu)成,每個(gè)子規(guī)則包含輸入數(shù)據(jù)、觸發(fā)的事件和輸出數(shù)據(jù)。目前評(píng)測(cè)規(guī)則由教師手工建立,繁瑣且效率低。下一步擬增加評(píng)測(cè)規(guī)則自動(dòng)生成模塊,教師對(duì)題目進(jìn)行測(cè)試時(shí)自動(dòng)捕獲測(cè)試數(shù)據(jù)用以生成評(píng)測(cè)規(guī)則,提高題目維護(hù)效率。

5 總結(jié)

評(píng)測(cè)系統(tǒng)采用學(xué)生端分散式評(píng)測(cè)架構(gòu),充分利用機(jī)房中每一臺(tái)學(xué)生機(jī)的計(jì)算能力,分散了負(fù)載壓力,提高了系統(tǒng)可承載用戶規(guī)模,滿足了大規(guī)模上機(jī)考試的需要。在2018—2019學(xué)年第1學(xué)期,該系統(tǒng)僅使用一臺(tái)虛擬服務(wù)器(4個(gè)2.2GHz CPU、4G內(nèi)存)承擔(dān)全校程序設(shè)計(jì)上機(jī)考試,共3場(chǎng)考試,第1場(chǎng)共800人,第2場(chǎng)和第3場(chǎng)每場(chǎng)均為1 500人,總計(jì)3 800人。考試過程中,系統(tǒng)運(yùn)行穩(wěn)定,發(fā)題、評(píng)測(cè)和回收答案未出現(xiàn)任何異常,考試順利完成。系統(tǒng)運(yùn)行至今,累計(jì)超過10 000名學(xué)生使用該系統(tǒng)進(jìn)行程序設(shè)計(jì)的自測(cè)和考試,累計(jì)評(píng)測(cè)題目數(shù)百萬個(gè)。共承擔(dān)程序設(shè)計(jì)相關(guān)課程階段性測(cè)試和期末上機(jī)考試任務(wù)數(shù)十場(chǎng)次,系統(tǒng)效果好,利用率高,具有示范性和輻射性。

猜你喜歡
程序學(xué)生
快把我哥帶走
試論我國未決羈押程序的立法完善
《李學(xué)生》定檔8月28日
電影(2018年9期)2018-11-14 06:57:21
趕不走的學(xué)生
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動(dòng)“離婚”程序程序
學(xué)生寫話
學(xué)生寫的話
創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
主站蜘蛛池模板: 天天躁狠狠躁| 91欧洲国产日韩在线人成| 真人高潮娇喘嗯啊在线观看| 午夜限制老子影院888| 日本一区二区三区精品视频| 最新午夜男女福利片视频| 亚洲AV成人一区二区三区AV| 在线精品视频成人网| 97色婷婷成人综合在线观看| 精品视频福利| 一级片一区| 国产91丝袜在线播放动漫 | 黄色a一级视频| 一本一道波多野结衣一区二区 | 国产一级在线播放| 国产簧片免费在线播放| 欧美日韩午夜视频在线观看| 欧美国产日韩在线观看| 国产成人亚洲毛片| 88av在线看| 国产精品密蕾丝视频| 四虎在线观看视频高清无码| 广东一级毛片| 欧美激情视频二区三区| 日韩a在线观看免费观看| 香蕉国产精品视频| 都市激情亚洲综合久久| 国产亚洲第一页| 视频国产精品丝袜第一页| 国产aⅴ无码专区亚洲av综合网| 国产精品免费久久久久影院无码| 超薄丝袜足j国产在线视频| 中文字幕免费播放| 亚洲最新在线| 国产一区二区免费播放| 欧美不卡二区| 无码中文AⅤ在线观看| 国产成人精品一区二区不卡| 天堂在线www网亚洲| 国产不卡国语在线| 国产无码高清视频不卡| 狠狠色噜噜狠狠狠狠奇米777| 欧美精品v日韩精品v国产精品| 亚洲女人在线| 91毛片网| 欧美人人干| 国产成人综合日韩精品无码首页 | 无码视频国产精品一区二区| 日日噜噜夜夜狠狠视频| 国产福利小视频在线播放观看| 欧美一区二区三区香蕉视| 国产真实二区一区在线亚洲| 国产精品无码影视久久久久久久| 欧美高清国产| 爱做久久久久久| 国产精品lululu在线观看| 国产在线拍偷自揄观看视频网站| 国产成熟女人性满足视频| 亚洲精品少妇熟女| 亚洲无码高清视频在线观看| 亚洲 日韩 激情 无码 中出| 日韩av电影一区二区三区四区| 国产在线一区视频| 国产免费精彩视频| AV无码国产在线看岛国岛| 亚洲无线国产观看| 亚洲成年人片| 国产午夜无码片在线观看网站| Aⅴ无码专区在线观看| 色哟哟精品无码网站在线播放视频| 亚洲无线国产观看| 国产成人高精品免费视频| 少妇精品网站| 国产成人超碰无码| 国精品91人妻无码一区二区三区| 欧美伊人色综合久久天天| 欧类av怡春院| 丝袜无码一区二区三区| 爽爽影院十八禁在线观看| 国产在线观看第二页| 国产精品污污在线观看网站| 最新无码专区超级碰碰碰|