本記事の概要
Turnip の依存ライブラリの一つである Gherkin が 6 にメジャーバージョンアップしてそろそろ半年を迎えようとしています。 かなり遅れてしまいましたが、ようやく Turnip も Gherkin 6 に対応したので、その報告です。
また、 Gherkin 6 から新しいキーワードである Rule
が追加されたので、その紹介もついでにやっていきます。
Turnip 4.0.0 の内容
https://github.com/jnicklas/turnip/releases/tag/v4.0.0
Gherkin 6 対応がメインとなります。
Gherkin 6 は 5 と API 互換性が無いため、Turnip もメジャーバージョンを上げました
.feature ファイルのパース後の構造が変わっているだけなので、
Turnip::Node::xxx
の API には変更はありませんこれまで使ってきた .feature ファイルはそのまま使えます
Turnip を拡張して使っていなければ、バージョンアップに合わせての対応は必要ありません
Turnip そのものに新機能や改善があったわけではないため、普段使いであればあまり意識しなくても良さそうです。
Gherkin 6 の内容
Gherkin 6 では、下記キーワードが追加されました
Rule
Example
(Scenario
キーワードの別名)Scenario Template
(Scenario Outline
キーワードの別名)
2 と 3 はただのシノニム追加なので、1 の Rule について紹介していきます。
A new
Rule
keyword has been introduced, and acts as a grouping of one or moreExample
s - a new synonym for Scenario.
これは例題を見るとわかりやすいです。
# https://docs.cucumber.io/gherkin/reference/#rule # https://github.com/jnicklas/turnip/blob/v4.0.0/examples/gherkin6_syntax.feature Feature: Gherkin 6 syntax Background: Given there is a monster with 2 hitpoints Scenario: Battle When I attack it Then the monster should be alive When I attack it Then it should die Rule: Battle with preemptive attack Background: Given I attack the monster and do 1 points damage Example: battle When I attack it Then it should die Rule: Battle with preemptive critical attack Background: Given I attack the monster and do 2 points damage Example: battle Then it should die
上記 feature を RSpec に落としてみたイメージはこんな感じ:
describe 'Gherkin 6 syntax' do before { send('there is a monster with 2 hitpoints') } describe 'Battle' do it do send('I attack it') send('the monster should be alive') send('I attack it') send('it should die') end end context 'Battle with preemptive attack' do before { send('I attack the monster and do 1 points damage') } describe 'battle' do it do send('I attack it') send('it should die') end end end context 'Battle with preemptive critical attack' do before { send('I attack the monster and do 2 points damage') } describe 'battle' do it do send('it should die') end end end end
これまでの feature ファイルでは、Feature の下にある Background や Scenario が同じレイヤーにのみ存在を許されており、「このバックグラウンドはこのシナリオにのみ適用したいんだけど、ここに書くと全てのシナリオで発動しちゃうんだよなぁ」といったことが稀によくありました。その回避策として「別の Feature に分ける」「タグをつけて Step 側でなんとかする」といった対応が取られていたかと思います。
そこで Rule を使うと、そこらへんをよしなにいい感じに書けるようになる!みたいなやつだと思います!多分!!
まとめ
あけましておめでとうございます。本年もよろしくお願いします。