英語で自動テストを書く方法

この記事ではいわゆるRSpec系のテストフレームワークを使うことを前提にしています。でもXUnit系でもおそらく応用は利くと思います。

なぜ英語で書くのか

そもそも、なんで英語で書くんだろう。別に日本語でもいいし母国語で書くほうがむしろ簡単なので、別にこの記事を読んだ上で日本語で書いても全く問題ないかと思います。

ただし、英語は共通言語なので書けるようになっておくと利点が多いです。英語を使えるということは別に偉いことでもなんでもなくて、むしろ英語ができるのは当たり前なんですよね。辛い現実ですが頑張っていきましょう。

基本はツリー構造

テストはツリー構造で表現できます。つまり、条件によって枝が分かれて、その先にテストケースという葉が付いていきます。

大きな分岐から小さな分岐に

ツリー構造はネストされたリストで表現することが可能です。

  • MyFunction test

    • Condition A

      • Condition A-A

    • Condition B

      • Condition B-A

        • Condition B-A-A

      • Condition B-B

実際にはここに「ログインしている時」や「値が正しくない時」などの条件が当てはまることになります。

条件

条件を列挙する方法

条件を表現する場合は When / With / Without などが使用できます。
その際「〇〇が□□の時」「〇〇が□□ではない時」のように肯定と否定のペアで説明していくと条件が網羅できるようになります。

具体例としてFizz Buzz関数をテストする場合を考えます。

  • 引数numが3で割り切れる場合

    • 引数numが5でも割り切れる場合

    • 引数numが5では割り切れない場合

  • 引数numが5で割り切れる場合

    • 引数numが3では割り切れない場合

  • 引数numが3でも5でも割り切れない場合

3でも5割り切れる場合の条件が被ってしまうので片方を省略しています。これで全ての条件がツリー構造で表現できました。

肯定を表したい場合

When an argument A is B

シンプルにis、複数ならare

例:引数numが3で割り切れる場合
E.g. When an argument num is divisible by 3

否定を表したい場合

When an argument A is not B

こちらもシンプルにis/are
コーテーションとかぶる可能性があるので isn't のような省略形は使わないで書くのが無難です。

例:引数numが3で割り切れない場合
E.g. When an argument num is not divisible by 3

いずれかを表したい場合

When an argument A is either B or C

either or を使うとどちらでもいいという表現ができます

例:引数numが3か5で割り切れる場合
E.g. When an argument num is either divisible by 3 or 5

いずれでもないを表したい場合

When an argument A is neither B nor C

eitherと逆でどちらでもだめという場合はneither norを使用できます

例:引数numが3でも5でも割り切れない場合
E.g. When an argument num is neither divisible by 3 nor 5

受け身「〇〇されている」を表したい場合

基本的にはbe動詞+動詞の過去分詞形を用いて表現します。
例えば「AはBから渡されている」という場合は

An argument num is passed by a user.

というように「引数numはユーザーから渡されている」となります。

他にも「引数numに文字列が代入されている場合」という場合は

When an argument num is assigned a string.

のようになります。

受け身「〇〇されていない」を表したい場合

単純に一つ前の形式の否定形が使用できます

An argument num is not passed by a user.
When an argument num is not assigned a string.

引っかかりがちなパターン

英語には2語以上で一つの動詞として扱われるものがあって、つい過去分詞にするときに間違えがちなものがあります。
例えばログインは log in という2語で成り立っているので「ログイン済み」を表現する場合は「logged in」となります。
inは動詞ではないのでその直前のlogを変化させなければいけません。

Signed in
Opted out
Put on

putに関しては現在・過去・過去分詞全部がputなので変化がありません…
three forms of put という検索をすると変化形が分かります。

テストケース

テストケースのタイトルになる部分です。
基本的には it で始まってテスト対象がどう振る舞うのかという内容になるかと思います。

「〇〇を返す」を表したい

例えば「Fizzという文字列を返す」という場合だと

It returns a string Fizz

となります。itは三単現なので続く動詞が s で終わる形式になります。

ただし助動詞のあとに来る動詞は原形で大丈夫です。

It can finish within 3 seconds

「三秒以内で終われる」となりますね。

Shouldいるのか問題

「〇〇するべき」という意味で should を使いたくなる気持ちがあるかと思いますが、基本的に全てshouldなので不要かと思います。

「〇〇する□□を返す」を表したい

例を上げるのが難しいのですが「viewを描画するオブジェクトを返す」というテストがあった場合

It returns an object that renders a view.

のようになるかと思います。thatを使うともう一つ別の文を連結することができて、主語がその直前の名詞になります。

日本語とほとんど真逆の単語の順序になっているのが面白いですが、英語では物事をズームアウトして考えるとうまくいきます。とりあえず何をしたいのかを先に言って、それからどんな状況なのかを追っていくような感じです。

どこかで読んだ文でわかりやすかったのが、「小さな公園に赤い服を着た女の子がいる」を英語にすると A girl in red is in a small park. というようになり、日本語ではズームインしているのに対し、英語ではズームアウトしているのがイメージしやすいと思います。