mysql-test學習記錄

 本文內容部分來自對官方文檔的翻譯和理解,部分來源於遇到問題的整理和記錄。html

mysql-test quick-start:

參考http://dev.mysql.com/doc/mysqltest/2.0/en/writing-tests-quick-start.htmlmysql

 

運行用例

一、  進到測試目錄正則表達式

shell> cd mysql-version/mysql-testsql

二、建立測試文件t/test_name.testshell

三、建立空的結果文件windows

shell> touch r/test_name.result

四、執行測試測試

shell> ./mysql-test-run.pl test_name

五、假設測試產生了輸出文件,此時測試的結果必定是fail的,由於判斷用例是否經過是判斷運行的輸出與結果文件是否一致。失敗後會產生一個文件 r/test_name.reject。檢查reject文件的內容,若是裏面是指望的輸出,則將內容拷貝到.result文件中,做爲之後判斷運行結果是否經過的依據。Mysql-test還提供了一個參數—record實現自動生成result文件的方式ui

shell> ./mysql-test-run.pl --record test_name

六、再次執行測試,結果會是成功的編碼

shell> ./mysql-test-run.pl test_name

若是後面不帶有任何參數,將運行全部的case,包括上面剛剛加入的用例spa

 

在測試用例的組織上,建議每一個.test文件取合適的長度以包含多個測試點;若是每一個測試點都獨立爲單獨的文件,會致使測試執行時間變長,影響效率。

 

爲了保持測試用例的獨立性,須要避免用例間的互相依賴。當有通用的需求時,例如在多個測試中可能用到同一個表,那麼將這個表的定義放在目錄 mysq-test/include中,命名 mysql-test/include/create_my_table.inc,並經過source命令在每一個case中進行調用。使用inc結尾是習慣作法,並無特殊要求。調用方法以下:

--source include/create_my_table.inc

每一個case中須要保證case結束時將這個表drop掉。

 

測試用例編寫的規範或者使用指南:

一、  儘量避免每行超過80個字符

二、  使用#開頭,做爲註釋

三、  縮進使用空格,避免使用tab

四、  SQL 語句使用相同的風格,包括關鍵字大寫,其它變量、表名、列名等小寫

五、  增長合適的註釋。特別是文件的開頭,註釋出測試的目的、可能的引用或者修復的bug編號

六、  通常狀況下,mysql-test-run.pl啓動本身的Mysql服務來進行測試,除非在啓動時指定參數—extern,來講明使用的Mysql服務。爲了不可能的衝突,習慣上表命名使用t一、t2...... 視圖命名使用v一、v2。。。。。。

 

一個簡單的測試用例的例子:http://dev.mysql.com/doc/mysqltest/2.0/en/writing-tests-sample-test-case.html

 

基於運行效率的考量,mysqltest的測試引擎會使用同一個server來連續的執行不一樣的測試文件,在運行的過程當中會使用同一個database。在case結束時要保證將新建的表以及臨時文件等清除掉。通常狀況下,在case運行前,也對可能有干擾的表先作清除,例如:

--disable_warnings
DROP TABLE IF EXISTS t1,t2;
--enable_warnings

 

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後面是能夠加入多個錯誤碼做爲參數的,使用逗號分隔便可

錯誤碼及邏輯值的對應關係參考Mysql源代碼include目錄下的mysqld_error.h 和sql_state.h

 

顯示和關閉結果信息

顯示影響的結果,指令和結果以下:

--enable_info
CREATE TABLE t2 (Period SMALLINT);
affected rows: 0
INSERT INTO t1 VALUES (9410,9412);
affected rows: 1
INSERT INTO t2 VALUES (9410),(9411),(9412),(9413);
affected rows: 4
--disable_info

若是不想記錄在測試文件中寫的sql statements能夠經過指令打開enable_query_logdisable_query_log 關閉,若是想控制是否記錄執行命令的輸出,能夠經過執行disable_result_log關閉和enable_result_log打開。

 

處理輸出中可能變化的值

某些查詢結果列的值,在每次運行後可能返回不一樣的值,若是咱們並不關心這一列具體的值時,能夠將它轉換爲一個常量記錄在結果文件中。經過將replace_column寫在查詢語句以前,例如,第一列多是變化的值且咱們不關心它是什麼時:

--replace_column 1 XXX
SELECT * FROM t1;

也能夠同時替換多個列,在後面直接寫便可

 

由mysql-test-run.pl向mysqld傳遞運行參數

一、向mysqld傳遞兩個參數--skip-innodb 和 --key_buffer_size=16384。注意—mysqld須要寫兩次

shell> mysql-test-run.pl --mysqld=--skip-innodb --mysqld=--key_buffer_size=16384

二、使用--combination傳遞,效果是連續運行兩次,分別使用其中一行的參數傳給mysqld。若是隻有一行,那麼與—mysqld是同樣的

shell> mysql-test-run.pl
         --combination=--skip-innodb
         --combination=--innodb,--innodb-file-per-table

更多示例參考Section 4.12.1, 「Controlling the Binary Log Format Used for an Entire Test Run」

 

定義case關聯的Mysql Server參數或用法

當測試須要使用指定的命令行參數重啓server時,能夠定義文件 mysql-test/t/test_name-master.opt,mysql-test-run.pl在執行test_name這個用例時會檢查當前server是否含有這些參數,若是沒有則使用這些參數重啓mysqld

在某些特殊狀況下,會有意的讓mysqld服務 crash掉,--skip-core-file參數會避免在測試過程當中產生core文件

當須要在case執行前執行外部的命令時,將命令寫到 t/test_name-master.sh中,它會在啓動server前執行。由於須要shell執行腳本,因此在windows環境下會自動跳過。

 

使用include文件簡化用例

在include目錄下已經保存了不少文件,做爲公共的文件,封裝了各類複雜的操做,這樣在執行用例時能夠實現簡單的調用,例如當咱們想驗證是否支持csv類型的存儲引擎時,能夠在用例文件中增長以下引用:

--source include/have_csv.inc

測試用例中須要確保include的文件存在,不然測試會直接退出。

使用場景:

一、  檢查是否支持指定的存儲引擎

二、  檢查支持的字符集

三、  是否須要debug選項

四、  等待一個條件變成true

五、  控制binlog格式

六、  控制從庫服務

能夠將include文件看作是一個子程序模塊,能夠經過設定變量的方式向它傳遞參數,以及獲取它們的返回值。

 

控制binlog格式

若是咱們的測試用例rpl.rpl_row*須要在不一樣的binlog模式(row和statement)下運行,能夠經過下面兩種方式:

shell> mysql-test-run.pl --suite=rpl --do-test=rpl_row
         --combination=--binlog_format=row
         --combination=--binlog_format=mixed

或者經過combinations文件的方式,即增長文件suite/rpl/combinations,內容以下:

[row]
--binlog_format=row
 
[mixed]
--binlog_format=mixed

執行方式:

shell> mysql-test-run.pl --suite=rpl --do-test=row

 

上面的控制方法或是影響運行的所有case,或者是影響suite/rpl目錄下的全部case。若是想控制每一個case有單獨的設置,須要藉助include的方式來實現。將case文件中包含以下其中的一行便可:

--source include/have_binlog_format_row.inc
--source include/have_binlog_format_statement.inc
--source include/have_binlog_format_mixed.inc

若是是須要支持兩種格式,則在下面選擇一行:

--source include/have_binlog_format_mixed_or_row.inc
--source include/have_binlog_format_mixed_or_statement.inc
--source include/have_binlog_format_row_or_statement.inc

在mtr執行前,mtr會檢查系統的binlog格式是否知足source中指定,一直後採起執行case,不然會skip。

若是不包含have_binlog_format_*.inc,則視爲支持全部的格式。

 

主從複製相關的用例

http://dev.mysql.com/doc/mysqltest/2.0/en/writing-tests-replication-tests.html

Case文件中只須要添加以下的指令便可:

--source include/master-slave.inc

在主從間切換:

connection master;
connection slave;

 

屏蔽指望的errors和warnings

測試用例執行完畢後,沒有出現錯誤的狀況下,mtr會繼續堅持server記錄的log,若是發現了任何warning或者error,結果也會是failed。此時咱們須要忽略掉一些warnings或者error,由於有些異常是測試輸入的條件。文件include/mtr_warnings.sql中,列出了全部須要忽略的warings或者errors,文件中的內容是支持正則表達式的。

也能夠經過用例中的指令來屏蔽錯誤,例如:

--disable_query_log
call mtr.add_suppression("The table 't[0-9]*' is full");
--enable_query_log

另外一種屏蔽的方式是給mysql-test-run.pl傳遞參數:--nowarnings

 

測試執行過程當中中止Server

http://dev.mysql.com/doc/mysqltest/2.0/en/stopping-server-during-test.html

 

 

經過mtr啓動一個mysqld用來調試:

shell> cd mysql-test

shell> ./mysql-test-run.pl --start alias &

shell> ../mysql -S ./var/tmp/mysqld.1.sock -h localhost -u root

使用的配置文件就是默認跑全部case狀況下,第一個case使用的配置文件

 

使用參數--start-and-exit的含義:是啓動mysqld後,mtr就退出。其它效果含義同—start

 

 

Mysql-test-run術語及說明和語言參考

一、  Command:是mysqltest自己可以識別和執行的輸入語句

二、  Statements:是SQL statements,是mysqltest發送給MySQL服務端執行的語句。

三、  Mysqltest啓動後,使用的鏈接名爲default與MySQL server鏈接。用例中經過connect command打開其它鏈接,使用connection command在多個鏈接間進行切換。

四、  註釋以#開頭,除此以外,mysqltest首先把它認爲是command去執行,若是是它不認識關鍵字,則做爲statements發送給MySQL server去執行。確認命令的結尾是依賴分隔符的,來區分一行中可能有的多個command,或者多行相連纔是一條完整的語句,默認的分隔符就是分號,固然這也是能夠經過delimiter command來修改。回車換行並非做爲一條command或者statements結束的標誌。當statements中sql開頭的keywords也是mysqltest的command時,爲了不歧義,使用以雙短橫線 「--「開頭的方式書寫命令。以下兩種方式的語義是相同的

--sleep 2
sleep 2;

 

循環語句:

let $1= 10;
while ($1)
{
 # execute your statements here
 dec $1;
}

 

語句之間暫停

sleep 0.2;

 

跳過執行用例

skip [message]

let $v= 0;
if (!$v)
{
  skip value is zero, skipping test;
}
echo This command is never reached;

skip是一條command,後面是輸出的skip緣由,mtr在打印完message後退出,再也不執行測試文件中的後續內容。

相關文章
相關標籤/搜索