組み合わせの抽出に便利なPICT・後編

外で着るには恥ずかしいTシャツが溜まってきました。こんにちは、kondoです。

PICTのお話後編は、実際のサイトをモデルにテストの組み合わせを出す演習をしてみましょう。

「PICTって何?」という方は、前編をご覧ください。

モデルサイトはこちら、art-meterです。

絵をサイトから注文できるのですが、日本国内ですと地域によって送料が変わります。

今回は、国内配送の場合に、都道府県によってちゃんと正常な送料が出せているかを確認してみましょう。

その前に

送料についてはこちらをご覧ください。

http://www.art-meter.com/guide/customer/#sg5

さぁ、やってみよう

まずは、項目と値を考えて見ます。

1.第一の条件として「総面積が1200cm2未満」「総面積が1200cm2以上」というのがあります。

境界値は1200cm2なので、総面積は「1200cm2より小さい」「1200cm2」「1200cm2より大きい」としましょう。

2.続いて、都道府県ですね。国内配送の場合は47都道府県から選べますので、項目はそのまま都道府県でいいでしょう。

ただし、送料は地域ごとに決められています。都道府県と地域をマッピングして、送料は地域で出すようにすることが必要です。

これには「条件付き制約」を活用します。

注意点として、PICTではif文の入れ子はできません。if文の条件式が若干冗長になりますが、そこは我慢我慢。

3.art-meterでは、プラス300円でオプショナルメニューとしてギフトラッピングをしてくれるサービスもあります。

せっかくなので、このオプションの使用有無も項目に入れてみましょう。

4.代引き払いにも対応しています。300円の代引き手数料がかかるので、使用有無を入れておきましょう。

これらの条件をまとめたのがこちらの内容になります。でもこれ、実はおかしくなります。

# 1
面積: 1200cm2より小さい,1200cm2,1200cm2より大きい
# 2
都道府県: 北海道, 青森県, 岩手県, 宮城県, 秋田県, 山形県, 福島県, 茨城県, 栃木県, 群馬県, 埼玉県, 千葉県, 東京都, 神奈川県, 新潟県, 富山県, 石川県, 福井県, 山梨県, 長野県, 岐阜県, 静岡県, 愛知県, 三重県, 滋賀県, 京都府, 大阪府, 兵庫県, 奈良県, 和歌山県, 鳥取県, 島根県, 岡山県, 広島県, 山口県, 徳島県, 香川県, 愛媛県, 高知県, 福岡県, 佐賀県, 長崎県, 熊本県, 大分県, 宮崎県, 鹿児島県, 沖縄県
地域: 北海道, 東北, 関東, 北陸, 信越中部, 近畿, 中国, 四国, 九州, 沖縄
送料: 700, 1500, 1600, 1700, 1800, 2000
# 3
ギフトラッピング: 有, 無
# 4
代引き: 有, 無

####################
# 条件付き制約
# 
# 都道府県と地域のマッピング
if [都道府県] IN {"北海道"}
    then [地域] = "北海道";
if [都道府県] IN {"青森県","岩手県","宮城県","秋田県","山形県","福島県"}
    then [地域] = "東北";
if [都道府県] IN {"茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県"}
    then [地域] = "関東";
if [都道府県] IN {"新潟県","富山県","石川県","福井県"}
    then [地域] = "北陸";
if [都道府県] IN {"山梨県","長野県","岐阜県","静岡県","愛知県","三重県"}
    then [地域] = "信越中部";
if [都道府県] IN {"滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県"}
    then [地域] = "近畿";
if [都道府県] IN {"鳥取県","島根県","岡山県","広島県","山口県"}
    then [地域] = "中国";
if [都道府県] IN {"徳島県","香川県","愛媛県","高知県"}
    then [地域] = "四国";
if [都道府県] IN {"福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県"}
    then [地域] = "九州";
if [都道府県] IN {"沖縄県"}
    then [地域] = "沖縄";

# 総面積と送料のマッピング
# 総面積が1200cm2より小さいの場合は一律700円
if [面積] = "1200cm2より小さい"
    then [送料] = 700;
# 総面積が1200cm2より大きいの場合は地域によって送料が変わる
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [地域] IN {"北海道","九州"}
    then [送料] = 1800;
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [地域] IN {"東北","近畿"}
    then [送料] = 1600;
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [地域] IN {"関東","信越中部","北陸"}
    then [送料] = 1500;
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [地域] IN {"中国","四国"}
    then [送料] = 1700;
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [地域] IN {"沖縄"}
    then [送料] = 2000;

そうは問屋が卸さない

搭載メモリ1GBの私のマシンで上記を通すと、フイーンと呻りだして、一向に結果を出してくれませんでした。恐らく、記述内容が悪くて無限ループのような状態になったのでしょう。

ここは都道府県、地域と送料のマッピング方法を変えることで対処していきます。柔軟に臨機応変、七変化が勝ち。

よくよく考えると、ユーザーが設定するのは「地域」ではなく「都道府県」です。別にいちいち「地域」に変換しなくてもよいですね。

都道府県から直接送料を出すようにしてしまいましょう。若干泥臭く見えますが、処理的にはシンプルになるはず。

ついでに、「決済手数料(300円)」を結果に含んでおきましょう。

そして、「ギフトラッピング」「代引き」の項目も「有,無」ではなく「300,0」と、金額で表記しておきます。

こうすることで、結果をエクセルに貼り付けた後に合計金額がセル同士の計算で簡単に出せるようになります。

さて、改良版がこちら。

# 1
面積: 1200cm2より小さい,1200cm2,1200cm2より大きい
# 2
都道府県: 北海道, 青森県, 岩手県, 宮城県, 秋田県, 山形県, 福島県, 茨城県, 栃木県, 群馬県, 埼玉県, 千葉県, 東京都, 神奈川県, 新潟県, 富山県, 石川県, 福井県, 山梨県, 長野県, 岐阜県, 静岡県, 愛知県, 三重県, 滋賀県, 京都府, 大阪府, 兵庫県, 奈良県, 和歌山県, 鳥取県, 島根県, 岡山県, 広島県, 山口県, 徳島県, 香川県, 愛媛県, 高知県, 福岡県, 佐賀県, 長崎県, 熊本県, 大分県, 宮崎県, 鹿児島県, 沖縄県
送料: 700, 1500, 1600, 1700, 1800, 2000
# 3
ギフトラッピング: 300,0
# 4
代引き: 300,0
# 必須の項目は値を一つだけにする
決済手数料: 300

####################
# 条件付き制約
# 
# 総面積、都道府県と送料のマッピング
# 総面積が1200cm2より小さいの場合は一律700円
if [面積] = "1200cm2より小さい"
    then [送料] = 700;
# 総面積が1200cm2より大きいの場合は地域によって送料が変わる
# 北海道地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"北海道"}
    then [送料] = 1800;
# 東北地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"青森県","岩手県","宮城県","秋田県","山形県","福島県"}
    then [送料] = 1600;
# 関東地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県"}
    then [送料] = 1500;
# 北陸地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"新潟県","富山県","石川県","福井県"}
    then [送料] = 1500;
# 信越中部地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"山梨県","長野県","岐阜県","静岡県","愛知県","三重県"}
    then [送料] = 1500;
# 近畿地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県"}
    then [送料] = 1600;
# 中国地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"鳥取県","島根県","岡山県","広島県","山口県"}
    then [送料] = 1700;
# 四国地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"徳島県","香川県","愛媛県","高知県"}
    then [送料] = 1700;
# 九州地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県"}
    then [送料] = 1800;
# 沖縄地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"沖縄県"}
    then [送料] = 2000;

直りました

結果は141行にもなったので全ては載せられませんが、こんな感じになりました。

面積  都道府県    送料  ギフトラッピング    代引き   決済手数料
1200cm2 神奈川県    1500    300 300 300
1200cm2より小さい  島根県   700 0   0   300
1200cm2より大きい  岩手県   1600    300 0   300

送料、ギフトラッピング、代引き、決済手数料を足し合わせれば、合計の送料が出ます。そこはエクセルにやってもらえば簡単。

そして伝説へ

結果がこのように定型のテキストになっていれば、Seleniumのテストケースを書いたりするときにちょっと楽になりますよ。

総面積が指定の通りになるように作品を選び、指定の都道府県、ギフトラッピング、代引きを選ぶと送料合計になるかどうか、というテスト。

実際に結果テキスト→Seleniumのテストケースに変換しようとすると、正規表現等の知識も必要になってきますが、今回は割愛します。

さぁみんなも、レッツエンジョイど根性テストライフ!

カヤックでは、いろんなツールを使いこなすことに快感を覚えるエンジニアを募集しています!