以Gradle 與Spock 為基礎的Java 程式作業自動收發與批改系統

75
DOI:10.6814/THE.NCCU.CS.007.2018.B02 N a t i o n a l C h e n g c h i U n i v e r s i t y 國立政治大學資訊科學系 Department of Computer Science National Chengchi University 碩士論文 Master’s Thesis Gradle Spock 為基礎的 Java 程式作業自動收發 與批改系統 An Assignment Processing System for Java Programming Based on Gradle and Spock 指導教授: 陳正佳 博士 : 顏碩亨 中華民國一七年七月 July 2018

Transcript of 以Gradle 與Spock 為基礎的Java 程式作業自動收發與批改系統

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

國立政治大學資訊科學系

Department of Computer Science

National Chengchi University

碩士論文

Master’s Thesis

以 Gradle 與 Spock 為基礎的 Java 程式作業自動收發

與批改系統

An Assignment Processing System for Java Programming Based on

Gradle and Spock

指導教授: 陳正佳 博士

研 究 生: 顏碩亨

中華民國一○七年七月

July 2018

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

以 Gradle 與 Spock 為基礎的 Java 程式作業自動收發

與批改系統

An Assignment Processing System for Java Programming Based on Gradle and

Spock

研究生:顏碩亨 Student:Shuo-Heng Yen

指導教授:陳正佳 Advisor:Cheng-Chia Chen

國立政治大學 資訊科學系 碩士論文

A Thesis submitted to Department of Computer Science

National Chengchi University in partial fulfillment of Requirements

for the degree of Master

in Computer Science

中華民國一百零七年七月 July 2018

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

i

致謝

本篇論文能夠順利完成,首先我由衷感謝指導教授陳正佳老師,在這二年半的研究

所生涯中的用心指導,以及給予許多的寶貴建議與鼓勵,使我獲益良多,能成為老師的

指導學生,我相當感到非常的榮幸。

另外,我感謝一起在網路技術研究室唸書的張博城和吳儼翰同學,當我的研究遇到

困難時,仍能提供我寶貴的建議與鼓勵,能與你們一同奮鬥,真得很開心。同時,我也

感謝研究室的郭峻瑋同學、陳冠謀同學,以及楊宗翰學弟、江太一學弟,大家彼此互相

交流和切磋學習,不僅分享資訊技術上的知識,也分享生活上的點滴,這些經驗使我的

研究所生活豐富且充滿活力。這兩年半的研究所生活,由衷感謝你們的陪伴與支持,這

全是我前進的動力。額外也感謝系辦的助教們平日不厭其煩的協助。

最後,我特別感謝養育和栽培我的的爸爸和媽媽,因為有你們的鼓勵,我才能邁向

更高的學術殿堂,因為有你們的支持,我才能無後顧之憂地完成研究所的碩士學位。

顏碩亨 僅致於

國立政治大學 資訊科學研究所

中華民國一百零七年七月

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

ii

摘要

學習程式設計已經蔚為全世界的潮流,無論是針對一般大眾的網路平台,或是針對

一般學生的正規學校,均提供確來越多的各種程式語言學習課程。然而由於程式作業是

程式設計課程不可或缺的一環,隨著修課人數的遽增,無可避免的將產生排山倒海的作

業量,這將為授課老師或助教造成沉重負擔,因為手動批改作業需要冗長的時間,此外

也無法給予學生及時的回饋。此時,我們需要用更好、更有效率的方式,來自動化的管

理與批改程式作業。

本研究提出的程式作業管理工具,相較於其他類似工具,例如:Moodle VPL、Jupyter

nbgrader 等,除了提供程式作業的發佈、編輯和繳交功能之外,更重視程式作業的題目

測試生成、程式評量,以及作業回饋等。

本系統的主要特色之一是具備能力,可以從單一程式作業解答,產生對應的程式作

業,以及測試與評分程式,因此可節省課程教師準備題目時間。出題者僅需提供一完整

Java 程式解答檔,指定其中部分方法為作業題目,再事先備齊每一題目的測試輸入資料

以及計分方式,即可利用本系統的人機介面操作,以 Java 註記(annotations)的方式為每

一題目注入測試數據與評分資訊,後續系統操作即可經由解答程式分析,萃取相關資訊,

再經由樣板程式而產生所有相關作品,例如分發給學生的程式作業,可結合作業解答與

學生交來作業的整合測試與評分程式等。我們的系統透過 Gradle 自動化所有程式作業的

建構與理。自動產生的測試與評分程式使用 Spock 測試框架進行測試與評分。最後系統

不但能提供每位學生整份程式作業的評量結果,可回饋給學生供其做為釐清盲點以及改

進錯誤的參考,也同時提供報告,協助授課老師快速掌握學生的學習情況。而在儲存部

分,我們使用了 Nexus 做為所有相關資料的集中倉儲,例如教師提供的作業解答、自動

生成的作業題目、測試與評分碼,所有學生的繳交作業,以及最後的測試與評分報告等。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

iii

An Assignment Processing System for Java Programming Based on

Gradle and Spock

Abstract

The learning of programming has become a worldwide trend. More and more courses

related to various programming languages are being offered on the Internet for the public and

from various schools for the students. However, since programing assignment is an

indispensable part of a programing course, the increase of students inevitably brings about a

large amount of programming assignments, which will cause an extremely heavy burden on

graders and teachers if all assignments are to be processed and graded manually. It would not

only take a long time, but also give students no feedback in time. In order to reduce the load of

assignments processing, we need to automate the management and operations of programming

assignments in a better and more efficient way.

This thesis comes up with a management and processing system of programming

assignments. In addition to the functionality of editing, distribution, and submission of

assignments, compared with other systems such as Moodle VPL, and Jupyter nbgrader, etc.,

our system pays more attention on different aspects of assignment generation and processing,

such as problem generation, test code generation, assessment automation and feedback to

students, etc.

One key feature of our system is its ability to generate assignment problems and

test/assessments code from a single solution file together with test input and grading

information provided by the teacher. It can thus save a lot of time for the teacher. To initialize

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

iv

an assignment using our system, the teacher can simply designates some methods of the solution

file as assignment problems. All test input as well as grading information prepared in advance

for each problem can then be injected into the corresponding method as annotations via JavaFX

GUI operations. The system can later apply java reflection to inspect these annotations from

the annotated solution file and generate all related artifacts such as programming assignments

and test/assessment code using predefined Velocity templates.

Our system employs Gradle to automate the building and management of programming

assignments. The generated test code will be executed using Spock testing framework. The

result of assessment can be used as a feedback to clarify students' weakness and help correct

errors. At the same time, it provides reports to help teachers quickly grasp what students have

learned. Finally, our system uses Nexus as the central repository of all related artifacts such as

solution code provided by teachers, automated generated assignments and test code, students'

submitted assignments, as well as final assessment reports etc.

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

v

目錄 摘要 ........................................................................................................................................... II

ABSTRACT ............................................................................................................................. III 目錄 ........................................................................................................................................... V

圖目錄 .................................................................................................................................... VII

表目錄 ...................................................................................................................................... IX

第 1 章 序論 .............................................................................................................................. 1

1.1 研究背景與動機 .............................................................................................................. 1 1.2 實現方式 .......................................................................................................................... 2 1.3 論文貢獻與特色 .............................................................................................................. 3

第 2 章 相關研究探討 .............................................................................................................. 5

2.1 自動化建構工具 .............................................................................................................. 5 2.1.1 Maven ........................................................................................................................ 6 2.1.2 Gradle ........................................................................................................................ 7

2.2 儲存庫簡介 ...................................................................................................................... 8 2.2.1 Nexus Repository ...................................................................................................... 8

2.3 輔助工具介面 .................................................................................................................. 8 2.3.1 JavaFX ....................................................................................................................... 8

2.4 程式測試工具簡介 .......................................................................................................... 9 2.4.1 Junit ........................................................................................................................... 9 2.4.2 Spock ....................................................................................................................... 10

2.5 模板引擎框架 ................................................................................................................ 12 2.5.1 Apache Velocity ...................................................................................................... 13

2.6 應用程式框架 ................................................................................................................ 13 2.6.1 Spring framework .................................................................................................... 14 2.6.2 Spring Boot .............................................................................................................. 14

2.7 相似系統的分析與簡介 ................................................................................................ 15 2.7.1 Moodle VPL(Virtual Programming Lab) ................................................................ 15 2.7.2 Jupyter nbgrader ...................................................................................................... 18

第 3 章 系統架構與實作 ........................................................................................................ 24

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

vi

3.1 系統架構 ........................................................................................................................ 24 3.2 系統實作 ........................................................................................................................ 28

3.2.1 輔助作業發佈介面 ................................................................................................. 28 3.2.2 程式作業發佈平台 ................................................................................................. 34 3.2.3 輔助作業測試介面 ................................................................................................. 36

第 4 章 介面操作流程與展示 ................................................................................................ 38

4.1 介面操作流程 ................................................................................................................ 38 4.2 介面操作展示 ................................................................................................................ 40

4.2.1 輔助作業發佈介面 ................................................................................................. 40 4.2.2 程式作業發佈平台 ................................................................................................. 47 4.2.3 輔助作業測試介面 ................................................................................................. 55

第 5 章 結論與未來研究方向 ................................................................................................ 59

5.1 結論 ................................................................................................................................ 59 5.2 未來研究方向 ................................................................................................................ 60

參考文獻 .................................................................................................................................. 61

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

vii

圖目錄

圖 1 使用者與系統的關係圖 ................................................................................. 15

圖 2 編輯器環境 ..................................................................................................... 16

圖 3 測試程式 test case ........................................................................................... 16

圖 4 對學生的作業做測試 ..................................................................................... 17

圖 5 修課學生一覽 ................................................................................................. 18

圖 6 檔案目錄結構 ................................................................................................. 19

圖 7 程式編輯器 ..................................................................................................... 20

圖 8 測試結果 ......................................................................................................... 21

圖 9 作業評量結果 ................................................................................................. 21

圖 10 測試和評分階段 ........................................................................................... 22

圖 11 作業收發的流程圖 ....................................................................................... 24

圖 12 程式作業檔案的發佈流程 ........................................................................... 25

圖 13 學生的程式作業檔案的繳交流程 ............................................................... 26

圖 14 測試人員的程式作業檔案的測試流程 ....................................................... 27

圖 15 俱有 Spock 測試規格的模板(template) ....................................................... 29

圖 16 程式作業 ........................................................................................................ 30

圖 17 application.yml 設定檔 .................................................................................. 35

圖 18 函式的測試 ................................................................................................... 37

圖 19 程式作業的發佈流程 ................................................................................... 38

圖 20 程式作業的下載流程 ................................................................................... 39

圖 21 程式作業的測試流程 ................................................................................... 39

圖 22 輔助上傳作業的操作介面 ........................................................................... 40

圖 23 介面操作流程的提示畫面 ........................................................................... 41

圖 24 原始程式作業 ............................................................................................... 42

圖 25 課程選取項目 ............................................................................................... 42

圖 26 程式作業版本資訊 ....................................................................................... 43

圖 27 當前介面的狀態資訊 ................................................................................... 43

圖 28 作業的測試項目設定 ................................................................................... 44

圖 29 測試程式碼範例 ........................................................................................... 44

圖 30 移除實作部分的程式作業 ........................................................................... 45

圖 31 當前介面的狀態資訊 .................................................................................... 45

圖 32 Nexus Repository 儲存庫 .............................................................................. 46

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

viii

圖 33 程式作業發佈平台 ....................................................................................... 46

圖 34 Homework Initializr 網站(一) ........................................................................ 47

圖 35 Homework Initializr 網站(二) ........................................................................ 48

圖 36 作業壓縮檔下載的對話方塊 ....................................................................... 48

圖 37 Gradle 專案的檔案內容 ................................................................................ 49

圖 38 專案的結構目錄 ........................................................................................... 49

圖 39 HW7Solution2.java 檔案內容 ....................................................................... 50

圖 40 build.gradle 檔案內容 .................................................................................... 50

圖 41 eclispe 功能選單 ............................................................................................ 51

圖 42 匯入 Gradle 專案 .......................................................................................... 51

圖 43 JavaSpec 測試結果概略(一) .......................................................................... 52

圖 44 JavaSpec 測試結果概略(二) .......................................................................... 53

圖 45 JavaSpec 詳細測試結果(一) .......................................................................... 53

圖 46 JavaSpec 詳細測試結果(二) .......................................................................... 54

圖 47 全部測試結果的資訊一覽表 ........................................................................ 54

圖 48 輔助作業測試介面 ........................................................................................ 55

圖 49 查詢作業儲存庫的結果資訊 ........................................................................ 56

圖 50 學生的程式作業的版本挑選 ........................................................................ 56

圖 51 作業的測試項目設定 .................................................................................... 57

圖 52 測試結果報告 ................................................................................................ 58

圖 53 簡易測試結果報告 ........................................................................................ 58

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

ix

表目錄

表 1 Spock 和 Junit 的名稱對照表 ......................................................................... 11

表 2 本研究所研製之工具與 Moodle VPL、Jupyter nbgrader 三者工具的優缺點

相互比較表 ...................................................................................................... 23

表 3 Java Annotation 標籤資訊 ............................................................................... 33

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

1

第 1 章

序論

1.1 研究背景與動機

隨著資訊科技的蓬勃發展,資訊相關的技術應用,已經深入現代人的生活中,例如:

社群網路、人臉辨識、大數據分析等。隨著資訊技術的快速發展,全世界對於資訊人才

的需求不斷增加,學習程式語言已經蔚為一種潮流。因而在學校修習電腦科學課程的學

生與日俱增,所有學生的課堂作業量,已經逐漸對授課老師造成相當大的沉重負擔。而

在處理程式作業上有別於一般紙本作業,透過電腦的輔助,我們可以制定一套自動化的

管理流程[1][2]。從一開始老師設計程式作業、作業解答與發佈,到學生下載程式作業,

並將其寫完後回傳給老師作批改。以上的每一個步驟,都可以透過電腦用自動化的方式,

幫助老師有效率地處理大量的程式作業,縮短處理時間,使老師專注在教學品質的提升,

同時讓學生在學習上更有效率[3]。

舉 Java 程式語言為例,目前網路上已經有人在管理程式作業的領域上,提出許多的

工具,像是 Moodle VPL、Jupyter nbgrader 等。以上這些解決方案,大部分主要提供老

師和學生一個操作介面,經由此介面學生可以在網路上撰寫程式作業,老師也可以用自

動或是手動的方式批閱作業[4],最後產出程式作業的成績報表。不過於程式作業的測試

方面仍就需要老師親自編寫,勞心費神,又由於學生只能使用固定的編輯器來撰寫程式

作業,尚缺乏彈性。而本研究所提出的解決方案是,當老師設計完程式作業的題目後,

能夠為程式作業自動產生出測試程式,節省撰寫測式程式的時間。學生可以從老師的教

學平台上下載作業到自己的電腦中,並且,擁有較大的彈性可以選擇習慣的軟體編輯器,

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

2

來撰寫程式作業。學生可透過測式程式來驗證自己的答案,於確認無誤後就可回傳作業

至教學平台。

1.2 實現方式 我們假設老師設計 Java 程式作業時,每一個問題就是一個要求學生實作的 method。

透過自訂的 Java method annotation 標籤,為每一個 method 標記作業的相關資訊(例如:

類型、配分、總分、權重等),設定所使用的測試數據,數據可為整數、浮點數、字元、

字串等。由於使用 Java method annotation 標籤,所以我們可以明顯區分 class 內的 method

是屬於作業題目,或僅是輔助方法。接著於程式碼產生器中,藉由 Java Reflection 技術

獲取每一個 method 所對應的標籤資訊,標籤資訊經過適當處理後,使用 Apache Velocity

技術,將標籤資訊合併至預先設計的程式碼模板(template),產生可執行的測試程式碼。

老師透過使用 Gradle 產生出給學生的程式作業檔案,於產生的過程中,能夠移除程式作

業的 method 實作的部分,並且上傳至遠端的儲存庫作儲存。

我們使用 Nexus Repository 和 Spring Boot 技術來建置老師的教學平台,透過教學平

台,使用者可以選擇修課課程、作業版本,並且填入使用者的身分識別(例如:學號、姓

名等),於各項資料填妥後,即可產生程式作業的壓縮檔,供使用者下載。因此,學生能

透過老師的教學平台,下載程式作業檔案到自己的電腦中,之後即可選擇任何個人習慣

的編輯器來撰寫程式作業。當程式作業完成後,學生可自行執行測試程式作驗證,驗證

完後會產生測試結果報表(html 檔案),報表顯示學生的作業答題的各項統計數據(例如:

答對和答錯的題數、執行測試的時間等)。學生可對於錯誤答案作更正,更正完之後即可

回傳程式作業檔案至老師的教學平台。

待教學平台蒐集齊學生的程式作業檔案後,測試人員(老師或教學助理)即可進行正

式的作業評分,過程中亦可採用其他版本的測試程式,來對學生作業做驗證和測試。同

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

3

時,測試人員也可根據學生的答題情況,適時透過參數的設定,以調整得分的方式。最

後,系統將能產生所有學生的全部作業的成績報表(html 檔案),與個人學習情況的回饋。

1.3 論文貢獻與特色 目前於網路上,關於程式作業的管理工具五花八門,各有優缺點,每項工具所重視

的層面也不盡相同。本研究之程式作業管理工具與現有的工具相比,特別重視測試程式

碼的部分,也就是以自動化的方式產生出測試程式碼,與批改程式作業,並且產生出測

試結果報表,報表有益於幫助學生作學習。此項工具能提升老師在設計程式作業時的效

率,並可大量批閱學生的程式作業,節省許多寶貴時間。因此,經由此項工具可以降低

老師教學上的負擔,並且提升學生的學習效率。以下為研究之程式作業管理工具的貢獻

與特色:

1. 老師能夠透過 Java annotation、Java reflection、Apache velocity 等技術,依照設計的程

式作業,以自動化的方式快速產生出測試程式碼,為老師節省大量手動撰寫測試程式

碼的心力和時間。

2. 測試程式使用 Spock 的測試框架,遵循 BDD[37]概念,將測試依據需求拆解成不同功

能的區塊(setup、expect、where 等區塊),使得測試程式碼和測試數據可以清楚且容易

的被分開,這讓測試程式碼的修改和閱讀相較於傳統的測試程式碼,來得容易、簡潔,

對於非技術人員也能夠容易理解測試程式的用途。

3. 透過 Gradle 來建構和管理整個程式作業的檔案,於 build.gradle 檔案中定義整個檔案

的建構資訊,能夠自動化管理眾多的 dependency,並且執行 Gradle 指令 ”gradle test”

可以啟動測試程式對程式作業作驗證,進行評分,最後,產生測試結果的報告(html 檔

案),報告內容呈現各項統計數據,方便老師掌握學生的學習狀況。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

4

4. 我們使用 Nexus repository 和 Spring boot 技術實作教學平台,對於不同的課程和程式

作業,此教學平台不僅能對程式作業檔案,作有條理的管理和發佈,更還能夠藉由學

生所輸入的身分資料,產生俱有個人身分識別的程式作業檔案。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

5

第 2 章

相關研究探討

此章節主要介紹相關研究領域,以及本研究所使用到的理論與技術。首先,於 2.1

節介紹自動化建構工具(包含:Gradle、Maven)。接著,於 2.2 節介紹程式儲存庫(包含:

Nexus Repository)。然後,於 2.3 節介紹輔助工具介面(包含:JavaFX)。之後,於 2.4 節

介紹程式測試工具簡介(包含:Junit、Spock)。接著,於 2.5 節介紹模板引擎框架(包括:

Apache Velocity)。然後,於 2.6 節介紹應用程式框架(包括:Spring framework、Spring

Boot)。最後,於 2.7 節介紹相似系統的分析與簡介(包括:Moodle VPL、Jupyter nbgrader)。

2.1 自動化建構工具

現代化的自動化建構工具提供各種能力,讓開發者可以自動化程式開發過程中各種

必須的軟體工具操作,例如相依程式的收集管理與載入,程式編譯與測試,各種文檔生

成與存放,測試報告,以及程式包裹與佈建等。自動化建構工具協助程式開發者處理各

項繁冗的工作,能夠節省大量時間,加速軟體開發的進行,並且使開發人員更專注於軟

體程式的開發工作。

目前市面上有許多常見的自動化建構工具,例如 Maven[8]、Gradle[9]、Ant[10]、

Sbt[11]、Gulp[12]、SCons[13]、CMake[14]、Grunt[15]。接下來將簡單介紹本系統使用到

的自動化建構工具 Maven 與 Gradle 的核心概念,及其優點和缺點。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

6

2.1.1 Maven

Maven 是一個由 Apache 軟體基金會所提供的軟體專案管理及自動化構建工具(特別

是針對 Java 語言)。Maven 這個英文字代表”知識的累積”的意涵,意謂 Maven 提供之標

準化的建構流程,為既有軟體工程知識的集合,並同時也帶入了軟體相依管理的概念。

基於專案物件模型概念(Project Object Model,縮寫為 POM),Maven 透過設定檔(pom.xml)

管理整個專案的建構。Maven 也可被使用於建構和管理各種 Java 語言以外的專案,例

如:C#[38]、Ruby[39]、Scala[40]。Maven 有四項重要的精神與觀念,分別為慣例先於設

定(Convention over configuration)、相依性管理(Dependency management)、以 plugin 作為

基礎的架構、專案物件模型(Project Object Model)。

1. 慣例先於設定(Convention over configuration):Maven 認為軟體專案開發必須遵循某些

慣例,例如:固定的目錄名稱與架構、固定的變數名稱、固定的專案建構流程等。因

為一般軟體專案的建構流程相仿,大同小異,所以 Maven 認為程式開發者不應耗費

大量時間於例行性的設定上。因此,檔案架構、建構流程、參數屬性等,只需於特定

條件下進行微調參數即可。Maven 認為程式開發者應將精神和資源全力挹注於更重要

的工作項目。

2. 相依性管理(Dependency management):過去 Java 語言的開發者,經常於網路中,為

專案找尋適當的 library 檔案(*.jar),將其檔案下載並放置於專案的 lib 資料夾。如果

A.jar 檔案依賴其他的 library 檔案,例如:B.jar 檔案或 C.jar 檔案,則還需要上網搜尋

相關的 library 檔案,下載其檔案,並需要留意相依性不足或版本衝突的問題。當面臨

一件越趨複雜且龐大的軟體專案,這些套件檔案將佔用可觀的硬碟容量資源,不僅造

成檔案版本管理上的負擔,而且需耗費資源去更新維護,以及刪除無用的檔案。當透

過集中式的管理方式,將各類套件放置於中央儲存庫(Central repository)作存放。於設

定檔(pom.xml)中宣告、描述相依的程式庫和函式庫等資訊,透過簡短的程式碼來宣告

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

7

檔案間的依賴關係。Maven 會根據設定檔中所宣告的依賴關係,於專案建構的過程中,

為專案下載其相關的檔案資源。

3. 以 plugin 作為基礎的架構:Maven 提供固定的專案建構流程,例如:default、clean、

site 流程等。於每項專案建構流程中,又區分為多個階段(phase),舉例:default 建構

流程中,會有例如:validate、compile、test、package、integration test、verify、install、

deploy 等階段。每個階段會有相對應的 plugin 可作使用。Maven 本身會有一些系統預

設的 plugin。程式開發者能夠於設定檔中依需求來宣告 plugin,以及執行 plugin 的時

機。當專案建構的過程中,Maven 將會自動取得 plugin 並作執行。

4. 專案物件模型(Project Object Model,縮寫為 POM):POM 為 Maven 專案主要的設定

檔(pom.xml),決定該專案建構的所有相關設定,包含:專案名稱、組織名稱、屬性變

數、相依檔案、編譯執行等資訊。設定檔中的程式碼能夠維持精簡,因為位於 Maven

核心函式內的 super-pom.xml 檔案,已經預先完成相關慣例的設定。透過設定檔

(pom.xml)能夠覆寫 super-pom.xml 檔案的設定,或是附加新的定義和參數。

2.1.2 Gradle

Gradle 是一個以 Apache Ant 和 Apache Maven 概念為基礎的專案自動化建構工具。

Gradle 俱有簡單易用、豐富的軟體套件、以及跨平台等三項主要的優點,以下詳述介紹。

1. 簡單易用:Gradle 以 Groovy 語言為基礎,用簡易的領域特定語言(DSL,Domain

Specific Language) 語法定義任務。程式開發者可不需具備 Java 語言基礎,即能夠快

速開發程式,縮短軟體開發時間。

2. 豐富的軟體套件:由於 Java 語言的長久發展而累積豐富的函式庫,使用者透過 Gradle

內建的 Plug-in 設計,使專案可依照需求來選擇適合的軟體套件,或是自行研發套件

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

8

作使用。例如:JasperReport 套件用於產生專業報表、JavaMail API 用作處理電子郵

件、可執行 Jetty 內嵌網頁伺服器、以 JGit 處理專案版本控管任務等。

3. 俱有跨平台的特性:於任何裝有 JVM(Java Virtual Machine)的作業系統中,無論系統

是否有安裝 Gradle 工具,都能夠透過 gradlew 執行檔,去運行以 Gradle 為基礎的專

案。

2.2 儲存庫簡介

2.2.1 Nexus Repository

Nexus Repository[17]為支援軟體開發的套件儲存庫,對於具有 Java Virtual Machine

(JVM)相關的開發工具,包括:Gradle、Ant、Maven、Ivy 等,具有強大的支援。並且,

Nexus Repository 能夠儲存和發佈各種系統支援的檔案格式,包括:Maven、Java、NPM[18]、

Docker[19]、NuGet[20]等,還能管理各式元件,二元檔案(binaries)、容器(containers)、組

合件(assemblies)等。同時,Nexus Repository 能夠和主流的程式開發環境或工具做結合,

包含:Eclipse、IntelliJ[21]、Hudson[22]、Jenkins[23]、Docker[19]等。

2.3 輔助工具介面

2.3.1 JavaFX

JavaFX[24]可用作設計輕量且高效能的使用者圖形介面的應用程式,相較於過往

Java 使用 Awt、Swing 實作應用程式的方式,JavaFX 提供更豐富的工具和函式庫,協助

開發應用程式,而且製作的程式效能更好,畫面更優美。JavaFX 目前已經併入 Java JDK

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

9

和 Java JRE 中,因此 JavaFX 能使用任何 Java 函式庫,並且執行於 JRE 8 以上版本的

JVM(Java Virtual Machine)。於開發介面應用程式時,可搭配 JavaFX Scene Builder 工具

來製作 FXML(為一個 XML 檔案,用作描述 JavaFX 的使用者介面),可快速且有效率的

編排 JavaFX 應用程式的操作介面。

2.4 程式測試工具簡介

程式測試工具用來檢測軟體的品質、正確性、以及完整性。換句話表示,於設定的

特定條件下,對程式進行各種操作,以便發現程式的錯誤,衡量程式的品質,並對其是

否能滿足程式設計的需求,來進行檢測。程式測試有眾多方式,包括:單元測試、整合

測試、系統測試、回歸測試、效能測試、壓力測試等。本研究所採用的是”單元測試(Unit

Testing)”。

單元測試(Unit Testing)[7][26],是以程式中最小的可測試單元為對象,撰寫測試程

式,來驗證邏輯正確與否。一般來說,程式中最小的邏輯單元就是函式(function),或是

方法(method)。程式設計師在每次的程式修改就會進行最少一次單元測試。在開發程式

的過程時,前後很可能要進行多次單元測試,以證實程式達到原先設定的功能目標,而

沒有任何程式錯誤。目前市面上有許多程式測試工具,包括:TestNG[27] 、Spock[28]、

Junit[29]等。本研究使用 Spock 測試架構作為程式的測試工具。

2.4.1 Junit

Junit[29]是用於撰寫和執行可重複的自動化單元測試框架,此框架可應用於 Java 語

言。Junit 單元測試能夠確保程式碼的執行結果,和預期的結果相符合。它並且提供測試

的執行、結果的記錄以及錯誤的報告。由於 Junit 測試架構簡潔,能夠使測試程式開發

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

10

者快速撰寫程式碼,開發者只需專注於測試碼本身。目前主流的有 Junit3 和 Junit4,最

新版本為 Junit5。

於 Junit3 的版本,測試程式需繼承 TestCase 類別,TestCase 類別用作集合相關的測

試案例。如果開發者撰寫 test123()方法,每個 test123()方法中撰寫所需的單元測試。且

如果定義 setUp()、tearDown()方法,則每次單元測試時,會依序執行 setUp()、 test123()、

tearDown()方法

但是於 Junit4 的版本,將不再需要繼承 TestCase 類別,而能夠使用”@Test”標註測

試方法,方法只需公開、不需傳回值、不需參數,名稱則能夠任意自訂。Junit 4 會自動

搜尋有標註”@Test”的方法並執行。”@Before”可用作標示每個測試方法開始前所需執行

的操作,”@After”可用作標示每個測試方法完成後所需執行的操作。

2.4.2 Spock

Spock[28]同樣為自動化單元測試框架,此框架可應用於 Java 語言或 Groovy 語言。

測試程式的使用是以 Groovy 語言為基礎而擴展而成的規範語言[32] (Specification

Language)。相容絕大部分 Junit[29]的運作環境 (IDEs、build tools、continuous integration

servers 等)。框架的設計理念結合了 Junit、Jmock[34]、Rspec[35]、Groovy[36]、Scala 等。

Spock 遵守 BDD[37] 模式(Behavior-driven development, 行為驅動開發),使得測試的邏

輯更加清楚,亦使軟體專案中的開發者、QA 和非技術人員或商業參與者之間能夠共同

製作。為了更清楚理解 Spock 的特性,以下依序簡單介紹相關重要名詞:Groovy 語言、

BDD 模式。

1. Groovy 語言:Groovy 語言為 Apache Software Foundation 於 Java 平台上所設計的物

件導向程式語言。Groovy 語言擁有類似於 Python、Ruby 和 Smalltalk 等程式語言的

一些特性,可作為 Java 平台的腳本語言(script language)作使用。Groovy 語言的語法

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

11

於架構上和 Java 語言相似,但是比 Java 語言更容易學習與使用,十分適合剛入門學

習程式語言的初學者。大多數 Java 語言的程式碼亦符合 Groovy 語言的文法規則。

Groovy 語言的程式碼可被動態地編譯,產生能夠執行於 JVM(Java Virtual Machine)上

的 Java 位元組碼,並與其他 Java 語言的程式碼及 library 進行相互操作。

2. BDD (Behavior-driven development):BDD 是一種由敏捷軟體所開發的技術,目的是

鼓勵軟體專案中的開發者、QA 和非技術人員或商業人員的協同參與製作。BDD 包括

驗收測試和客戶測試驅動等的程式撰寫,作為對測試驅動開發的回應。BDD 的重點

是透過與利益相關者互相的討論,來取得對預期的軟體功能的清楚認識。透過自然語

言的撰寫,使非程式設計師亦可理解測試範例,進而擴展行為驅動的開發方法。行為

驅動開發人員使用多種語言來描述他們的程式碼的目的,這讓開發者能夠將精力與資

源集中在程式碼的撰寫,而不是技術細節上。因此大幅減少在利益相關者之間,彼此

溝通翻譯的成本,以及減少在溝通上的誤會。如表 1 為 Spock 和 Junit 在各個名稱上

的對照表。

表 1 Spock 和 Junit 的名稱對照表

Spock Junit

Specification Test class

setup() @Before

cleanup() @After

setupSpec() @BeforeClass

cleanupSpec() @AfterClass

Feature Test

Feature method Test method

Data-driven feature Theory

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

12

Condition Assertion

Exception condition @Test(expected=…)

Interaction Mock expectation (e.g. in Mockito)

於使用 Spock framewprk 之前,需要相關的 dependencies。

1. Junit(version 4.12):用來撰寫 unit 和 integration tests。

2. Spock Core(version 1.1-groovy-2.4):應用於 Java 或 Groovy 的單元測試框架。

3. Groovy ALL(version 2.4.4):應用於 JVM 上的動態程式語言。

由於單元測試是用 Java 和 Groovy 程式語言所撰寫的,所以需要使用 GmavenPlus plugin

和 Maven Compiler plugin 來對測試程式碼做編譯。

2.5 模板引擎框架

模板引擎是指透過某種模板語言將程式或頁面片段製作成模板,再根據業務邏輯將

該模板語言翻譯成業務數據,從而產生最後呈現的的程式或頁面。模板引擎的目的是將

靜態的程式或頁面與動態的業務數據或程式邏輯徹底分離。模板引擎不屬於特定技術領

域,而是屬於跨領域跨平台的概念。模板引擎不僅能夠實現程式碼分離(業務邏輯的程式

碼,和使用者介面的程式碼),也能夠實現數據分離(動態數據與靜態數據),甚至實現程

式碼單元的共享。目前於 Java 平台中,常用的模板引擎有 Apache Velocity[42]、

FreeMarker[43]、Jamon[44]等。本研究提出的工具使用 Apache Velocity 作為模板引擎。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

13

2.5.1 Apache Velocity

Apache Velocity[42]是一個基於Java語言的模板引擎框架,提供的模板語言可使用於

Java語言中所定義的對象和變量上。Apache Velocity可用作以下的場景中:Web應用、原

始程式碼生成、e-mail郵件生成,以及xml的轉換。

1. Web應用:開發者可在不使用Javascript語言的情況下,可用Velocity讓html具有動

態內容的特性。

2. 原始程式碼生成:Velocity可以被用來生成Java程式碼、SQL或者PostScript,有很

多開源和商業開發的軟體都是使用Velocity進行開發。

3. Email郵件生成:很多軟體的用戶註冊、密碼提醒或者報表都是使用Velocity來自

動生成。使用Velocity可以在文本文件裡面生成郵件內容,而不是在Java程式碼中

拼接字符串。

4. xml轉換:可以讀取XML文件,並讓文件能夠被Velocity模板讀取。一個比較普遍

的應用是將 .xdoc文檔轉換成具備樣式的html文件。

2.6 應用程式框架

應用程式框架(Application Framework)[45]是遵照某個架構,由架構中通用的、可重

複使用的流程所組成的集合,且應用程式框架可為一個系統的全部或部分可再使用的設

計,也能夠是一個應用系統的骨架,允許系統開發者客製化、特殊化,以產生客戶所需

求的應用系統。

應用程式框架能在有限制的條件下,提供使用者在更短時間內開發出更佳品質的程

式。目前市面上有許多應用程式框架,例如:Spring[46]、Vert.x[46]、JSF[47]等,本研

究使用 Spring framework 作為應用程式框架。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

14

2.6.1 Spring framework

Spring framework [50]是個輕量級的容器,實現 IoC ( Inversion of Control)[48]、AOP

(Aspect-oriented programming)[49] 概念,是一個全方位的應用程式框架。Spring 的核心

在檔案容量上只有不到 1MB 的大小,而使用 Spring 核心所需要的資源也是很小的,而

Spring 是個非侵入性框架,它的目的之一是讓應用程式感受不到框架的存在,減低應用

程式從框架移植時的負擔。Spring 的核心概念是 IoC,更具體而易懂的名詞是依賴注入,

使用 Spring,您不必自己在程式碼中維護物件的依賴關係,只需在組態檔中加以設定,

Spring 核心容器會自動根據組態將依賴注入指定的物件。

2.6.2 Spring Boot

Spring Boot 簡化 Spring Application 的開發,能夠創建一個獨立的、產品級的 Spring

Application。Spring Boot 為 Spring 平台及第三方使用者提供簡便的設置,能夠幫助開發

團隊構建簡單輕便、快捷靈活基於 JVM 系統的應用程式。多數 Spring Boot Application

只需要很少的 Spring 設置。使用者透過 Spring Boot 創建 Java Application,並使用 java -

jar 啟動程式,或採用傳統的 war 部署方式。同時 Spring Boot 也提供一個運行"spring

script"的命令行工具。Spring Boot 希望達到快速開發以 Spring 為基礎的應用程式、能夠

立即使用的微服務、不生成程式碼,不需要 xml 配置,以及提供一些大型項目常用的非

功能性特性,例如:嵌入式服務、安全、監控、健康檢查、外部配置。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

15

2.7 相似系統的分析與簡介

2.7.1 Moodle VPL(Virtual Programming Lab)

Moodle VPL[5][6][31]為程式作業的管理系統,支援作業的發布、繳交、評分,是

Moodle[30]上的一個 activity module。Moodle VPL 由 Moodle plugin(VPL 3.2 for Moodle[30]

2.7-3.2) 和 execution system (也就是 vpl-jail-system[33] 2.2.2)兩大主要元件所組成。老師

和學生透過網路瀏覽器連線至 Moodle VPL 系統,完成程式作業的設計、撰寫、繳交以

及測試,使用者於 Moodle server 上做程式編輯與程式執行,於 Jail server 上執行程式碼

的測試,最後將測試結果報告回傳至 Moodle server 做儲存,使用者與系統的關係如圖 1

所示。此外,Moodle VPL 系統透過 Jail server,可擴充支援多種程式語言的程式作業撰

寫。接下來,詳細介紹 Moodle VPL 系統有以下優缺點。

圖 1 使用者與系統的關係圖

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

16

1. Moodle VPL 提供老師和學生於瀏覽器上的簡易程式編輯器,編輯器具有基本的編

輯功能(如:程式執行、程式除錯、文字複製、文字貼上等),如圖 2 所示,程式編

輯器和市面的程式開發環境相比,不僅於功能上缺少許多實用工具,例如:變數搜

尋、文件參考、程式碼自動補齊等,而且介面設計較為簡略和單調。

圖 2 編輯器環境

2. Moodle VPL 能夠執行主程式和執行測試程式,test case 的部分仍需要老師親自撰

寫,會花費老師大量的寶貴時間,如圖 3 所示。

圖 3 測試程式 test case

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

17

每一組的 test case 需要輸入以下的數據,case name、input、output,但是其中 input

數據可依照情況省略。當執行測試 test case 時,會比較預期的 output 數據和程式實

際的 output 數據是否相同,判斷是否通過測試。

3. 測試結果會顯示在右邊欄位,資訊會顯示:成功和失敗的 test case,每組 test case

的 input、output 等詳細資訊,如圖 4 所示。

圖 4 對學生的作業做測試

4. 學生被設定為沒有權限瀏覽 test case,所以當老師出題時需詳細告訴學生題目的定

義和要求,協助學生朝向 test case 的要求來撰寫程式作業。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

18

5. 假如有十組 test case,它的自動測試會一次執行所有的 test case,不論各組的測試是

否通過或是不通過、是否有嚴重的編譯錯誤,執行結果會顯示各組測試的分數,可

點選各組的 test case 查看答題情況和詳細的測試訊息。

6. VPL有相似度檢查的功能,能夠檢查檔案之間彼此的相似程度,用於偵測作業抄襲。

7. 修課學生管理清單,能夠掌握學生的作業繳交和學習狀況,如圖 5 所示。

圖 5 修課學生一覽

8. 可對程式編輯器做功能限制,例如:為避免程式的作業抄襲,可禁止使用編輯器的

複製、貼上功能,達到降低作業抄襲的機會。

2.7.2 Jupyter nbgrader

Jupyter nbgrader [41]是個以python語言作為程式作業的發放/繳交/評分系統。於

Jupyter上開發的nbextensions tool稱為"tool bar",由此工具來協助老師制定程式作業,並

透過一系列的nbgrader指令,包括:assign、release、verify、test等,對程式作業執行不同

的處理。Jupyter nbgrader具有嚴謹的檔案目錄結構,假設以"Java程式設計"這門課程為例,

則檔案目錄結構共有七大項類別,以下依序做詳細的介紹,檔案目錄結構如圖6所示。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

19

圖6 檔案目錄結構

首先,nbgrader_config.py檔用來設定課程的nbgrader組態檔,包含:課程id、修課學

生名單、作業繳交期限等資訊。gradebook.db檔用來存放修課學生名單、作業版本資訊、

學生的作業成績和繳交情況。source file資料夾用來存放原始版的程式作業。release file

資料夾用來儲存準備發佈的程式作業。submitted file資料夾用來儲存學生繳交的程式作

業,依據學生id存放於不同的資料夾。autograded file資料夾用來存放已經批閱過的程式

作業。feedback file資料夾用來存放老師對學生的作業所做的回饋內容。以下為Jupyter

nbgrader系統的優點及特性,逐一做說明:

1. Jupyter nbgrader 提供老師和學生在瀏覽器上一個簡易的程式編輯器,程式編輯器如

圖7所示。程式編輯器具有基本的編輯功能如:執行(run)、複製(copy)、貼上(paste)

等功能。於編輯器上方的tool bar中可選擇”Create Assignment”,其用來產生新的程式

作業檔案,而Total point呈現該份程式作業的總分。程式編輯器由多組且獨立的code

block所組成,code block有四種功能做選擇,老師可為每組code block設定適當的功

能選項,code block會依照選擇的功能進行不同的測試。code block具有以下有四種

功能選項:選擇”Manually graded answer”功能的code block,此code block會經由手動

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

20

的方式進行測試並評分。選擇”Autograded answer”功能的code block,表示此code

block已經進行過測試,不須再做測試,可直接輸入評論。選擇”Autograder tests”功能

的code block,此code block會進行自動測試和自動評分。選擇”Read-only”功能的code

block,此code block不做測試,只用純文字呈現。

圖 7 程式編輯器

且不論以手動或自動的方式來進行測試,最後會完整顯示各組code block的得分情

況,並針對各組code block列出詳細的測試結果,與批改者的評語,如圖8所示。所

有學生的作業評量結果將會儲存在本地端的資料庫,儲存資訊包括:作業名稱、作

業實際繳交日期、截止日期、學生姓名、電子信箱、總得分等資訊,如圖9所示為

資料庫存放的資料欄位。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

21

圖8 測試結果

圖9 作業評量結果

2. 於測試和評分階段時,如果code block的功能是被設定為“Manually graded answer”選

項,則此code block需要人工手動作批改評分。如果code block的功能是被設定為

“Autograded answer”選項,則不會進行批改和評分。如果code block的功能是被設定

為“Autograder tests”選項,則會進行自動測試,完畢後產生分數,老師可親自檢閱這

些code block,判斷其分數是否正確、合理,並斟酌作調整。並且該code block有“Full

credit”和“No credit”兩種選項,可快速選取。旁邊的數字方塊也可供老師做分數上的

調整。此外,於code block內,每個“assert”字詞代表一組判斷式,也就是一組測試,

需要通過全部的測試,才能獲得該code block的分數。如果code block的功能是被設

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

22

定為“Read-only”選項,則此code block只能瀏覽而不能更改,經常用作為題目的說明

解釋部分,如圖10所示為測試和評分階段的實際範例。

圖 10 測試和評分階段

表2顯示的是本研究所研製之工具(以下稱為本系統)與Moodle VPL以及Jupyter

nbgrader 三者之間的優缺點相互比較,因為目前市面上有關於程式作業的管理工

具相當多,所以我選擇平常有使用到的這兩種管理工具做比較。本系統較優於程

式編輯器和自動化產生測試程式碼的部分,尚且不足的部分,將計畫於未來研究

將會逐步加入新功能,以及改善現有的功能項目,例如:各項操作介面的優化、支

援程式作業的交付通知和到期通知,以及程式作業的確認通知等。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

23

表2 本研究所研製之工具與Moodle VPL、Jupyter nbgrader三者工具的優缺點相互比較表

工具

項目

本系統之工具 Moodle VPL Jupyter nbgrader

專案管理 Gradle , Nexus

repository

Moodle server ,

jail server

Nbgrade,

jupyterhub

操作介面 JavaFX 的 操 作 介

面,介面美觀

網頁操作,簡易

介面

網頁操作,介面

美觀

程式編輯器 可選擇編輯器做編

輯,功能豐富

網頁上做編輯,

功能簡易

網頁上做編輯,

功能簡易

支援語言 Java 多語言 Python

test case 自動生成,測試項

目條理分明,容易

閱讀

手動撰寫,簡易

測試,容易閱讀

手動撰寫,測試

項目有限,不易

閱讀

測試報告 資訊豐富、樣式美

基本資訊,簡易

樣式

資訊豐富、樣式

美觀

抄襲偵測 無 有 無

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

24

第 3 章

系統架構與實作

此章節將介紹我們的系統之架構與實作。首先,於 3.1 節系統架構中說明每位角色

(老師、學生、測試人員)在系統架構中所擔任的職責,以及角色彼此的依賴關係。接著,

於 3.2 節闡述系統實作的細節。

3.1 系統架構 整個系統的架構是建立於 Linux(版本為 Ubuntu 17.10)環境下,我們使用 Gradle(版

本為 4.8)作為建構程式作業檔案的工具,以 Java 語言(版本為 Java 8)來設計和撰寫程式

作業,用 VTL(版本為 2.0)模板語言撰寫測試程式的模板。而測試程式為用 Groovy 語言

(版本為 2.4.8)撰寫的 Spock 測試架構(版本為 1.1)。且參照 Spring Boot(版本為 2.0.3)建立

應用程式作為程式作業的發佈平台,供給學生下載程式作業檔案。並選用 Nexus

Repository(版本為 3.9.0)作為遠端儲存庫,用以蒐集學生繳交的程式作業檔案。整個作業

收發的流程,共有三種角色參與,分別為老師、學生、以及測試人員。如圖 11 所示為流

程中的角色關係圖,透過編號從 a 至 e 詳細說明各個角色所執行的內容。

圖 11 作業收發的流程圖

b

e

c

a d

測試人員

作業發佈平台

學生 老師

遠端儲存庫

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

25

首先,老師設計完程式作業的解答後,(a)老師透過輔助上傳介面將程式作業上傳至

教學平台,輔助上傳介面將會執作業的前處理,產生所有作業相關檔案,其中包含提供

學生下載的程式作業。教學平台主要用作存放課程的所有程式作業,提供學生下載作業。

接著,(b)學生透過網路連線至教學平台,並選擇適當的程式作業版本,從教學平台下載

程式作業至學生自己的本機端,學生即可透過慣用的程式編輯器撰寫程式作業。接著,

(c)當學生完成程式作業後,將其上傳至遠端儲藏庫存放。之後(d)測試人員至遠端儲藏庫

提取學生的程式作業,進行正式測試與評量。最後,(e)將正式評量結果上傳至遠端儲藏

庫。接下來,將更詳細說明各個角色的職責內容。

老師: 主要負責設計和發佈課程的程式作業題目和解答。當老師將程式作業題目設

計完畢後,透過輔助作業上傳的介面,可將程式作業進行前置處理,並上傳至老師的作

業發佈平台。之後,老師只需將作業發佈平台的網路位址和程式作業的版本資訊,透過

課堂上課時向修課學生公布即可。附註:老師和測試人員都有權限對遠端的儲存庫作存

取。程式作業的發佈流程如圖 12 所示。

圖 12 程式作業檔案的發佈流程

學生: 主要負責下載程式作業,選擇慣用的程式編輯器撰寫程式作業,寫完作業後,

學生可經過簡易的測試來了解自身的作答情況,最後,學生透過 Gradle 的 upload 上傳

指令,將作業上傳回老師的遠端儲藏庫。首先,學生透過老師的程式作業發佈平台,選

擇修課科目,以及程式作業的版本,並輸入簡單的個人基本資料,包括:學號、姓名等。

輸入完成後即可啟動下載程式作業的程序(檔案為 Gradle 專案的壓縮檔)。壓縮檔在本機

設計程式作業的題目內容

設定題目配分、測試參數等屬性

自動生成測試程式碼

移除程式作業的實作部分

上傳至遠端儲存庫

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

26

端解壓縮後,學生可選擇適當的開發環境,來撰寫程式作業。當完成程式作業後,學生

將其上傳至老師的遠端儲存庫之前,必須經過一連串有序的處理階段,例如:編譯、測

試、打包、發佈等階段。除了測試階段之外,如果於任何階段發生錯誤,將會導致上傳

程式作業出現失敗。於測試處理階段時會產生測試結果報告:一份 summary 檔案(資訊

包含:Specifications 總數 Total Spec、成功數 Passed Spec、失敗數 Failed Spec、成功率

Success rate……等),和個別的 specification 檔案 (資訊包含:總測試個數 Total Features、

總執行時間 Total Time(ms)、失敗個數 Failed Spec、錯誤個數 Errors……等);透過 Gradle

upload 指令,即可將程式作業上傳至遠端的儲存庫(在 Gradle專案的 build.gradle檔案中,

已經設定上傳的網路位址)。有別過去傳統的程式作業繳交方式,需要透過電子郵件,夾

帶程式作業為附件檔案,傳送至老師的電子信箱。老師必須逐一檢查學生的程式作業,

驗證是否能夠正確編譯;再測試程式作業檔案,確認執行結果是否符合預期結果。相反

的,現在透過 Gradle 工具,於學生上傳程式作業前,即能夠防止編譯失敗的程式作業做

上傳,因此確保上傳的程式作業,完全是可執行的程式檔案。不過,學生無法對已經上

傳的程式檔案做修改,如果有任何修改的版本,只能再次上傳程式作業檔案,學生的程

式作業檔案的繳交流程如圖 13 所示。

圖 13 學生的程式作業檔案的繳交流程

測試人員: 為程式作業設計額外的測試程式,對其做進一步的正式評量。測試人員

將存放於遠端儲存的程式作業檔案,進行額外測試。測試結果會產生報表,報表提供全

體修課學生的作業成績分布,以及對各類題型的答對率等資訊。測試結果報表,可協助

從老師的教學平台下載程式作業

於開發環境下撰寫程式作業

執行測試程式上傳至遠端儲存庫

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

27

教師迅速掌握修課學生目前的學習狀況,以利做適當的教學調整。測試人員的程式作業

檔案的測試流程如圖 14 所示。

圖 14 測試人員的程式作業檔案的測試流程

發佈平台: 用來儲存發佈的程式作業檔案,供學生依照修課的課程,選擇合適的程

式作業版本,當學生輸入基本資料後,即可從作業發佈平台上下載程式作業的壓縮檔案

至學生的電腦中。

遠端儲存庫: 使用 Nexus Repository,其用來儲存所有學生上傳的程式作業檔案、

學生的作業評量結果,以及相關套件資源檔案。

從遠端儲存庫蒐集學生的程式作業

選擇學生上傳的作業版本並下載

設定題目配分、測試參數等屬性

執行額外的測試程

顯示測試結果資訊

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

28

3.2 系統實作

3.2.1 輔助作業發佈介面

接下來,將對於輔助作業發佈介面的主要功能作介紹,包括:自動生成測試程式碼、

移除程式作業中的實作部分、啟動作業儲存庫、啟動程式作業發佈平台等功能作介紹。

一開始先介紹自動生成測試程式碼的實作部分。首先,介紹 Apache Velocity,我們

透過 Apache Velocity 的 VTL(Velocity Template Language)模板語言,來撰寫俱有 Spock

測試規格的模板,作為程式碼生成的功能。程式碼中可以錢字號($)為開頭的符號作為變

數,於程式碼生成的過程中會替換成設定好的數值。接著,依照 Spock framework 的規

格去撰寫測試程式碼的模板(Javatemplate.vm),俱有 Spock 測試規格的模板如圖 15 所

示,再使用模板產生器(Apache Velocity)將變數的資料寫進到模板中,最後產生測試程

式碼檔案(JavaSpec.groovy)。接下來,介紹 Spock framework,於 JavaSpec.groovy 檔案

內,每一個 method 擁有相對應的測試程式,測試程式上方會有註解來表示測試的類型、

配分以及測試個數。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

29

圖 15 俱有 Spock 測試規格的模板(template)

測試主要分為三大區塊:setup、expect、where。setup 區塊用作建立測試相關的環境

條件;expect 區塊用來判斷學生的作答和老師的正解是否相符合;where 區塊用作提供

多組測試數據資料。最後,測試程式的報告格式:使用 spock-report 技術,我們定義出

兩個報告格式模板:spec-template2.md 表示個別 Specification 結果以及 summary-

template2.md 表示總覽號(ID),再顯示整份作業的作答概況資訊(總題數、答對題數、答

錯題數以及略過的題數等),接著依序條列出每一題 method 的詳細作答情況(包括:總分、

配分、權重、測試的輸入數據以及題目難易度等)。最後會顯示出整份程式作業的總得分。

於每一道題目(feature)中,可設定 timeout 屬性,以掌控執行測試的最大時間上限。若測

試時間超過所設定的 timeout 數值,則判定該題目(feature)為 failure。同時於整個

Specification 中,也會有 global timeout 參數,藉此掌控整體程式作業的測試時間。接著

說明自動化產生測試程式碼的原理,首先,使用 Velocity 模板語言定義以 Spock 的架構

下,預期產生測試程式碼的格式,例如:函數名稱、測試數據和測試參數的位置、使用

的套件等,接著,假設老師撰寫的程式作業的實作部分都是正確的,於是我們將測試數

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

30

據傳入至老師的函式中,所得的回傳值應該也是正確的答案。因此,我們將測試參數和

測試數據,以及正確的回傳值一併傳進 Velocity 模板中,進而產生出測試程式碼。將來,

於測試學生的程式作業時,我們只需將測試數據傳入學生的函式中,將所得學生的回傳

值和老師的回傳值相比較,就可判斷學生是否答對。

圖 16 程式作業

老師設計的程式作業(舉 HW7Solution2.java 為例)具有許多個 method,method 上方

可用標籤來表示與該 method 有關的資訊,如圖 16 所示,以這個 method 為例,Scores 標

籤的 points 參數表示如果答對這題 method 測試即可獲得 20 分;type 參數表示這題

method 測試為 NORMAL(普通)的題型;Validate 標籤的 number 參數為 3,表示這題

method 測試有 3 組測試項目;ex 參數可放入多組 Ex 標籤的測試數據資料;其中 Ex 標

籤的 dataInt 參數表示可輸入整數值的測試數據;dataString 參數表示可輸入字串值的測

試數據。當老師完成題目試卷後(包括題目和正確的實作),可於每一道題目標記適當標

籤,以賦予題目相關測試資訊。接著,透過 Java Reflection,可獲得程式碼內,所包含的

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

31

各項資訊,包括:標籤(Annotation)的名稱和數值、method 的名稱和個數、method 的引

數和資料型態、以及回傳值的資料型態。因此藉由 Java Reflection 技術而獲得題目的所

有標籤資訊(Scores 標籤和 Validate 標籤),取得這些資訊後,再透過 Apache Velocity 技

術為每一道題目產生相對應,且俱有 Spock 測試架構的測試程式碼。產生測試程式碼的

過程中,於標籤中含有的測試數據,我們將這些測試數據傳入每項函式中,假設函式的

實作都是正確的,函式會回傳正確的輸出資訊,此時,Velocity 可將所有的測試數據和

回傳數值,全部套入我們預先設定的模板中,產生測試程式碼。接著,我們將此測試程

式碼檢驗學生實作的函式,傳入相同的測試數據至函式中,同時也會獲得來自學生的函

式的回傳值,此時只需比較老師的回傳值和學生的回傳值,即可驗證學生的答案是否正

確。最後,老師透過輔助作業上傳的介面,除了自動產生上述的測試程式碼外,還會自

動移除程式作業中每一題函式的實作部分,產生給學生的程式作業檔案,接著將所有產

生的檔案以及相關的套件,一併放置程式作業的發佈平台。

當測試完後接著進行評分,我們納入學生於作答時會出現的各種因素,作為評分的

參考依據,例如學生的失敗數或是測試時間等,於是透過 Java Annotation 技術,我們定

義三種標籤,Scores 標籤、Ex 標籤、Validate 標籤等,藉由以上三種標籤表示評分標準

和測試的相關資訊,標籤資訊詳如表 3 Java Annotation 標籤資訊所示。

首先,介紹 Scores 標籤,共有八項參數,除了 partial 為布林參數外,每一項參數都

為浮點數的資料型態,使用者可依照情況自由挑選作設定,並且我們可為所有的函式測

試做全域(global)的參數設定,亦可針對個別的部分做單獨的參數設定。Scores 標籤的

partial 參數表示只需答對部分的測試項目,即可獲得部分的分數,partial 參數預測值為

false,若 partial 參數為 true,我們定義 failures 和 errors 兩個參數分別代表測試項目的

結果為 failure 和 error 的情況時,所需要分別扣的分數值,此時,依照每題測試的配分

扣除失敗和錯誤的測試項目的分數,即為該題測試的得分,failures 參數的預設值為 0,

errors 參數的預設值為 0。於此說明測試失敗表示程式的執行結果和預期結果相比較是

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

32

不符的情況,例如執行結果為 6,而預期結果為 8,則此項測試為測試失敗;而測試錯

誤表示出現程式的編譯問題,或者出現 Exception 的例外情況,例如學生的函式呼叫,

於陣列的計算中出現 OutOfBoundException 或是 NullPointerException 等,則此項測試為

測試錯誤;若 partial 參數為 false,表示學生需要答對每一組的測試項目,才能夠獲得該

題測試的所有分數,不過我們也可慮一些極端的情況,例如該題測試有五項測試項目,

若學生僅答錯一組測試項目,則無法獲得該題測試的分數,於是我們思考從測試項目的

角度幫學生做調分,若學生的測試項目的成功率越高,則調分就越高,我們定義 caseRate

參數表示依照測試項目的成功率的獎勵分數,caseRate 預設為 0,例如 caseRate 假設為

5,若學生僅答對五項測試項目的其中一項,則,該題獲得 1 分的調分。我們也考慮到

整份程式的測試時間,若學生的函式的執行相當有效率,則我們給予調分,所以定義 time

參數表示預估的測試時間,以秒為單位,預設值為 0,若實際的測試時間比預期的測試

時間要短,則可獲得較高的分數,例如預估的測試時間為 20 秒,實際的測試時間為 10

秒,同時我們也定義 factor 參數作為調整分數的倍率,預設值為 1,計算的公式如:

預估測試時間

實際測試時間 x factor 等於是 20

10 x 1,最後會獲得 2 分;接著,我們考量到即使學生沒

有答對任何一題的測試,也會有最低的基本分數,所以定義 baseScore 參數,預設值為

0;而於每一組測試項目會有個執行測試的時間上限,為了避免過長的執行時間的等待,

定義 timeout 參數表示每組測試項目的最長時間,若任何的測試項目超過設定的時間,

則該項目的測試會被判定為失敗(fail),並且終止該項測試而輪到下一項作測試;我們定

義 type參數供老師選填題目的難易程度,可輸入NORMAL、EASY、HARD、DIFFICULT,

預設值為 NORMAL;每一題目也定義 points 參數表示試題的配分,預設值為 5。接下

來介紹 Ex 標籤,標籤存放每組測試數據的資料,其中的 dataInt 參數用來表示整數的輸

入資料,dataString參數表示字串的輸入參數,describe參數表示對該測試的描述。Validate

標籤記錄該試題的測試資訊,其中的 number 參數表示該試題俱有幾筆組測試資料,預

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

33

設值為 5,代表該試題含有五組測試;ex 參數存每組的測試數據,沒有預設值;datafile

參數為外部的測試數據檔案,若題目(method)中有需要手動輸入(input)測試數據,則匯

入測試數據檔案,檔案內的每一列作為一組的測試數據,依序匯入測試程式中,進而模

擬人工手動輸入參數的方式達到測試的目標。

表 3 Java Annotation 標籤資訊

項目 標籤

參數 說明 範例

Scores partial 測試為部分評分,預

設為 false partial = false

failures 每項測試失敗的扣

分,預設為 0 failures = 1

errors 每項測試錯誤的扣

分,預設為 0 errors =2

caseRate 依照測試項目的成功

率的加分,預設為 0 caseRate = 0

baseScore 額外的加分,預設為0 baseScore = 5

time 預估的測試時間,預

設為 0 time = 8

factor 測試時間的調分權

重,預設為 1 factor = 2

timeout 每項測試的上限時間

(秒) timeout = 3

type 標示題目所屬類型

(NORMAL、EASY、

HARD、DIFFICULT,預設為 NORMAL)

Type.DIFFICULT

points 題目配分,預設為 5分

points = 5

Validate test 函式是否要測試,預

設為 true test = false

number 測試組數,預設值為3 number = 3

ex 測試的數據輸入 @Ex(…)

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

34

3.2.2 程式作業發佈平台

透過改寫 Spring Initializr 的開源程式碼[51],來實作程式作業發佈平台。首先,Spring

Initializr 有以下五種模組:initializr-generator、initializr-web、initializr-actuator、initializr-

docs、initializr-service。接下來,我將說明這五種模組分別代表的功能,以及如何調整成

符合我們需求的程式作業發佈平台。

首先,initializr-generator 模組提供專案生成的函式庫,換句話說,此模組提供生成

程式專案的一切所需要的元件和檔案。因此,我們將測試程式碼、作業程式碼、gradle 的

建構檔案(build.gradle),以及相關檔案一起放進 initializr-generator 模組內,而在模組內,

我們會依據作業檔案的課程和作業版本資訊來分門別類,存放於不同的資料夾。接下來,

initializr-web 模組為提供 REST 端點和 Web 介面的設定,我們修改 home.mustache 檔案,

為 Web 介面擴充作業版本的欄位,以及修改各項輸入欄位的預設值。接著,initializr-

actuator 模組為提供項目生成的統計數據和指標,不過這個模組我們不做任何的修改。

接下來,initializr-docs 模組為提供文檔,預設是不啟用,但可以於 IDE 開發環境中來啟

動這個模組,不過這個模組我們不做任何的修改。最後,initializr-service 模組為提供平

datafile 測試的檔案輸入 datafile = "/file/data.txt"

Ex dataString 字串型態的測試數據 dataString = {"abc"}

dataInt 整數型態的測試數據 dataInt = {50}

dataChar 字元型態的測試數據 dataChar = {"b"}

dataFlo 浮點數型態的測試數

據 dataFlo = {50.0}

dataDou 雙精度型態的測試數

據 dataDou = {50.0}

describe 該測試試題的描述 describe = "example"

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

35

台的屬性設定檔,我們修改 application.yml 檔案,為發佈平台增加作業版本的屬性欄位

(hwNum),application.yml 檔案如圖 17 所示。

圖 17 application.yml 設定檔

學生從作業發佈平台所下載的程式作業檔案,並不會帶有任何程式的函式實作部分,

只有題目和測試程式(test case)。學生可選擇在合適的開發環境下撰寫程式作業。完成作

業後,執行 Gradle 的 test 指令,test 指令會呼叫 Spock 執行測試程式,即可比較學生和

老師的輸出資訊。透過每一道題目的配分以及適當的調分機制,加總學生的分數,學生

可獲得程式作業的預估分數。最後,學生執行 Gradle 的上傳指令”upload”,上傳程式作

業到遠端儲存庫,學生不需要煩惱該如何交付程式作業,因為遠端儲存庫的網路位置已

經預先定義在作業的設定檔中。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

36

3.2.3 輔助作業測試介面

測試人員(包括:老師、助教等)將蒐集回來的作業再做額外的測試,以及做正式的

評分,系統亦能夠產生所有學生的作業成績報表。成績報表結果(json 檔案)可用於公布

於老師的教學網站中,提供給老師與學生檢閱。

計算學生的程式作業成績:每項 Spec 測試類別會包含多道題目。每道題目都設定

有該題的配分以及多筆測試項目。全部測試完畢後,每項 Spec 測試類別會含有各種屬

性資料,包含成功數(Passed Feature)、失敗數(Failed Feature)、成功率(Success rate),總

得分數(Total)。透過以上各種屬性,可作為題目(Feature) 計算得分的基礎依據,進而在

總分的統計上擁有更靈活的使用。於測試階段中,如果學生的該項題目於執行時拋出例

外情況(exception),會被判定為錯誤情況(error condition)。錯誤情況可能會發生於程式未

順利通過編譯、存取檔案發生失敗,以及其他非邏輯判斷上所發生的例外情況。如果是

在邏輯判斷上發生不相符的情形,則會被判定為失敗情況(failure condition),通常會發生

於比較學生和老師的程式輸出結果,透過比較兩者的輸出結果。如果判定兩者相等,則

學生的作答正確;反之,則學生的答案錯誤。

我們透過改寫 Spock Report[52]的開源程式碼,實作符合評量標準的測試報告。於分

數計算中,修改和增加評量的規則屬性,除了每道題目(method)的分數(points)外,尚

有”partial”、”time”、”baseScore”、”caseRate”、”factor”、”timeout”等參數,各參數介紹請

詳閱 3.2.1 輔助作業發佈介面的標籤資訊。

為了更詳述整個評分的流程,以 Java 語言的程式作業為例,總共有五題函式測試,

每一題測試標有配分,並有三組測試項目,測試的評分參數設定是 partial 為 true、failures

參數為 1、errors 參數為 2、time 參數為 20、factor 為 1、timeout 參數為 3、baseScore 為

40。當計算學生的作業成績時,依照通過多少筆組數的測試項目,給予部份分數。以下

為一個情境作範例,假設有三題函式的測試,全部測試共花 10 秒,如圖 18 所示,學生

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

37

答對第一題函式的全部測試項目,可獲得 8 分,而於第二題函式的測試中,答錯兩個測

試項目,依照評分參數,每項失敗的測試項目扣 1 分,所以學生於這題函式測試獲得 4

分,於第三題函式的測試中,各出現一組失敗和錯誤的測試項目,依照評分參數,學生於

這題函式測試獲得 7 分,接著,仍需要做分數的調整,總分的計算為每題原始分數的加

總,加上 time 參數的部分得 2 分,再加上 baseScore 參數的部分得 40 分,學生最後可

得(8+4+7) + 2 + 40 等於 61 分。

圖 18 函式的測試

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

38

第 4 章

介面操作流程與展示

此章節主要說明介面的操作流程和介面的操作展示。首先,於 4.1 節說明介面操作

流程,藉由流程圖可清楚掌握每個步驟所執行的任務項目。接著,承續 4.1 節的內容於

4.2 節說明介面操作展示,進一步展示在各個步驟中,更詳細的介面操作的細節和注意

事項。

4.1 介面操作流程

首先,說明輔助作業上傳的介面操作流程,當老師順利啟動上傳的介面後,依照如圖

19 的操作流程,即可將程式作業上傳至作業發佈平台。

圖 19 程式作業的發佈流程

接著,說明學生從程式作業發佈平台的下載流程。當學生經由網路連線至作業發佈

平台後,依照以下的操作流程,即可從發佈平台下載程式作業檔案,作業檔案預設為

Gradle 專案的壓縮檔。

選擇課程和作業版

開啟欲發佈的程式檔案

設定屬性和測試數

產生測試程式碼

移除程式作業中的實作部分

啟動作業儲存庫

啟動作業發佈平台

程式作業發佈成功

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

39

圖 20 程式作業的下載流程

接下來,說明輔助作業測試的介面操作流程,當測試人員順利啟動作業測試的介面

後,依照以下的操作流程,即可從作業儲存庫下載程式作業,對每一份程式作業進行測

試,測試結果將以網頁格式作公佈。

圖 21 程式作業的測試流程

選擇課程和作業版本

連線至作業儲存庫並取得所有作業的清單

選擇學生的作業版本

下載所有學生的作業檔案

選擇程式語言和作業版本

輸入課程名稱、學生ID、

姓名

依需求選擇相關的套件

下載程式作業檔案

設定測試數據和參數

進行測試並產生測試報告

進行校對和確認

公布成績結果

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

40

4.2 介面操作展示

4.2.1 輔助作業發佈介面

為了使老師能夠更便捷的將作業發佈至平台上,本研究對於老師的部分,設計一個

輔助作業上傳的操作介面,能夠協助老師完成多項上傳的設定,包括:選擇課程、選擇

作業版本、挑選欲測試的項目等,以及啟動 Nexus Repository 儲存庫和作業發佈平台。

接下來,會對於該操作介面的各項功能設定,做更詳細的介紹。輔助上傳作業的操作介

面,如圖 22 所示。

圖 22 輔助上傳作業的操作介面

若使用者對於操作介面有任何疑問,可點選操作介面的右上角”help”按鈕,即可開

啟介面操作流程的提示畫面。提示內容簡單介紹程式作業的上傳流程,共分為八個步驟:

第一步驟和第二步驟,選擇課程名稱和作業版本;第三步驟,選擇欲發佈的程式作業,

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

41

作業內容包含題目的問題部分和實作部分;第四步驟,從程式作業當中選擇欲執行測試

的題目項目,和設定欲測試的數據;第五步驟,根據上一步驟所做的設定來產生測試程

式;第六步驟,移除程式作業中的實作部分;第七步驟,啟動 Nexus Repository 儲存庫;

第八步驟,啟動作業發佈平台,並將處理過的程式作業上傳至發佈平台。介面操作流程

的提示畫面如圖 23 所示,接下來會更詳細介紹每一步驟的操作內容。

圖 23 介面操作流程的提示畫面 於開始前的準備階段,老師需要準備程式作業檔案,檔案內容包含題目的問題內

容和實作的部分,並且在實作的部分添加特殊的 Java annotation 標記,標記為一組成對

的符號”//@hwstart”和”//@hwend”,程式的實作部分會於接下來的處理時,藉由特殊標

記的協助,來移除實作的部分,程式作業範例(HW7Solution.java)如圖 24 所示。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

42

圖 24 原始程式作業

完整的作業上傳流程,總共有八個步驟。首先,在使用者開啟輔助作業上傳的操作

介面後,第一步驟,挑選課程名稱,目前有 java、kotlin、xml 等三種選項,預設值為 java

課程,如圖 25 所示。第二步驟,可填入任意程式作業的版本資訊,例如:2、5 等,預

設值為 1,如圖 26 和圖 26 所示。經由以上兩個步驟的設定,透過課程名稱和作業版本

的資訊來識別一件程式作業。

圖 25 課程選取項目

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

43

圖 26 程式作業版本資訊

第三步驟,選擇於一開始已經預先準備的程式作業檔案(HW7Solution.java),選擇程式作

業檔案(HW7Solution.java)後,會即時於操作介面上顯示狀態資訊,如圖 27。

圖 27 當前介面的狀態資訊

接著,第四步驟,點選”Config”按鈕來設定測試數據及分數,點選按鈕後會顯示各

個題目的名稱,每道題目都能夠設定配分、難度類型,以及是否要進行測試,如圖 28 所

示,若要進行測試,則還需要依照該題目的參數類型和參數個數,填入相對應的測試數

據,預設的測試組數為三組,可點選按鈕”New Exam”增加額外的測試組數,最多為五組

測試組數。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

44

圖 28 作業的測試項目設定

緊接著,第五步驟,透過上一步驟設定的測試數據,以及程式作業的實作部分,點選介

面中的”Generate”按鈕,為程式作業自動產生測試程式碼,測試程式碼如圖 29。

圖 29 測試程式碼範例

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

45

第六步驟,點選操作介面的”Remove”按鈕,移除程式作業中的實作部分。透過程式作業

所使用的特殊 Java annotation 標記,我們可經由此特殊的標記來獲得實作部分的範圍,

進而能夠移除實作的部分,移除程式碼實作部分的結果如圖 30 所示,於每道題目(method)當中的程式碼將全被移除,僅顯示”place your code here”的提示作答的提醒。此外,若該

題目需要作測試,則於題目的上方會顯示關於測試的相關資訊,包括題目的配分、測試

的數據等。於最上方的作業名稱(HW7Solution2),會被標註整份程式作業的評分方式與

額外的增減分,包括:是否為部份給分,意即若答對部分測試,仍有部份分數;若有測

試失敗或錯誤,可額外扣分;可依據測試時間長短,做加分調整。

圖 30 移除實作部分的程式作業

第七步驟,啟動 Nexus 儲存庫,啟動的過程需要約莫 200 秒的時間,同時,於操作介面

會即時顯示目前狀態資訊,如圖 31 所示,啟動完成後,透過瀏覽器使用 Nexus 的介面,

圖 31 當前介面的狀態資訊

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

46

如圖 32 所示。第八步驟,啟動程式作業的發佈平台,啟動的過程需要約莫 250 秒的時

間,啟動完成後,透過瀏覽器操作平台,如圖 32 和圖 33 所示。

圖 32 Nexus Repository 儲存庫

圖 33 程式作業發佈平台

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

47

4.2.2 程式作業發佈平台

作業發佈平台如圖 34 和圖 35 所示,首先由學生選擇作業的專案類型(俱有 Maven

和 Gradle 兩種選項,預設為 Gradle)、選擇課程語言(預設為 java)、Spring Boot 版本(預

設為 2.0.3),接著,學生於下方欄位填寫課程名稱(Course Name,預設為 course.java)、

學生的學號(Student ID,預設為 s103753027)、學生的姓名(Name,預設為 Harry)、

Description(預設為 hw for course)、Package Name(預設為 course.java.s103753027),以及

選擇需要的 dependedcy 套件,這部份我們需要選擇 Junit 和 Spock 套件。

圖 34 Homework Initializr 網站(一)

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

48

圖 35 Homework Initializr 網站(二)

當學生填選完基本資料後,按下"Generate!!"按鈕,網站會將學生所輸入的資料傳入

系統,產生具有此學生的獨特身分識別,且唯一的程式作業,作業檔案是一件 Gradle 專

案的壓縮檔,壓縮檔的檔名為學生的學號。

圖 36 作業壓縮檔下載的對話方塊

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

49

此時,學生即可進行下載,Homework Initializr 網站如圖 36 所示。將壓縮檔

s103753027.zip 解壓縮後,即可得到 Gradle 專案的檔案內容,Gradle 專案的檔案內容如

圖 37 所示。

圖 37 Gradle 專案的檔案內容

依照專案的結構目錄,可以找到預設的主程式 Java 檔案(HW7Solution2.java),結構

目錄如圖 38 所示。

圖 38 專案的結構目錄

開啟 HWSolution2.java 檔案,可以發現在程式碼開頭的部分,用註解標示有課程名稱

為:course.java、學生的學號為:s103753027、學生姓名為:Harry。學生的識別資料會

出現在所有檔案中,文件的開頭處,HW7Solution2.java 檔案內容如圖 39 所示。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

50

圖 39 HW7Solution2.java 檔案內容

圖 40 build.gradle 檔案內容

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

51

學生可選擇合適的編輯器來撰寫程式作業。這裡舉用 eclipse 開發環境為例,透過點選工

具列”file” 再選擇”import”,從對話視窗選擇”Gradle”,再選擇 “Existing Gradle Project”,

最後選擇 Gradle 檔案專案的路徑,即可匯入程式作業至 eclipse 中。

圖 41 eclispe 功能選單

圖 42 匯入 Gradle 專案

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

52

程式作業有兩種繳交方式:(1)學生透過 gradle 上傳至程式作業的儲存庫。此方法為

目前所選用的方式。(2)學生透過 e-mail 夾帶附加檔案(程式作業)寄至老師的信箱,老師

再將收到的附加檔案上傳至程式作業的儲存庫。

圖 43 JavaSpec 測試結果概略(一)

當學生完成程式作業時,即可透過啟動程式測試項目,來檢驗自己的答題情況。當

程式測試結果完成後,於每一項 Specification 會出現如圖 43 所示。於測試結果概略的報表

中,開頭顯示程式測試時間,條列出答對比率、答錯題數、執行時間以及得分等資訊。接著,會

詳盡顯示各題目的作答情況,包括:每道題目所使用的測試數據、測試的預期結果以及測試的

執行結果(PASS or FAIL),如圖 44 和圖 45 所示。最後,會顯示每一個 Specification 項目的

概略結果,進而統整出一份最終的測試結果數值,包括:通過和不通過的 Specification

個數、通過率以及總得分等資訊,如圖 46 圖 47 和圖 47 所示。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

53

圖 44 JavaSpec 測試結果概略(二)

當學生能夠順利地完成測試流程,來產生測試報表,便可透過測試報表了解本身的學習

概況。接著,學生便可將程式作業上傳至遠端的儲存庫。

圖 45 JavaSpec 詳細測試結果(一)

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

54

圖 46 JavaSpec 詳細測試結果(二)

圖 47 全部測試結果的資訊一覽表

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

55

4.2.3 輔助作業測試介面

本節介紹輔助作業測試介面,此介面將協助測試人員,透過參數的設定,簡易的設

定步驟,能夠以自動化的方式大量批改程式作業,輔助作業測試介面如圖 48 所示。

圖 48 輔助作業測試介面

首先,開啟輔助作業測試介面後,需先選擇課程類別和作業版本,目前課程類別的

選項有 java、kotlin、xml 等,預設為 java,而作業版本則需輸入版本編號。接下來,點

擊”Connect”按鈕來連接 Nexus Repository,查詢儲存庫中符合該課程類別和作業版本的

所有作業檔案,若無相關搜尋結果,則於下方的資訊欄中顯示”Connect Fail”;反之,則

顯示每一筆學生的學號,以及對應的最新繳交的作業版本編號,編號為繳交日期和時間

所組成的號碼,如圖 49 查詢作業儲存庫的結果資訊所示。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

56

圖 49 查詢作業儲存庫的結果資訊

以上所列出的每一位學生的作業版本,預設都是顯示最新上傳的版本,若測試人員

需要挑選該學生的過去上傳的作業版本,可選擇性點擊”Exception”按鈕,會顯示出新的

操作畫面,畫面羅列出每一位學生上傳的所有作業版本,測試人員可勾選欲測試的作業

版本,來取代原本預設的版本,如圖 50 學生的程式作業的版本挑選所示。

圖 50 學生的程式作業的版本挑選

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

57

接下來,點擊”Download”按鈕,即可依照上一個步驟的清單設定,從作業儲存庫中下載

所有的程式作業檔案,檔案為已經完成 Java 編譯的 jar 壓縮檔,檔名為每位學生的學號。

接著,於測試之前點擊”Config”按鈕來設定測試數據及分數,點選按鈕後會顯示各個題

目的名稱,每道題目都能夠設定配分、難度類型,以及是否要進行測試,若要進行測試,

則還需要依照該題目的參數類型和參數個數,填入相對應的測試數據,如圖 51 作業的

測試項目設定所示。

圖 51 作業的測試項目設定

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

58

當完成以上的所有設定後,就可點擊”Run Test”按鈕以進行程式檔案測試。於完成測試

後,會為每一位學生產生相對應的資料夾,資料夾內包含測試的結果報告,包括三份檔

案:aggregated_report.json、index.html、JavaSpec.html 等。

圖 52 測試結果報告 接著,點選操作介面的”Show Result”按鈕,會顯示每件程式作業的測試結果,包含分

數、失敗數、錯誤數、成功率和執行時間等,測試結果如圖 53 所示。

圖 53 簡易測試結果報告

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

59

第 5 章

結論與未來研究方向

5.1 結論

於目前市面上有許多程式作業的處理系統,例如:Moodle VPL、Jupyter nbgrader,

不同的系統有各自的優點,但是這些系統都需要使用者於網路環境中撰寫程式作業,然

而,他們的系統往往提供較簡易的程式編輯環境、除錯工具以及套件支援。因此,對於

使用者尚需要時間去習慣新的程式編輯環境,會延長完成程式作業的時間。此時,如果

能夠使用自己習慣的程式編輯器或開發工具(例如:Eclipse、NetBeans、IntelliJ 等),對使

用者來說有相當大的助益。此外,使用者撰寫程式作業的測試程式碼,仍需要耗費相當

多的寶貴時間,且測試程式碼的行數通常數倍於一般程式碼,不僅維護不易,還缺乏調

整的彈性。最後,程式作業的成績計算方式,同樣也較缺乏彈性,大部分的工具只有加

總每道題目的得分,對於其他引響得分的因素沒有特別的著墨與研究。

有鑑於市面上的工具的不足,本論文研究提供一套系統,結合程式作業的處理能力,

以及提供學生自由選擇慣用編輯器的權利,並且繳付作業時,能透過一道 Gradle 的指令

將作業上傳至遠端儲存庫,儲存庫的網路位址已經預先設定於作業的設定檔中。此系統

不僅能自動產生測試程式碼,還能夠自動化的處理繁瑣的作業批改工作,為老師節省大

量寶貴的時間。根據測試後的結果,我們提供更具有彈性的作業成績的計算方式,計算

並加總每道題目的得分,進而產生詳細的報告結果,報告的內容能協助老師清楚掌握學

生的學習概況,同時,學生也獲得立即的回饋,訂正錯誤,增進學習效果。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

60

5.2 未來研究方向

在目前學習電腦科學的浪潮下,不論是學校的正規教育,亦或是補習班的講學,欲

學習程式語言的學生與日漸增。於教學上,老師將面臨大量學生繳交的程式作業,若可

透過業界的自動化測試工具來批閱作業,將可節省老師寶貴的時間和精力。在未來,將

持續研究更合適的自動化測試工具,應用於管理程式作業的領域上。

目前此系統於程式的測試能力方面,尚且還能更加地提升,目前只支援 Java 程式語

言的作業項目,計畫日後也能支援 Kotlin、Groovy 等,與 Java 類似的程式語言。而現有

的測試欄位僅能接受整數、浮點數、字串、字元等 primitive 的資料型態,於未來的規畫

方面,尚且能擴充接受其他類型的資料型態,例如:Array、Map、List 等資料型態的判

斷。除了需要提升程式的測試能力之外,尚且能增添作業管理的相關功能,例如:程式

作業的收付確認通知,與作業的逾期通知、作業相似度的比較(作用於偵測作業抄襲)。

於系統的介面設計方面,尚且需要調整操作流程與排版,提供使用者更直覺的操作

環境。希望此工具不僅能提供技術上的協助,更能結合美術上的版面設計,為使用者營

造更好的操作體驗。

此研究之工具,目標於未來也能夠與市面上的程式作業管理系統作整合,例如與

Moodle VPL。

以上所提到的未來方向,能使工具更加臻至完美,是我們日後要持續努力的目標。

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

61

參考文獻

[1] Hiroki Kitaya and Ushio Inoue,“An Online Automated Scoring System for Java

Programming Assignments.”in International Journal of Information and Education

Technology, Vol. 6, No. 4, April 2016.

[2] Caiza J. C. and Del Alamo J. M. ,“Architecture to Support Automatic Grading Processes in

Programming Teaching" in Revista Politécnica - Vol. 36, No. 1, Septiembre 2015.

[3] Sumit Gulwani, Rishabh Singh, Armando Solar-Lezama, “Automated Feedback

Generation for Introductory Programming Assignments”,in ACM SIGPLAN Conference

on Programming Language Design and Implementation (PLDI 2013), pages 15–26, in

June 2013.

[4] Vreda Pieterse,“Automated Assessment of Programming Assignments”in ResearchGate

conference paper,April 2013.

[5] Juan C. Rodríguez-del-Pino, Enrique Rubio-Royo, Zenón J. Hernández-Figueroa, “A

Virtual Programming Lab for Moodle with automatic assessment and anti-plagiarism

features”, in Departament of Informática y Sistemas University of Las Palmas de Gran

Canaria , Conference Paper , January 2012.

[6] Dominique Thiébaut ,“Automatic evaluation of computer programs using Moodle's virtual

programming lab (VPL) plug-in” , in Journal of Computing Sciences in Colleges , Volume

30 Issue 6, pages 145-151 , in June 2015.

[7] Arcuri, J. Campos, and G. Fraser, “Unit Test Generation During Software Development:

EvoSuite Plugins for Maven, IntelliJ and Jenkins”,in IEEE International Conference on

Software Testing, Verification and Validation (ICST), 2016, pages 401-408.

[8] Maven. Retrieved March (2018). From https://maven.apache.org/

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

62

[9] Gradle. Retrieved March (2018). From https://gradle.org/

[10] Ant. Retrieved March (2018). From:https://ant.apache.org/

[11] Sbt. Retrieved April (2018). From:https://www.scala-sbt.org/index.html

[12] Gulp. Retrieved April (2018). From:https://gulpjs.com/

[13] SCons. Retrieved April (2018). From:https://scons.org/

[14] CMake. Retrieved April (2018). From:https://cmake.org/

[15] Grunt. Retrieved April (2018). From:https://gruntjs.com/

[16] Gradle v.s. Maven Comparison:https://gradle.org/maven-vs-gradle/

[17] Nexus Repository. Retrieved May (2018). From https://www.sonatype.com/nexus-

repositor y-sonatype

[18] NPM. Retrieved May (2018). From https://www.npmjs.com/

[19] Docker. Retrieved May (2018). From https://www.docker.com/

[20] NuGet. Retrieved May (2018). From https://www.nuget.org/

[21] IntelliJ. Retrieved May (2018). From https://www.jetbrains.com/idea/

[22] Hudson. Retrieved May (2018). From http://hudson-ci.org/

[23] Jenkins. Retrieved May (2018). From https://jenkins.io/

[24] JavaFX . Retrieved May (2018). From http://www.oracle.com/technetwork/java/javase/o

verview/javafx-overview-158620.html

[25] JavaFX Scene Builder . Retrieved July (2018). From https://www.oracle.com/technetwor

k/java/javase/downloads/javafxscenebuilder-info-2157684.html

[26] 單元測試 Unit Testing . Retrieved May (2018). From https://en.wikipedia.org/wiki/Un

it_testing

[27] TestNG. Retrieved May (2018). From http://testng.org/doc/

[28] Spock. Retrieved May (2018). From http://spockframework.org/

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

63

[29] Junit. Retrieved May (2018). From:http://junit.org/junit4/

[30] Moodle. Retrieved May (2018). From:https://moodle.org/?lang=zh_tw

[31] Moodle VPL. Retrieved May (2018). From https://moodle.org/plugins/mod_vpl

[32] Specification language. Retrieved May (2018). From https://en.wikipedia.org /wiki/Sp

ecification_language

[33] Execution server(vpl-jail-service) . Retrieved May (2018). From

http://vpl.dis.ulpgc.es/index.php/support/2014-09-27-15-06-22/40-how-to-install-vpl-jai

l-system

[34] Jmock. Retrieved May (2018). From http://www.jmock.org/

[35] Rspec. Retrieved May (2018). From http://rspec.info/

[36] Groovy. Retrieved May (2018). From https://zh.wikipedia.org/wiki/Groovy

[37] BDD(Behavior-driven development) https://en.wikipedia.org/wiki/Behavior-driven_dev

elopment

[38] C#. Retrieved May (2018). From https://en.wikipedia.org/wiki/ C_Sharp_(programming

_language)

[39] Ruby. Retrieved May (2018). From https://www.ruby-lang.org/zh_tw/

[40] Scala. Retrieved May (2018). From https://zh.wikipedia.org/wiki/Scala

[41] nbgrader. Retrieved May (2018). From https://nbgrader.readthedocs.io/en/stable/

[42] Apache Velocity. Retrieved May (2018). From http://velocity.apache.org/

[43] FreeMarker. Retrieved May (2018). From https://freemarker.apache.org/

[44] Jamon. Retrieved May (2018). From http://www.jamon.org/

[45] Application Framework. Retrieved May (2018). From http://www.dotspace.idv.tw/Fram

eworks.htm

[46] Vert.x. Retrieved May (2018). From https://vertx.io/

DOI:10.6814/THE.NCCU.CS.007.2018.B02

‧國

立政 治

學‧

Na

t iona l Chengch i U

niv

ersi t

y

64

[47] JSF(Javaserver Faces) . Retrieved May (2018). From http://www.oracle.com/ technetwor

k / topics/index-090910.html

[48] IoC ( Inversion of Control) . Retrieved May (2018). From https://en.wikipedia.org/wiki/Inv

ersion_of_control

[49] AOP ( Aspect-oriented programming ) . Retrieved May (2018). From https://en.wikipedia.org/

wiki/Aspect-oriented_programming

[50] Spring framework. Retrieved May (2018). From https://projects.spring.io/spring-boot/

[51] Spring Initializr. Retrieved May (2018). From https://github.com/spring-io/initializr

[52] Spock Report . Retrieved May (2018). From https://github.com/renatoathaydes/spock-reports