自動化測試工具(基於WordCount作業)

本自動化測試的程式用於自動化測試WordCount作業,採用Java開發(基於jdk1.8+),基於Maven來管理項目。

支援的語言和開發進度

語言 進度
Java 已測試並投入運行
C++ 開發完畢,待測試
Python 開發中
NodeJS 待開發

實現的功能

克隆項目

從指定倉庫克隆項目,由於訪問Github的網路經常不穩定,也支援我們先預備好項目的倉庫,不從Github實時下載。

生成測試數據

  • 可以生成指定長度的隨機ASCII碼字元串
  • 可以將我們指定長度的測試數據寫入指定位置的指定數量的文本文件中,這些文本文件將作為後續的測試用例文件。

編譯

這裡的編譯和以下的運行都是有如下兩個前置要求:

  1. 作業中必須明確要求入口文件的文件名是什麼,以Java為例,就是Main方法所在的類文件的文件名是什麼,以WordCount作業為例,我們要求學生的主函數必須定義在src目錄下一個名叫WordCount.java文件中,因為這樣我們才知道要運行哪個文件來執行測試用例。
  2. 助教在自己機器上運行的時候,必須要有對應語言的編譯和運行的環境且要規定好一致的語言版本。否則編譯這一關會有很多問題導致無法運行學生的程式碼。

編譯時候會設置對應的超時時間,不同的語言可以設置不一樣的編譯超時時間,以Java為例,默認編譯超時時間是5秒鐘

運行

見編譯部分提到的兩點要求。

運行的時候也會設置對應的超時時間,不同的語言針對不一樣的測試用例可以設置不一樣的運行時間,超過這個時間,會直接將學生這個用例的耗時數設置為-2,-2表示耗時的記錄。

評分

  • 每個用例的得分以及匯總得分
  • 執行每個用例的耗時

註:我們統計的耗時是運行部分的耗時,不包括編譯的耗時。

導出結果到CSV

  • 分數
  • 耗時
  • Git提交記錄
    • 提交次數
    • 每次提交的commit資訊

效果預覽

其中:

StudentNo: 表示學生學號的後五位

Score:匯總分數,即Score1 + Score2 + … + Scorei 之和

Scorei:表示第i個用例的得分

Timei:表示第i個用例的耗時

commit_times:表示每個學生的提交次數

commit_details:表示每個學生的提交資訊,JSON格式

使用方式

目前沒有將項目打包,還是以源碼的方式運行,主要是方便調試和改程式碼,後續會完善打包運行。

我們必須先規定好測試程式碼的位置,以WordCount項目為例,所有同學的程式碼都以學號命名收集到如下倉庫中:

//github.com/kofyou/PersonalProject-Java.git

目錄結構為:

PersonalProject-Java

  • 學號1
    • src
      • WordCount.java
  • 學號2
    • src
      • WordCount.java
      • Lib.java
  • 學號3
    • src
      • WordCount.java

克隆程式碼

git clone //github.com/GreyZeng/WordCountAutoTest.git

克隆完畢後,用Jetbrains IDEA 打開文件WordCountAutoTest,並且在WordCountAutoTest下新建download文件夾,如下圖:

在download文件夾下新建一個judge文件夾,裡面放對數程式,這個對數程式的目的就是,把測試用例的答案算出來,

這個對數程式要保證正確!!!最好多個助教一起做一下題目,然後互相驗證沒問題了,在把對數程式放上去

PS:對數程式請不要提交到Github,防止學生抄襲!

如上圖,我放了一個對數程式WordCount.java

關注並確認Client.java類中的如下幾個參數,其他參數可以參考注釋進行修改,一般不需要改:

參數名稱 備註
NEED_CLONE 設置為true,會不斷重試clone程式碼倉庫
CLONE_URL 改成對應的地址,例如://github.com/kofyou/PersonalProject-Java.git
JUDGE_PROGRAM 改成對數程式的絕對路徑地址,例如:”D:\git\WordCountAutoTest\download\judge”
TESTCASE_NUM 默認測試用例的數量,默認10個
TEXT_MIN_LENGTH 測試文本的最少字元數,默認100個字元
TEXT_MAX_LENGTH 測試文本的最大字元數量,默認1000000個字元

修改好配置參數後,直接在IDEA裡面Run Client.java,等待執行完畢即可。

說明:運行的時候,會在之前download的目錄以當前時間戳建一個文件夾,這樣做的目的是保證每次運行不會有文件夾衝突。

執行完畢後,按如下目錄找需要的資訊:

目錄 說明
download/時間戳/cases/ 存放用例的位置
download/時間戳/answers/ 存放答案的位置
download/時間戳/PersonalProject-Java/ 項目目錄
download/時間戳/PersonalProject-Java/學號/output/ 每個學號的學生的執行用例的輸出文件夾
download/時間戳/result/result.csv 本次測評的csv文件
WordCountAutoTest\log 日誌記錄文件夾

待完善的功能

  • Git的每次簽入詳情,程式碼的修改和新增情況。
  • 程式碼雷同部分,嘗試接入moss
  • 防止程式碼裡面修改伺服器文件,惡意運行多執行緒 ,參考Judger

源碼地址

Github