MySQL Test Run 測試框架詳細介紹
一、介紹
MySQL Test Run 簡稱MTR,是MySQL官方提供的自動化測試框架,執行腳本在發佈路徑的mysql-test目錄下。
主要測試步驟,是通過執行一個case(*.test)中的語句(包括sql語句和其他管理語句),將case的輸出記錄保存在結果文件(*.result)中,或者是將語句執行結果與標準的輸出結果作diff,如果出現偏差就會報錯。
MySQL自動化框架包括一組測試用例和用於運行它們的程序:perl 腳本(mysql-test-run.pl)和 c++ 二進制(mysqltest)。
- perl 腳本:負責控制流程,包括啟停、識別執行哪些用例、創建文件夾、收集結果等操作。
- mysqltest:負責執行測試用例,包括讀文件,解析特定語法,執行用例。
二、安裝
安裝依賴包
本次安裝環境是CentOS 8.5
yum -y install perl* -y
下載安裝包並解壓:
本文采用的MySQL版本是8.0.28,可根據需要自行選擇版本。
cd /home/ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-test-8.0.28-linux-glibc2.12-x86_64.tar.xz tar -xvf mysql-test-8.0.28-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.28-linux-glibc2.12-x86_64 mysql_mtr_8.0.28 cd /home/mysql_mtr_8.0.28/ cp -r /path-to-db/* /home/mysql_mtr_8.0.28/ #將mysql安裝包目錄下的文件與mtr目錄合並 cd /home/mysql_mtr_8.0.28/mysql-test #進入mtr目錄
主要介紹:
include:
包含.inc文件,用於測試開始時判斷是否滿足測試條件,在測試用例中通過source命令引入,就像C/C++的頭文件,在mtr的體系中,我們可以將許多可重復利用的測試語句,提取到*.inc文件中,放到對應的include目錄中,以便在*.test中直接調用。
suite:
包含所有測試suite,每一個suite為一個測試用例集,一般地,我們將若幹個測試功能點同屬於一個功能模塊的testcase放在一個大目錄下,這個包含瞭t和r目錄的大目錄被稱為一個testsuite。其中a.test文件會放在t目錄,而a.result放在r目錄。
三、測試示例
我們通過一個最簡單的例子來說明這個框架是怎麼使用的。
四、創建測試用例
在 mysql-test/t 目錄下創建一個文件名為 mytest.test的測試用例:
# vi mytest.test --disable_warnings DROP TABLE IF EXISTS t1; SET @@sql_mode='NO_ENGINE_SUBSTITUTION'; --enable_warnings SET SQL_WARNINGS=1; CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2); DROP TABLE t1;
執行並查看結果:
# ./mtr --record mytest.test Logging: ./mtr mytest.test MySQL Version 8.0.28 Checking supported features... - SSL connections supported Collecting tests... Checking leftover processes... Removing old var directory... Creating var directory '/usr/local/mysql/mysql-test/var'... Installing system database... Using parallel: 1 ============================================================================== TEST RESULT TIME (ms) or COMMENT -------------------------------------------------------------------------- worker[1] Using MTR_BUILD_THREAD 300, with reserved ports 13000..13009 worker[1] mysql-test-run: WARNING: running this script as _root_ will cause some tests to be skipped [100%] main.mytest [ pass ] 12 -------------------------------------------------------------------------- The servers were restarted 0 times Spent 0.012 of 4 seconds executing testcases Completed: All 1 tests were successful.
看到successful
說明執行成功。
執行說明:
- 1. mysql-test/mtr這個文件,是一個perl腳本。同目錄下還有 mysql-test-run 和mysql-test-run.pl,這三個文件是一模一樣的;
- 2. 執行case時會自動啟動一個mysql服務,默認端口為13000。如果這個case涉及到需要啟動多個服務(比如主從),則端口從13000遞增;
- 3. ./mtr的參數隻需要指明測試case的前綴即可,當你執行./mtr mytest會自動到t/目錄下搜索 mytest.test文件來執行,也可以輸入完整的測試例名稱如./mtr mytest.test。 如果要執行某個功能模塊的所有測試用例,可以在suite目錄下創建一個大目錄如spTest然後再分別創建t和r目錄,執行該目錄的測試例可以寫成:./mtr spTest.mytest;
- 4.
mytest.test
最後一行是刪除這個創建的表。因為每個case都要求不要受別的case影響,也不要影響別的case,因此自己在case中創建的表要刪除; - 5.第一次執行建議加上參數–record,執行完會在對應的r目錄下生成mytest.result;mtr會將mytest.test的執行結果與r/mytest.result作diff。 若完全相同,則表示測試結果正常(如果需要和往期測試結果做對比,需要在r目錄下先提供一份xx.result文件);
- 6.MTR提供瞭一套測試用例,如果不帶任何參數直接執行./mtr,會運行t目錄下的的所有case,包括上面剛新增的用例。
五、mtr 其他常用參數介紹
–force
默認情況下,隻要遇到一個用例出錯,測試程序就會退出,加入該參數後,mtr會忽略錯誤並繼續執行下一個case直到所有case執行結束再退出(但如何腳本存在太多錯誤還是會退出);
–record
是否記錄results
結果,首次執行建議帶上,讓其自動生成.results文件(再修改成我們預期的結果文件);
若一個執行輸出結果和testname.result
文件不同,會生成一個testname.reject
文件,該文件在下次執行成功之後被刪除;檢查reject
文件的內容,如果裡面是期望的輸出,則將內容拷貝到.result文件中,作為以後判斷運行結果是否通過的依據;
–big-test
執行標記為big的測試用例,因為用例較大、耗時較長,標記為big的用例默認不會執行,輸入兩遍big-test則隻執行標記為big的測試用例;
–suite=[dirname]
批量執行指定測試目錄下的所有測試例,有時候我們要執行一套xx.test文件,這樣可以在執行時候指定套件名稱。
連接遠程的數據庫進行mtr執行:
#./mtr --extern host=192.168.6.1 --extern port=3306 --extern user=root --extern password='123456' --record --force example.1
–extern:一般情況下mtr是啟動自己的MySQL服務來進行測試,如果在啟動時指定參數—extern,則可以使用指定的MySQL服務進行測試;
host | port :遠程服務器地址 | 端口;
user | password: 對應數據庫的用戶名 | 密碼;
六、測試用例編寫的規范
- 盡可能避免每行超過80個字符 ;
- 用#開頭,作為註釋;
- 縮進使用空格,避免使用tab;
- SQL 語句使用相同的風格,包括關鍵字大寫,其它變量、表名、列名等小寫;
- 增加合適的註釋。特別是文件的開頭,註釋出測試的目的、可能的引用或者修復的bug編號;
- 為瞭避免可能的沖突,習慣上表命名使用 t1、t2…視圖命名使用v1、v2…;
case運行失敗的原因:
- 用例文件中的sql可能不合法;
- 產生的結果文件與期望文件diff結果不一致;
- 具體錯誤原因可以通過查看執行時的輸出日志進行排查修改;
處理預期錯誤:
- 在期望有返回錯誤的語句前面使用error指令,例如創建一個已經存在的表名時,可以使用以下任一種方式:
–error 1050
–error ER_TABLE_EXISTS_ERROR
其中數字對應錯誤碼,ER_TABLE_EXISTS_ERROR對應錯誤的邏輯名。
這樣在mysqltest運行後,會將返回的錯誤信息一起寫入結果文件,這些錯誤信息就作為期望結果的一部分瞭。
也可以使用SQLSTATE來指示期望有錯誤返回,例如與MySQL錯誤碼1050關聯的SQLSTATE值是42S01,使用下面的方式,註意編碼增加瞭S前綴:
–error S42S01
在指令error後面是可以加入多個錯誤碼作為參數的,使用逗號分隔即可;.
MTR其他詳細用法可以參考官網: 官方文檔
到此這篇關於MySQL Test Run 測試框架詳細介紹 的文章就介紹到這瞭,更多相關MySQL Test Run 測試框架內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- MySQL庫表名大小寫的選擇
- SQL查詢語句執行的過程
- 詳解記錄MySQL中lower_case_table_names的坑
- Linux下mysql 8.0.25 安裝配置方法圖文教程
- 詳解MySQL8.0原子DDL語法