Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ユニットテスト初心者を脱するために身につけたいN個のこと / N points to get out of unit test beginner #phpstudy

ユニットテスト初心者を脱するために身につけたいN個のこと / N points to get out of unit test beginner #phpstudy

ユニットテスト初心者を脱するために身につけたいN個のこと / N points to get out of unit test beginner #phpstudy

https://docs.google.com/presentation/d/1FAhVfOakoUTguKYuM9VYU_Vb88VaU5aKpGUeXST6rqg/edit?usp=sharing

Kazuki Higashiguchi
PRO

February 27, 2019
Tweet

More Decks by Kazuki Higashiguchi

Other Decks in Technology

Transcript

  1. ユニットテスト初心者を
    脱するために身に着けたい
    N 個のこと
    #phpstudy 第135回PHP勉強会@東京
    Kazuki Higashiguchi (@hgsgtk)
    1

    View Slide

  2. 2
    こんな経験ありませんか?

    View Slide

  3. 3
    このテストは微妙ですね。
    この書き方ではなくてこういう書き方にしましょ
    う。

    View Slide

  4. 4
    結局、これは何をテストしてるの・・・?

    View Slide

  5. 5
    何も触ってないのに、あなたの書いたテスト
    コードが落ちました。

    View Slide

  6. Talk Theme
    このトークで解決したいこと
    6
    ● 身近な誰かに諭されない、「使いこなし
    た」テストを書けること
    ● 未来の誰かが見て、「読める」テストを書
    けること
    ● 未来の誰かに怒られない、「壊れにくい」
    テストを書けること

    View Slide

  7. @hgsgtk
    Kazuki Higashiguchi
    job is … Software Engineer
    lang is ... PHP, Go ...etc
    belongs to ... BASE BANK株式会

    (BASE株式会社の100%子会社)
    at #phpstudy talked about …
    CakePHP4.x / terraform /
    ECS / Unit Testing
    7

    View Slide

  8. =
    8
    BASE BANK
    Mission
    「銀行をかんたんにし、全ての人が挑戦できる世の中に」
    即座に資金調達ができる金融サービス「YELL BANK(エールバンク)」
    https://thebase.in/yellbank

    View Slide

  9. =
    1. What is Unit testing?
    2. Learn useful functions of PHPUnit
    3. Clarify the intent of the test
    4. Tear down completely
    9
    N=0; N++;

    View Slide

  10. 1. What is Unit Testing?
    10

    View Slide

  11. =
    ソフトウェアにまつわる様々なテスト
    ● 単体テスト(Unit Testing)
    ● 結合テスト(Integration Testing)
    ● システムテスト(System testing)
    ● 運用テスト(Implementation Testing)
    ● 障害テスト(Recovery Testing)
    ● 耐久テスト(Duration Testing)
    ● パフォーマンステスト(Performance Testing)
    11
    Software Testing ways

    View Slide

  12. Unit Testing
    ~ One of Testing ways ~
    12
    WHAT
    ● Unit = アプリケーションのテスト可能な
    最小の部品単位
    ● クラス・メソッドに対するテスト
    ● 主にプログラマによって作成される
    WHY
    ● バグを見つける
    ● テスト対象のドキュメンテーション
    ● 設計の欠陥を明らかにする
    ...etc

    View Slide

  13. Testing
    Framework
    ユニットテストの方法
    13
    ● PHPUnit
    ○ https://phpunit.de/
    ○ PHPUnit is a programmer-oriented testing
    framework for PHP.
    ○ xUnit architecture
    ● composer require --dev phpunit/phpunit
    ^7

    View Slide

  14. =
    ● xUnit Architecture
    ○ https://en.wikipedia.org/wiki/XUnit
    ○ https://www.martinfowler.com/bliki/Xunit.html
    ○ All xUnit frameworks share the following basic component architecture
    ● basic components
    ○ Test Runner
    ○ Test Case
    ○ Test Fixtures
    ○ Test Suites
    ○ Test Execution (setup / teardown)
    ○ Test Result Formatter
    ○ Assertions
    14
    xUnit architecture

    View Slide

  15. 2. Learn useful functions of
    PHPUnit
    15

    View Slide

  16. 16
    このテストは微妙ですね。
    この書き方ではなくてこういう書き方にしましょ
    う。

    View Slide

  17. =
    ● setUp / tearDown
    ○ テストクラス共通の前準備・後片付けを定義する
    ● assertEquals / assertSame
    ○ 値比較
    ● @expectedException and @expectedExceptionMessage
    ○ Exceptionのアサーション
    ● @dataProvider
    ○ テストケースをテストメソッドから分離
    17
    basic functions of PHPUnit

    View Slide

  18. setup / teardown
    18

    View Slide

  19. assertSame /
    assertEquals
    19
    ● differences
    ○ assertEquals => ‘==’
    ○ assertSame => ‘===’
    ● assertSame is stricter.

    View Slide

  20. assert exception
    @expectedException
    @expectedExceptionMessage
    20

    View Slide

  21. dataProvider
    @dataProvider
    21

    View Slide

  22. 3. Clarify the intent
    of the test
    22

    View Slide

  23. 23
    結局、これは何をテストしてるの・・・?

    View Slide

  24. =
    ● テストの意図を明確にする
    HOW
    ● テストメソッド名を明確にする
    ● テストケース名を明確にする
    ● テスト対象をannotationで明示する
    ● テスト対象を絞る (Optional)
    24
    Clarify the intent of the test

    View Slide

  25. テストメソッド名
    を明確にする
    ● 「何を確認するのか」を明
    確に
    ● 場合によっては、日本語の
    テストメソッドもOK
    25

    View Slide

  26. テストケース名を
    明確に
    ● 「どういうケースなのか」
    を明確に
    ● 場合によっては、日本語の
    テストケース名もOK
    26
    ● dataProviderのキー名にケース名を指定
    ● テスト実行時に指定したキー名をPHPUnitが認識する

    View Slide

  27. テスト対象を
    annotationで明示
    する
    27
    アノテーションでテスト対象を明示する
    ● @see
    ● @covers
    ex. `@see ArticlesController::view()`

    View Slide

  28. テスト対象を絞る
    ● 一つのテストケース内の
    Assertionの数を絞る
    ● (ただし、これは流派によ
    る)
    28

    View Slide

  29. 4. Tear down completely
    29

    View Slide

  30. 30
    何も触ってないのに、あなたの書いたテスト
    コードが落ちました。

    View Slide

  31. =
    ● 自分のテストが他のテストに影響を与えうることを認識する
    ○ PHPUnitは一回の実行プロセス(parallelだと話は別)
    ○ グローバルな状態変化の影響を受ける
    ● Example
    ○ テスト時間(timecop)
    ○ トランザクション
    ● テストケース内・tearDownで確実にお片付け
    31
    Tear down completely

    View Slide

  32. =
    ● Testing the function that contains external service
    ● Test Driven Development
    ● Test Coverage
    ● Sprout class/method
    ...etc
    32
    N++;

    View Slide

  33. N++ @PHPerKaigi 2019
    33

    View Slide

  34. Fin.
    34

    View Slide