ちょっと古いツールではあるが、PICTというMicrosoft製のテスト項目作成ツールを見つけたので使ってみた。All Pair法という2つのパラメータの値の組みわせを網羅するようなテストを生成する。
Linux環境でビルドするにはclang++とlibc++-devが必要です。Windows用の実行ファイルは http://www.pairwise.org/pict/win/pict.exeから取れる。
を参考にJavaソフトウェアを動かす組み合わせテストを作ってみる。
パラメータと値の一覧のファイル(modelと呼ぶ)は以下のようになる。
# Platforms supported by CDH5 OS: RHEL5.10, RHEL6.6, RHEL7.1, CentOS5.10, CentOS6.6, SLES11SP3, Ubuntu14.04, Debian7.1 SELinux: ON, OFF JDK: OracleJDK7, OracleJDK8 if [SELinux] = "ON" then [OS] in {"RHEL6.6", "CentOS6.6"};
SELinuxは制約条件を付けたくてパラメータとして別にした。OSに含めても良い。
これをpictに入力すると、
$ ./pict cdh5.pict | column -t OS SELinux JDK Debian7.1 OFF OracleJDK7 RHEL6.6 ON OracleJDK7 CentOS5.10 OFF OracleJDK8 SLES11SP3 OFF OracleJDK7 RHEL5.10 OFF OracleJDK8 Ubuntu14.04 OFF OracleJDK7 CentOS6.6 ON OracleJDK8 CentOS6.6 OFF OracleJDK7 SLES11SP3 OFF OracleJDK8 Ubuntu14.04 OFF OracleJDK8 RHEL7.1 OFF OracleJDK7 RHEL7.1 OFF OracleJDK8 RHEL5.10 OFF OracleJDK7 RHEL6.6 OFF OracleJDK8 Debian7.1 OFF OracleJDK8 CentOS5.10 OFF OracleJDK7
2種のパラメータの組み合わせを網羅した項目が出力される。column -t
は結果を綺麗にするためにつけている。
ソートされていないのがイマイチだ。
#!/usr/bin/env sh TMP=$(mktemp /tmp/pict_sort.XXXXXX) cat /dev/stdin > $TMP head -n 1 $TMP cat $TMP | awk 'NR != 1 {print $0}' | sort rm -f $TMP
上のスクリプトを通せばソートできる。
$ ./pict cdh5.pict | ./pict_sort | column -t OS SELinux JDK CentOS5.10 OFF OracleJDK7 CentOS5.10 OFF OracleJDK8 CentOS6.6 OFF OracleJDK7 CentOS6.6 ON OracleJDK8 Debian7.1 OFF OracleJDK7 Debian7.1 OFF OracleJDK8 RHEL5.10 OFF OracleJDK7 RHEL5.10 OFF OracleJDK8 RHEL6.6 OFF OracleJDK8 RHEL6.6 ON OracleJDK7 RHEL7.1 OFF OracleJDK7 RHEL7.1 OFF OracleJDK8 SLES11SP3 OFF OracleJDK7 SLES11SP3 OFF OracleJDK8 Ubuntu14.04 OFF OracleJDK7 Ubuntu14.04 OFF OracleJDK8
さて、JDKの値としてOpenJDK8を追加する。
$ diff -u cdh5.pict cdh5_2.pict --- cdh5.pict 2016-01-23 16:22:54.752759392 +0900 +++ cdh5_2.pict 2016-01-23 16:20:20.416764623 +0900 @@ -2,6 +2,6 @@ OS: RHEL5.10, RHEL6.6, RHEL7.1, CentOS5.10, CentOS6.6, SLES11SP3, Ubuntu14.04, Debian7.1 SELinux: ON, OFF -JDK: OracleJDK7, OracleJDK8 +JDK: OracleJDK7, OracleJDK8, OpenJDK8 if [SELinux] = "ON" then [OS] in {"RHEL6.6", "CentOS6.6"};
そうすると、
$ ./pict cdh5_2.pict | column -t OS SELinux JDK Debian7.1 OFF OracleJDK7 RHEL5.10 OFF OracleJDK7 CentOS5.10 OFF OpenJDK8 Ubuntu14.04 OFF OpenJDK8 Debian7.1 OFF OracleJDK8 RHEL7.1 OFF OracleJDK8 SLES11SP3 OFF OracleJDK8 CentOS6.6 ON OpenJDK8 CentOS6.6 ON OracleJDK8 CentOS5.10 OFF OracleJDK7 RHEL6.6 ON OracleJDK8 Debian7.1 OFF OpenJDK8 RHEL6.6 OFF OracleJDK7 SLES11SP3 OFF OracleJDK7 CentOS6.6 OFF OracleJDK7 RHEL6.6 OFF OpenJDK8 RHEL5.10 OFF OracleJDK8 SLES11SP3 OFF OpenJDK8 Ubuntu14.04 OFF OracleJDK7 Ubuntu14.04 OFF OracleJDK8 RHEL5.10 OFF OpenJDK8 RHEL7.1 OFF OracleJDK7 CentOS5.10 OFF OracleJDK8 RHEL7.1 OFF OpenJDK8 CentOS6.6 ON OracleJDK7
OpenJDK8の項目が増えている。これはいいが、RHEL6.6の項目を見ると
$ ./pict cdh5.pict | column -t | grep RHEL6.6 RHEL6.6 ON OracleJDK7 RHEL6.6 OFF OracleJDK8 $ ./pict cdh5_2.pict | column -t | grep RHEL6.6 RHEL6.6 ON OracleJDK8 RHEL6.6 OFF OracleJDK7 RHEL6.6 OFF OpenJDK8
SELinuxとOracleJDKの組み合わせが変わってしまっている。これは良くない。なぜならば、テストをしたあとにOpenJDK8を足したとしたならばOracleJDKもやり直すのかとなってしまうからだ。そこで、既存の項目に追加する形にもできる。
$ ./pict cdh5.pict > cdh5.pictout $ ./pict cdh5_2.pict /e:cdh5.pictout | column -t OS SELinux JDK Debian7.1 OFF OracleJDK7 RHEL6.6 ON OracleJDK7 CentOS5.10 OFF OracleJDK8 SLES11SP3 OFF OracleJDK7 RHEL5.10 OFF OracleJDK8 Ubuntu14.04 OFF OracleJDK7 CentOS6.6 ON OracleJDK8 CentOS6.6 OFF OracleJDK7 SLES11SP3 OFF OracleJDK8 Ubuntu14.04 OFF OracleJDK8 RHEL7.1 OFF OracleJDK7 RHEL7.1 OFF OracleJDK8 RHEL5.10 OFF OracleJDK7 RHEL6.6 OFF OracleJDK8 Debian7.1 OFF OracleJDK8 CentOS5.10 OFF OracleJDK7 Debian7.1 OFF OpenJDK8 CentOS6.6 ON OpenJDK8 CentOS5.10 OFF OpenJDK8 SLES11SP3 OFF OpenJDK8 RHEL7.1 OFF OpenJDK8 RHEL5.10 OFF OpenJDK8 RHEL6.6 OFF OpenJDK8 Ubuntu14.04 OFF OpenJDK8
パラメータを増やす場合も同様だ。
$ diff -u cdh5.pict cdh5_3.pict --- cdh5.pict 2016-01-23 16:22:54.752759392 +0900 +++ cdh5_3.pict 2016-01-23 16:47:39.788709063 +0900 @@ -3,5 +3,6 @@ OS: RHEL5.10, RHEL6.6, RHEL7.1, CentOS5.10, CentOS6.6, SLES11SP3, Ubuntu14.04, Debian7.1 SELinux: ON, OFF JDK: OracleJDK7, OracleJDK8 +DB: MySQL, PostgreSQL if [SELinux] = "ON" then [OS] in {"RHEL6.6", "CentOS6.6"}; $ ./pict cdh5_3.pict /e:cdh5.pictout | column -t OS SELinux JDK DB Debian7.1 OFF OracleJDK7 MySQL RHEL6.6 ON OracleJDK7 PostgreSQL CentOS5.10 OFF OracleJDK8 PostgreSQL SLES11SP3 OFF OracleJDK7 PostgreSQL RHEL5.10 OFF OracleJDK8 MySQL Ubuntu14.04 OFF OracleJDK7 MySQL CentOS6.6 ON OracleJDK8 MySQL CentOS6.6 OFF OracleJDK7 PostgreSQL SLES11SP3 OFF OracleJDK8 MySQL Ubuntu14.04 OFF OracleJDK8 PostgreSQL RHEL7.1 OFF OracleJDK7 MySQL RHEL7.1 OFF OracleJDK8 PostgreSQL RHEL5.10 OFF OracleJDK7 PostgreSQL RHEL6.6 OFF OracleJDK8 MySQL Debian7.1 OFF OracleJDK8 PostgreSQL CentOS5.10 OFF OracleJDK7 MySQL
これなら使い物になりそうだ。
結果をテストフレームワークへの入力とできたらなおよい。