PICTを試す

ちょっと古いツールではあるが、PICTというMicrosoft製のテスト項目作成ツールを見つけたので使ってみた。All Pair法という2つのパラメータの値の組みわせを網羅するようなテストを生成する。

github.com

Linux環境でビルドするにはclang++とlibc++-devが必要です。Windows用の実行ファイルは http://www.pairwise.org/pict/win/pict.exeから取れる。

Redirecting...

を参考に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

これなら使い物になりそうだ。

結果をテストフレームワークへの入力とできたらなおよい。