自動化測試框架
作者:Grey
原文地址:自動化測試工具
自動化測試框架可以用於
- 自動克隆項目
- 編譯項目
- 執行項目
- 評分(需要實現自定義接口)
- 性能測試(需要規定在同一個人的電腦上執行所有同學的程序,否則會因為電腦配置不一樣導致結果不一樣)
- 生成CSV格式報表(需要實現自定義接口)
- 查重(需要申請moss賬戶,且只支持特定的語言:c, cc, java, ml, pascal, ada,lisp, schema, haskell, fortran, ascii, vhdl, perl, matlab, python, mips, prolog, spice, vb, csharp, modula2, a8086, javascript,plsql)
目前,項目代碼已經分好模塊,不僅可以測試WordCount作業,對於固定輸入輸出的個人作業都可以支持,不過有了自動化測試工具,助教還需要做的事情是:
- 作業要求中必須規定好語言版本,如果要支持查重,語言只能限制在moss支持的語言列表中。
- 自己實現一版個人作業作為對數器。
- 自己寫一個程序來自動生成測試數據,因為每個個人作業的要求不一樣,自動化框架無法對每種程序都生成測試數據,目前只支持生成按規則生成隨機的字符串測試集。
- 要制定評分規則(自動化框架已經預留了接口,實現Judge接口即可)
- 制定最后報表的格式(自動化框架已經預留了接口,實現ReportData接口即可)
- 申請一個moss賬號,用於查重,具體可見:Use MOSS On Your Computer- 如何使用MOSS代碼剽竊檢測系統
代碼結構說明
- autotest
- autotest-core
框架核心代碼,預留接口以及擴展點,常用工具類
- app-wordcount
wordcount作業測試項目,實現了wordcount測試的數據集准備,評分規則,導出csv報表規則,這個模塊依賴於autotest-core
- autotest-core
后續每次增加一個個人作業,都可以以app-wordcount為例,新建一個maven模塊,命名為: app-xxx,其中xxx就是個人作業的具體名稱。這個app-xxx模塊依賴autotest-core模塊,實現其接口即可。
下面以自動化測試WordCount作業為例,來說明如何使用自動化測試框架
支持的語言
理論上可以支持C++,Java,Python,NodeJS 任意版本的程序,因為測試程序中可以配置不同語言的執行環境
以下是我們測試通過后的語言版本
語言 | 版本 |
---|---|
Java | 1.8 |
C++ | 3.9.2 |
Python | gc++ 6.3.0 |
NodeJS | v10.15.3 |
實現的功能
克隆項目
從指定倉庫克隆項目,由於訪問Github的網絡經常不穩定,也支持我們先預備好項目的倉庫,不從Github實時下載。
生成測試數據
- 可以生成指定長度的隨機ASCII碼字符串
- 可以將我們指定長度的測試數據寫入指定位置的指定數量的文本文件中,這些文本文件將作為后續的測試用例文件。
注:這里針對不同的項目需要生成的測試數據不一樣,wordcount需要生成的數據
編譯
這里的編譯和以下的運行都是有如下兩個前置要求:
-
作業中必須明確要求入口文件的文件名是什么,以Java為例,就是Main方法所在的類文件的文件名是什么,以WordCount作業為例,我們要求學生的主函數必須定義在src目錄下一個名叫WordCount.java文件中,因為這樣我們才知道要運行哪個文件來執行測試用例。
-
助教在自己機器上運行的時候,必須要有對應語言的編譯和運行的環境且要規定好一致的語言版本。否則編譯這一關會有很多問題導致無法運行學生的代碼。
編譯時候會設置對應的超時時間,不同的語言可以設置不一樣的編譯超時時間,以Java為例,默認編譯超時時間是5秒鍾
運行
見編譯部分提到的兩點要求。
運行的時候也會設置對應的超時時間,不同的語言針對不一樣的測試用例可以設置不一樣的運行時間,超過這個時間,會直接將學生這個用例的耗時數設置為-2,-2表示耗時的記錄。
評分
- 每個用例的得分以及匯總得分
- 執行每個用例的耗時
注:我們統計的耗時是運行部分的耗時,不包括編譯的耗時。
導出結果到CSV
- 分數
- 耗時
- Git提交記錄
- 提交次數
- 每次提交的commit信息
效果預覽
其中:
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
- src
- 學號2
- src
- WordCount.java
- Lib.java
- src
- 學號3
- src
- WordCount.java
- src
…
克隆代碼
git clone https://github.com/GreyZeng/autotest.git
或者
git clone https://codechina.csdn.net/hotonyhui/autotest.git
克隆完畢后,用Jetbrains IDEA 打開文件autotest,並且在autotest下新建download文件夾
在download文件夾下新建一個judge文件夾,里面放對數程序,這個對數程序的目的就是,把測試用例的答案算出來,
這個對數程序要保證正確!!!最好多個助教一起做一下題目,然后互相驗證沒問題了,在把對數程序放上去。
PS:對數程序請不要提交到Github,防止學生抄襲!
如上圖,我放了一個對數程序WordCount.java
將:/resources/config.default文件復制一份,重命名為:config.properties
關注並確認config.properties中的如下幾個參數,其他參數可以參考注釋進行修改:
# 默認測試用例的數量
TESTCASE_NUM=10
# 測試文本的最少字符數
TEXT_MIN_LENGTH=100
# 測試文本的最大字符數量
TEXT_MAX_LENGTH=1000000
# 是否需要對數程序解答,如果准備好了case和答案,則可以把這個選項設置為false
NEED_ANSWER=true
# 是否需要克隆,如果設置為true,則會使用CLONE_URL到一個目錄進行操作
# 如果設置為false,則會使用LOCAL_URI
NEED_CLONE=false
# 需要clone的學生倉庫地址
CLONE_URL=https://github.com/kofyou/PersonalProject-Java.git
# 本地准備好的倉庫地址:例如: "D:\\git\\WordCountAutoTest\\download\\1615421924089\\PersonalProject-Java"
# 同時需要在這個倉庫的父目錄,即:"D:\\git\\WordCountAutoTest\\download\\1615421924089" 新建兩個文件夾,分別是cases和answers
# 並且在cases文件夾和answers文件夾准備好TESTCASE_NUM數量的測試用例和對應答案,文件名稱從1.txt,2.txt ... n.txt 開始命名
# 比如TESTCASE_NUM = 3, 那么
# D:\\git\\WordCountAutoTest\\download\\1615421924089\\cases 下有三個txt文件: 1.txt, 2.txt, 3.txt
# D:\\git\\WordCountAutoTest\\download\\1615421924089\\answers 下也有三個txt文件,1.txt, 2.txt, 3.txt 分別對應cases下面的三個文件的答案
LOCAL_URI=C:\\git\\autotest\\download\\1616838383549\\PersonalProject-Java
JUDGE_PROGRAM=C:\\git\\autotest\\download\\judge
修改好配置參數后,直接在IDEA里面Run Client.java,等待執行完畢即可。
說明:運行的時候,會在之前download的目錄以當前時間戳建一個文件夾,這樣做的目的是保證每次運行不會有文件夾沖突。
執行完畢后,按如下目錄找需要的信息:
目錄 | 說明 |
---|---|
download/時間戳/cases/ | 存放用例的位置 |
download/時間戳/answers/ | 存放答案的位置 |
download/時間戳/PersonalProject-Java/ | 項目目錄 |
download/時間戳/PersonalProject-Java/學號/output/ | 每個學號的學生的執行用例的輸出文件夾 |
download/時間戳/result/result.csv | 本次測評的csv文件 |
WordCountAutoTest\log | 日志記錄文件夾 |
查重
使用的是moss 組件,需要申請一個moss賬號
使用方法,參考:
QuickStart.java