Outline
先日、毎年恒例の新卒エンジニアに向けて、Unit Testに関しての座学を行った。
初歩的な内容ではあるが、Unit Testを学ぶにあたって有益であると思い、記事にした。
password validation test
以下のように、有効passwordのテストを想定する。
この場合、エンジニアはどうテストをする?
・ UIでポチポチテストをする?
・ Unit Testを使う?
回答は、後ほど。
UI test と Unit Test の違いはなに?
PHPのLarabel frameworkを用いて説明する。
UI Test
UI Testは左の図。
passwordの処理を実現するには、Laravel上でいくつかの
passwordのテストをするとき、moduleを経由してテストが行われる。
・ユーザー側の表示部分である、view
・URLを振り分けるRouting
・処理を振り分けるcontroller
・実際のパスワードのvalidationをおこなうuser-class
などなど。
また、passwordのフォームにたどり着くまでに、UI上で操作が必要になる
- top pageに遷移する
- login する
- my pageに移動する
- password変更に遷移する
- 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の違いは以下のようにまとめられる。
機能単位でテストを行う場合、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であり、
仕様とあっているかどうかは見ていない。
そのため、その仕様をみたすようなテストケースをすべて記載されていないと、バグが起きる可能性がある。
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は上がると示している。