前回の End to End テスト 入門 の続きです。
前回書いたように、よく使われているテスト記述用言語には、通常のプログラミング言語と自然言語に近いGherkin記法の2つがあります。今回はこの2つの詳細を説明したいと思います。
テスト記述用言語
通常のプログラミング言語+テスト用API
言語によらず UnitテストやBDD(behavior driven development)のスペックのライブラリーが用意されています。これらのテストからブラウザーをコントロールするAPIを呼び出す事で End to End テスト のプログラムを書くことが出来ます。
以下はRSpec feature の例です
feature "お知らせ管理" do
scenario "編集すると、トップページが変更される" do
fill_in "お知らせ本文", with: "10年に一度の20%値下げのお知らせ"
click_on "更新"
visit "/"
expect(page).to have_text "10年に一度の20%値下げのお知らせ"
end
end
Ruby独自のブロック(do 〜 end)やメソッド呼び出しの括弧が省略されているので英語風に見えますが、 全てテスト用APIのメソッドを呼び出しているだけです。
それぞれのAPIは、
- feature 〜 はテストの集まりで、 “お知らせ管理” はテスト対象の説明です
- scenario 〜 は 一つのテストで “編集すると・・・” はこのテストの説明です
- fill_in 〜 は “お知らせ本文” の入力欄に “10年に一度の20%値下げのお知らせ” と入力する操作です
- click_on 〜 は “更新”ボタンをクリックする操作です
- visit 〜 は URL ”/” をアクセスする操作です
- expect 〜 は ページ(画面)に “10年に一度の20%値下げのお知らせ” という文字列が表示されている事をチェックしています
自然言語に近いGherkin記法とブラウザー等の操作を結ぶログラミング言語
ツールとしては Cucumber が有名です。当初は Rubyで作られていましたが、その後 Java、PHPなどの言語での実装も作られています。
以下は Cucumber でのテスト記述です、 日本語で書かれていますがAIや自然言語処理ではありません、よく見ると規則性がありますよね。
フィーチャ: ショッピングカートに商品を追加したり、数量を変更したり、削除したりする
シナリオ: 商品をカートに入れてショッピングカートを表示
前提 商品"プリンセスコットン"のページを表示している
もし "2"番目の注文欄に"2"と入力する
かつ "買い物かごへ入れる"ボタンをクリックする
かつ "お買い物内容"リンクをクリックする
ならば "お買い物内容"と表示されていること
かつ "合計"表示欄に"¥40,000"と表示されていること
先に下のコードを眺めて下さい、これは Cucumber で Stepsと呼ばれるプログラムです(この例ではRuby言語)。
下の1行明、5行目を見ると想像できると思いますが正規表現で文章をマッチングしマッチしたブロック内の文を実行しています。
上の かつ “買い物かごへ入れる”ボタンをクリックする は 下の /^"([^"]*)"ボタンをクリックする$/
にマッチし click_button(“買い物かごへ入れる”) が実行され、ブラウザーの 買い物かごへ入れる ボタンをクリックする操作を行います (上の行の先頭は かつ ですが、かつ はその上の行の先頭と同じ もし に解釈されます)。
もし /^"([^"]*)"ボタンをクリックする$/ do |button|
click_button(button)
end
ならば /^"([^"]*)"と表示されていること$/ do |text|
expect(page).to have_content(text)
end
比較
プログラミング言語とGherkin記法のどうちらが良いでしょうか? End to Endテストに関わる人によると思います。
Gherkin記法はプログラマー以外でも、どのようなテストを行っているのかが理解できます。また、少しトレーニングすれば書く事もできます。
プログラマーとエンドユーザーの間に、テスト部署やSE、ユーザー企業の情報部署などが入っている場合はGherkin記法で書かれたテストコードはドキュメントとして役にたちます。またテスト環境が渡せるようなら、それらの人に書いてもらうことも出来ます。
ただし、Gherkin記法を使うテストコードは テスト記述 + Steps の2つが必要になり、かつ強く依存しているのでプログラマーの負担は増えます。 プログラマーのみが、End to Endテストに関わる場合は、プログラミング言語のみで書く方がテストを書く負荷が減ると思います。