先日、MySQLをソースからビルドする方法を書きました。今日はテストコードについてのエントリーです。 mita2db.hateblo.jp
MySQL のテストコード
mysql-test/suite ディレクトリ以下にテストコードが記述されています。
5800以上のテストが記述されています。
$ find ~/mysql-8.0.18/mysql-test/suite/ -type f -name '*.test' | wc -l 5854
MySQL 8.0 でも 500以上のテストが追加されたとアピールされてます(スライド11ページ)。MySQLの品質はこのテストコードで担保されているんですね。
www.slideshare.net
テストを実行してみる
ビルドしたディレクトリの mysql-test ディレクトリ以下に、テストを実行するためのスクリプトが配置されます。
mtr と mysql-test-run がそのスクリプトです。どちらも実態は mysql-test-run.pl で、同じものです。
$ ls -alh total 24K drwxr-xr-x 5 mita2san users 174 Dec 27 11:03 . drwxr-xr-x 32 mita2san users 4.0K Dec 26 17:02 .. drwxr-xr-x 3 mita2san users 87 Dec 26 13:41 CMakeFiles -rw-r--r-- 1 mita2san users 2.5K Dec 26 13:41 cmake_install.cmake -rw-r--r-- 1 mita2san users 295 Dec 21 14:07 CTestTestfile.cmake drwxr-xr-x 3 mita2san users 16 Dec 21 14:07 lib -rw-r--r-- 1 mita2san users 7.8K Dec 26 13:41 Makefile lrwxrwxrwx 1 mita2san users 19 Dec 26 13:40 mtr -> ./mysql-test-run.pl lrwxrwxrwx 1 mita2san users 19 Dec 26 13:40 mysql-test-run -> ./mysql-test-run.pl -rwxr-xr-x 1 mita2san users 252 Dec 21 14:07 mysql-test-run.pl drwxr-xr-x 8 mita2san users 97 Dec 27 11:03 var
このコマンドの引数にテストのファイル名を指定することで、特定のテストだけを実行することができます。 何も引数を指定しなければ全てのテストが実行されます。
$ ls mysql-test/suite/sys_vars/t/ | grep binlog_format
binlog_format_basic.test
$ ./mtr binlog_format_basic
<snip>
==============================================================================
TEST NAME RESULT TIME (ms) COMMENT
------------------------------------------------------------------------------
[100%] sys_vars.binlog_format_basic [ pass ] 13
------------------------------------------------------------------------------
The servers were restarted 0 times
The servers were reinitialized 0 times
Spent 0.013 of 17 seconds executing testcases
Completed: All 1 tests were successful.
binlog_format_basic はこのようなテストコードです。
performance_schema.global_variables に binlog_format の列が存在することを確かめていまいした。
--echo '#---------------------BS_STVARS_002_03----------------------#' ################################################################# # Check if the value in GLOBAL Table matches value in variable # ################################################################# --disable_warnings SELECT @@GLOBAL.binlog_format = VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME='binlog_format'; --enable_warnings --echo 1 Expected
テストを記述してみる
オリジナルのテストを記述してみたいと思います。
mysql-test/suite/ 以下に任意のデュレクトリを作成し、その下に t というディレクトリにテストスクリプトを記述します。
r にはそのスクリプトの期待される出力を記述します。
SELECTを1回だけ実行するシンプルなテストを記述してみました。
$ cd ../mysql-test/suite/
$ mkdir -p mita2/{t,r}
$ touch mita2/r/sample_t.result
$ vim mita2/t/sample_t.test
SELECT "123";
--echo 123 Expected
実行します。
$ ./mtr sample_t
Logging: /home/mita2san/mysql-8.0.18/mysql-test/mysql-test-run.pl sample_t
MySQL Version 8.0.18
Checking supported features
- Binaries are debug compiled
Using 'all' suites
Collecting tests
Checking leftover processes
Removing old var directory
Creating var directory '/home/mita2san/mysql-8.0.18/build/mysql-test/var'
Installing system database
Using parallel: 1
==============================================================================
TEST NAME RESULT TIME (ms) COMMENT
------------------------------------------------------------------------------
[100%] mita2.sample_t [ fail ]
Test ended at 2019-12-27 12:20:10
CURRENT_TEST: mita2.sample_t
--- /home/mita2san/mysql-8.0.18/mysql-test/suite/mita2/r/sample_t.result 2019-12-27 05:30:37.966983335 +0300
+++ /home/mita2san/mysql-8.0.18/build/mysql-test/var/log/sample_t.reject 2019-12-27 06:20:09.905602126 +0300
@@ -0,0 +1,4 @@
+SELECT "123";
+123
+123
+123 Expected
mysqltest: Result length mismatch
safe_process[21816]: Child process: 21817, exit: 1
- the logfile can be found in '/home/mita2san/mysql-8.0.18/build/mysql-test/var/log/mita2.sample_t/sample_t.log'
[ fail ] と、失敗しました。 まだ、r ディレクトリに 期待する出力結果を記述していないため、失敗と判定されました。
ログディレクトリに実行結果が記録されています。これを r ディレクトリにコピーします。
$ cat build/mysql-test/var/log/sample_t.reject SELECT "123"; 123 123 123 Expected $ mv build/mysql-test/var/log/sample_t.reject mysql-test/suite/mita2/r/sample_t.result
今度はテストをパスしました。めでたしめでたし。
$ ./mtr sample_t
Logging: /home/mita2san/mysql-8.0.18/mysql-test/mysql-test-run.pl sample_t
MySQL Version 8.0.18
Checking supported features
- Binaries are debug compiled
Using 'all' suites
Collecting tests
Checking leftover processes
Removing old var directory
Creating var directory '/home/mita2san/mysql-8.0.18/build/mysql-test/var'
Installing system database
Using parallel: 1
==============================================================================
TEST NAME RESULT TIME (ms) COMMENT
------------------------------------------------------------------------------
[100%] mita2.sample_t [ pass ] 1
------------------------------------------------------------------------------
The servers were restarted 0 times
The servers were reinitialized 0 times
Spent 0.001 of 17 seconds executing testcases
Completed: All 1 tests were successful.