私がCucumber/Gherkinが好きな理由

おススメ記事は過去のものが沢山あるし、そもそもおススメするのが苦手なので、自分が好きな理由を書いてみる。

Cucumber/Gherkinって何?

BDD Testing & Collaboration Tools for Teams | Cucumber

テストツールの1つ。
Behavior-Driven Development (BDD)で利用されることが多い…ハズ。あんまり話聞かなくなった気もする。

以下のような感じで、テストを自然言語で書くことができる。

    # ログインとお知らせの確認
    もし    受講者 ユーザ "nobiinu" パスワード "fugafuga" でログインする
    ならば  "nobiinu様" と表示されていること
      かつ  視聴可能な単元に以下が表示されていること:
        | コース     | 単元   | 視聴期限 |
        | コース1 | 第5回 | 11月14日 |
        | コース1 | 第6回 | 11月14日 |

もちろん、自然言語だけでは実行はできない。
自然言語を実際のアクションに落とし込むためのコードを書く必要がある。グルーコード(glue code)と呼ばれているようだ。
以下は、コードの例。

    /**
      * @When 受講者 ユーザ :user_name パスワード :user_password でログインする
      */
    public function 受講者_ユーザ_パスワード_でログインする($user_name, $user_password)
    {
        $this->visitPath('/');
        $this->getSession()->getPage()->fillField("user", $user_name);
        $this->getSession()->getPage()->fillField("password", $user_password);
        $this->pressButton("ログインする");
        $this->getSession()->wait(10000, "document.readyState === 'complete'");
    }

Cucumberがテストシナリオ?に記述した文章に対応するコードを見つけ出して実行する。

    もし    受講者 ユーザ "nobiinu" パスワード "fugafuga" でログインする

に対応するコードとして

    /**
      * @When 受講者 ユーザ :user_name パスワード :user_password でログインする
      */
    public function 受講者_ユーザ_パスワード_でログインする($user_name, $user_password)

の関数を見つけ出して実行する。仕組み、設定などはここでは割愛。

なんで好きなの?

3つ書いてみる。1つ目はそもそものお話。3つ目は副作用。2つ目がCucumber/Gherkinだからこその話になるかな?

  • テストをコードで書ける
  • 日本語でテストが書ける
  • 日本語を使うことで、なんとなく頭の中の整理が進む (気がする)

それぞれを説明してみる。

テストをコードで書ける

これに尽きる。MPは集中力、根気と変換していただいて問題ない。
手動でのテストは根気が続かないのである。仕事だろ? と言われても、続かないので仕方がない。
だからと言って、コードであれば集中力が持続するのかというと、そうでもない。テストを手動でやるよりはマシというお話。
そんなところで開き直っても仕方はないものの…。

日本語でテストが書ける

コードならスラスラ書けるのかというとそうでもない。
私はオブジェクト指向が苦手である。どうやら責任を分解するのが苦手らしい。なんでも1つのクラスにやらせちゃう。なんでも一人でやろうとする自分に似ている気がする。

業務の言葉に該当する英語を考えるのも苦手である。苦手というか、時間をとって調べるという手間を書けるのを惜しんで、コードを書いてしまう。
この年になってようやくわかったんだけど、すぐ動かしたいという衝動を抑制するのが下手らしい。
なんにせよ、コードを書くために必要な手間を惜しむせいで、あとから見て、なんだこりゃ? なコードになる。自業自得ではあるが寂しいものだ。

そんな私でも、日本語で書けるなら、多少はマシなものができる。日本語であれば「あれ」は「あれ」とそのまま書けばいいのだ。
お客さんが話している言葉、自分も適切だと思う言葉でテストを表現することができる。素晴らしい。

日本語を使うことで、なんとなく頭の中の整理が進む (気がする)

そうやって日本語を使ってテストを書いていると、なんとなく違うな? こっちの方が分かりやすい表現だな? とか気づくことがある。
気づいたら、ちょっと文章を直してみる、いい感じになると悦に入ることができる。そうでなければ元に戻せば良い。
自分なりに理解が進む。進んだ理解に合わせて、表現を変えることができる。

テストが成長していく様を体験できる。嬉しい。楽しい。

ツラみについて

もちろん嬉しいことばかりではない。他のテストコードと同じようにメンテがツラい。

Cucumber/Gherkinを使う場合、日本語で書いたテストシナリオと、プログラム言語で書いたグルーコードの2つが必要になる。 両方をメンテナンスしなければいけない。

テストシナリオが変わってなくても、画面が変われば、テストコードを変える必要がある。
大きくUIを見直す時はため息がでる。

テストシナリオで使っている表現を修正しようとしたら、すべてのテストシナリオの修正と、テストコードの修正が必要だ。
作りすぎていると修正に苦労する。

画面の操作には Selenium を使っているので、クラスやIDなどを使って対象の要素が見つけやすくなるようにしておいた方がいい。
新しいプロダクトであれば、最初からそういう方針で画面を作っていけばいいのだけれど、既存のプロダクトはそうはいかない。
レガシーなプロダクトで使うのであれば、相応の覚悟が必要になる。

Cucumberのせいではないが、Selenium使うのもまぁまぁツラい。以前動いていたコードが、ブラウザ、ライブラリのバージョンアップによって動かなくなることがある。あのブラウザでは動いたコードが、このブラウザでは動かないといった問題とも付き合わなければならない。

何が言いたかったの?

メンテのこと考えるとうんざりするところはあるけれど「自分的に納得できる日本語で書いたテストがコマンド一発で実行できる」というご褒美があるので続いているというお話だったらしい。好きなところを書くつもりだったんだけども…。

ちなみに、現在は、コマンド入力してエンターキーを押すだけで、以下のデバイスを使ったテストを全自動で実行できる。ウヒヒヒヒ。