IMUSTOJ運維——批量自動化生成題目測試資料
IMUSTOJ運維——批量自動化生成題目測試資料
By 馬冬亮(凝霜 Loki)
一個人的戰爭(http://blog.csdn.net/MDL13412)
關於IMUSTOJ
我們使用的OJ是基於NOJ修改而成,根據實際需求進行了一些定製,總體功能修改的很少,所以本文提供的指令碼對於使用NOJ的學校也同樣適用。
為什麼要使用指令碼運維
新增題目時,測試資料測生成是一件很麻煩的事情,每道題都需要歷經編寫標程、編寫輸入資料、編譯、連結、執行,直至輸出結果並重定向到檔案中,最後還要按照OJ的資料夾組織形式,將輸入、輸出資料放置到相應資料夾中。如果手工來對每道題進行如上操作,那任務量是非常大的,而且操作及其繁瑣,這時就需要用自動化的指令碼來幫助我們完成以上工作。
本文指令碼實現的功能
- 給定題目序號範圍,自動生成相應的標程及輸入資料檔案模板,供使用者直接更改,而不用手工建立;
- 自動編譯、連結標程,而後使用輸入資料執行標程,並將結果重定向到相應目錄結構中;
- 對於編譯、連結過程中出錯的標程,會有詳細的日誌記錄;
指令碼執行截圖
指令碼實現
首先是自動生成標程和輸入資料的模板指令碼:
上述程式根據STARTINDEX和ENDINDEX作為題目序號的起始及結束,生成以題號命名的XXX.cpp和XXX.in模板,供使用者進行編輯。輸出至SOURCEDIR變數所指定的目錄。由於C語言可以不經修改的使用.cpp字尾進行編譯,所以這裡將所有標程都制定為C++原始檔。@echo off set STARTINDEX=1100 set ENDINDEX=1120 set STEPINDEX=1 set SOURCEDIR=D:\infiles if exist %SOURCEDIR% goto direxist >nul 2>nul mkdir %SOURCEDIR% >nul 2>nul :direxist FOR /L %%i IN (%STARTINDEX%,%STEPINDEX%,%ENDINDEX%) DO echo TODO > %SOURCEDIR%\%%i.cpp && echo TODO > %SOURCEDIR%\%%i.in pause
接下來是編譯、連結、執行程式,這裡分為兩個指令碼:maketest.bat和makeeach.bat
其中,maketest.bat使用者列舉標程,而makeeach.bat用於實際處理每個標程。
下面先來檢視maketest.bat的原始碼:
指令碼列舉SOURCEDIR變數所指定的資料夾中的檔案,將題號提取出來並傳遞給makeeach.bat進行進一步處理。@echo off set SOURCEDIR=D:\infiles for /f "delims=" %%I in ('dir /B /ON %SOURCEDIR%') do call makeeach.bat %SOURCEDIR%\%%~nI %%~nI pause
下面我們來檢視makeeach.bat的原始碼:
這個指令碼是三個指令碼中最重要的一個指令碼,其中:@echo off set GPPPATH=E:\IMUSTJudge\AcmJudge\bin\gcc\bin\g++.exe set OUTPUTBIN=D:\outfiles\%2.exe set LOGFILE=D:\maketest.log set OUTPUTDIR=D:\outfiles set SOURCEFILE=%1.cpp set INFILE=%1.in set OUTFILE=%OUTPUTDIR%\%2\output\%2.out if exist %OUTPUTDIR% goto direxist >nul 2>nul mkdir %OUTPUTDIR% >nul 2>nul :direxist del /f /q /s %OUTPUTBIN% >nul 2>nul %GPPPATH% %SOURCEFILE% -o %OUTPUTBIN% >nul 2>nul set err=%errorlevel% if "%err%"=="0" goto success goto failure :success mkdir %OUTPUTDIR%\%2\output >nul 2>nul %OUTPUTBIN% < %INFILE% > %OUTFILE% set COPYINFILEPATH=%OUTPUTDIR%\%2\input mkdir %OUTPUTDIR%\%2\input >nul 2>nul copy /Y %INFILE% /A %COPYINFILEPATH% /A >nul 2>nul goto end :failure echo compile %SOURCEFILE% failed echo compile %SOURCEFILE% failed >> %LOGFILE% :end
- GPPPATH指定了g++編譯器的路徑;
- OUTPUTBIN指定了最終編譯好的程式存放路徑,其命名是“題號.exe”形式;
- LOGFILE指定了錯誤日誌的存放位置及名稱;
- OUTPUTDIR指定了最終生成的輸入和輸出檔案存放位置,會自動在此資料夾下建立以題號明明的資料夾,並在其中建立inout和output資料夾,同時將輸入和輸出資料拷貝至相應資料夾;
- SOURCEFILE指定了標程名稱;
- IINFILE指定了輸入資料檔名稱;
- OUTPUTFILE指定了輸出檔案的路徑及名稱;
對於涉及到的資料夾,要先判斷其是否存在,都則在複製、編譯檔案的時候會發生錯誤。
編譯標程的程式碼很簡單,如下所示:判斷編譯是否成功需要對命令的返回值做判斷,如下所示:%GPPPATH% %SOURCEFILE% -o %OUTPUTBIN% >nul 2>nul
編譯成功則執行程式,生成輸出資料,並將相應檔案拷貝至指定目錄結構中,如下所示:set err=%errorlevel% if "%err%"=="0" goto success goto failure
若編譯失敗,則記錄錯誤日誌,如下所示::success mkdir %OUTPUTDIR%\%2\output >nul 2>nul %OUTPUTBIN% < %INFILE% > %OUTFILE% set COPYINFILEPATH=%OUTPUTDIR%\%2\input mkdir %OUTPUTDIR%\%2\input >nul 2>nul copy /Y %INFILE% /A %COPYINFILEPATH% /A >nul 2>nul goto end
:failure echo compile %SOURCEFILE% failed echo compile %SOURCEFILE% failed >> %LOGFILE%
指令碼用法
在配置好引數後,首先執行makesourcefile.bat生成標程及輸入資料模板,然後完成相應模板;
完成上述操作後,執行maketest.bat,程式將自動完成所有的相關操作,如果出錯,將列印錯誤日誌,並記錄到檔案中,方便使用者檢視;
最後,將生成的題目資料夾拷貝到OJ對應的目錄中即可。
相關文章
- 測試資料之自動生成
- 【自動化測試入門】自動化測試思維
- 自動化測試如何管理測試資料
- ansible自動化運維資料庫運維資料庫
- IT運維之自動化運維運維
- 運維效率之資料遷移自動化運維
- 記錄python介面自動化測試--利用unittest生成測試報告(第四目)Python測試報告
- 自動化測試資料生成:Asp.Net Core單元測試利器AutoFixture詳解ASP.NET
- 自動化運維:使用Maven與Docker執行Selenium測試運維MavenDocker
- 13. 自動化運維——批量關閉tomcat服務運維Tomcat
- 自動化批量管理工具pssh - 運維小結運維
- 自動化測試系列 —— UI自動化測試UI
- 自動化運維 Expect運維
- 自動的自動化:EvoSuite 自動生成JUnit的測試用例UI
- 用自動化運維工具解放IT運維運維
- 《軟體自動化測試成功之道》目錄
- 自動化批量管理工具salt-ssh - 運維小結運維
- 利用python實現批量自動化運維指令碼案例薦Python運維指令碼
- 介面自動化使用requests生成測試報告測試報告
- 請問自動化測試應該測試非法資料嗎
- mysql 動態生成測試資料MySql
- 測者的測試技術手冊:自動的自動化EvoSuite 自動生成JUnit的測試用例UI
- 《軟體自動化測試成功之道》節選12 - 自動化測試指令碼的維護指令碼
- 半自動化運維之動態新增資料檔案(一)運維
- 半自動化運維之動態新增資料檔案(二)運維
- Jmeter 介面自動化連載 (13) - 自動生成測試報告JMeter測試報告
- 自動化運維 Ansible運維
- 求助帖:JMeter 介面自動化測試——資料驅動JMeter
- 開源神器:自動生成隨機 mock 資料測試物件隨機Mock物件
- Devops-運維效率之資料遷移自動化dev運維
- 【DB】有贊資料庫自動化運維實踐之路資料庫運維
- mysql-inception自動化運維MySql運維
- Ansible自動化運維工具運維
- 基於LangChain手工測試用例轉Web自動化測試生成工具LangChainWeb
- 基於LangChain手工測試用例轉介面自動化測試生成工具LangChain
- 基於LangChain手工測試用例轉App自動化測試生成工具LangChainAPP
- Cobbler自動化批量安裝Linux作業系統 - 運維總結Linux作業系統運維
- Python自動化測試-使用Pandas來高效處理測試資料Python