自動化測試工具(基於WordCount作業)
阿新 • • 發佈:2021-03-11
本自動化測試的程式用於自動化測試[WordCount作業](https://edu.cnblogs.com/campus/fzu/FZUSESPR21/homework/11672),採用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資訊
## 效果預覽
![](https://img2020.cnblogs.com/blog/683206/202103/683206-20210311160102326-358774870.png)
其中:
StudentNo: 表示學生學號的後五位
Score:彙總分數,即Score1 + Score2 + … + Scorei 之和
Scorei:表示第i個用例的得分
Timei:表示第i個用例的耗時
commit_times:表示每個學生的提交次數
commit_details:表示每個學生的提交資訊,JSON格式
## 使用方式
> 目前沒有將專案打包,還是以原始碼的方式執行,主要是方便除錯和改程式碼,後續會完善打包執行。
我們必須先規定好測試程式碼的位置,以WordCount專案為例,所有同學的程式碼都以學號命名收集到如下倉庫中:
https://github.com/kofyou/PersonalProject-Java.git
目錄結構為:
PersonalProject-Java
- 學號1
- src
- WordCount.java
- 學號2
- src
- WordCount.java
- Lib.java
- 學號3
- src
- WordCount.java
…
克隆程式碼
```bash
git clone https://github.com/GreyZeng/WordCountAutoTest.git
```
克隆完畢後,用Jetbrains IDEA 開啟檔案WordCountAutoTest,並且在WordCountAutoTest下新建download資料夾,如下圖:
![](https://img2020.cnblogs.com/blog/683206/202103/683206-20210311150843165-514756181.png)
在download資料夾下新建一個judge資料夾,裡面放對數程式,這個對數程式的目的就是,把測試用例的答案算出來,
**這個對數程式要保證正確!!!最好多個助教一起做一下題目,然後互相驗證沒問題了,在把對數程式放上去**。
**PS:對數程式請不要提交到Github,防止學生抄襲!**
如上圖,我放了一個對數程式WordCount.java
關注並確認Client.java類中的如下幾個引數,其他引數可以參考註釋進行修改,一般不需要改:
| 引數名稱 | 備註 |
| --------------- | ------------------------------------------------------------ |
| NEED_CLONE | 設定為true,會不斷重試clone程式碼倉庫 |
| CLONE_URL | 改成對應的地址,例如:https://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](http://theory.stanford.edu/~aiken/moss/) 。
- 防止程式碼裡面修改伺服器檔案,惡意執行多執行緒 ,參考[Judger](https://github.com/QingdaoU/Judger) 。
## 原始碼地址
[Github](https://github.com/GreyZeng/WordCountAu