Thanks Driven Life

日々是感謝

Turnip 4.0.0 (Gherkin 6 対応) リリースしました

本記事の概要

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::xxxAPI には変更はありません

  • これまで使ってきた .feature ファイルはそのまま使えます

    Turnip を拡張して使っていなければ、バージョンアップに合わせての対応は必要ありません

Turnip そのものに新機能や改善があったわけではないため、普段使いであればあまり意識しなくても良さそうです。

Gherkin 6 の内容

Gherkin 6 では、下記キーワードが追加されました

  1. Rule
  2. Example (Scenario キーワードの別名)
  3. Scenario Template (Scenario Outline キーワードの別名)

2 と 3 はただのシノニム追加なので、1 の Rule について紹介していきます。

A new Rule keyword has been introduced, and acts as a grouping of one or more Example s - a new synonym for Scenario.

gherkin/CHANGELOG.md

これは例題を見るとわかりやすいです。

# 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 を使うと、そこらへんをよしなにいい感じに書けるようになる!みたいなやつだと思います!多分!!

まとめ

あけましておめでとうございます。本年もよろしくお願いします。