0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Unit Test

Posted at

Outline

先日、毎年恒例の新卒エンジニアに向けて、Unit Testに関しての座学を行った。
初歩的な内容ではあるが、Unit Testを学ぶにあたって有益であると思い、記事にした。

password validation test

以下のように、有効passwordのテストを想定する。
この場合、エンジニアはどうテストをする?

・ UIでポチポチテストをする?
・ Unit Testを使う?

image.png

回答は、後ほど。

UI test と Unit Test の違いはなに?

PHPのLarabel frameworkを用いて説明する。

image.png

UI Test

UI Testは左の図。
passwordの処理を実現するには、Laravel上でいくつかの

passwordのテストをするとき、moduleを経由してテストが行われる。
・ユーザー側の表示部分である、view
・URLを振り分けるRouting
・処理を振り分けるcontroller
・実際のパスワードのvalidationをおこなうuser-class
などなど。

また、passwordのフォームにたどり着くまでに、UI上で操作が必要になる

  1. top pageに遷移する
  2. login する
  3. my pageに移動する
  4. password変更に遷移する
  5. passwordを入力する <--- ココ

つまり、passwordのvalidationを行うため、多くのmoduleテスト、UI操作が発生する。

当然、
・いろんなmoduleをテストしているため、バグがあったときの根本原因を探すとき、工数がかかる
・1つのテストするのに工数がかかる

Unit Test

Unit testは右の図
user-classのみをテストする。
そのため、入力されたpasswordの文字のvalidationだけを行う。

以下、2つのテストパターンのコードの例である。
・8大文字英字のみ = Fail
・8大・小文字英字、数字 = True

    /** @test length=8 **/
    public function return_validate_06 (){

        $user = new SampleUser();
        $user->setPassword('ABCDEFGH');

        $result = $user->validatePassword();
        $this->assertFalse( $result);

    }

    /** @test large+small+number and 8 characters **/
    public function return_validate_46 (){

        $user = new SampleUser();
        $user->setPassword('Ab1DEFGH');

        $result = $user->validatePassword();
        $this->assertTrue( $result);

    }

このようなコードを書き、これをunit testに流すだけでテストが完了する

以上から、UI TestとUnit Testの違いは以下のようにまとめられる。

image.png

機能単位でテストを行う場合、Unit Testが非常に有効であることがわかる。

Is Test coverage enough for Quality?

ただ、Unit Testは完ぺきではない。
特にunit testの可視化ツールをつかってcoverageをだしても、あくまでcoverageを示しているだけで
スペックに対する妥当性を可視化するものではない。

例えば、C0 coverage 100%を満たしたとしよう。
C0はすべてのrouteを網羅すると、100%である。

以下のように、passwordの文字数だけvalidateする機能があるとする。
そして、以下のようなコードを書いたとする。
すると、1テストケースで c0 coverageは100%になっていまう。
これで本当に考えうるテスト( 境界値、同値等 )を満たしているのだろうか?

また、あくまでテストによってコードのすべての分岐を通ったかどうかを測るのがcoverageであり、
仕様とあっているかどうかは見ていない。
そのため、その仕様をみたすようなテストケースをすべて記載されていないと、バグが起きる可能性がある。

image.png

Are Internal Quality (Unit Test) & Development Speed Trade-Off?

ここでは、 Unit Testと development speedがtrade-offになるのではないか?の議論である。
結論から言うと、最初はunit test(internal quality)を導入していると、productivityは low internal qualityに比べ低い。
しかし、規模が大きくなるにつれて、internal qualityを保っていると、productivityは上がると示している。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?