8時間耐久PHPUnitの教室

24,084 views

Published on

下北沢で開催したPHPUnit講座の資料です。
動画などはこちら。
http://blog.candycane.jp/archives/1480

Published in: Technology
0 Comments
82 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
24,084
On SlideShare
0
From Embeds
0
Number of Embeds
8,482
Actions
Shares
0
Downloads
107
Comments
0
Likes
82
Embeds 0
No embeds

No notes for slide

8時間耐久PHPUnitの教室

  1. 1. 8時間耐久PHPUnitの教室 8時間耐久PHP classのクラス / Yusuke Ando (@yando) 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  2. 2. テキスト8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  3. 3. http://tech.a-listers.jp/8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  4. 4. http://blog.livedoor.jp/goroyasu/archives/4196098.html 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  5. 5. 本日の対象者 PHPを使っている関数やクラスでコーディング コードの修正が最近辛い子育てブログ ころぐの作者8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  6. 6. PHPUnitを 使った開発を実践の基礎知識を 学びます8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  7. 7. 本日のメニュー PHPUnitの無い開発 PHPUnitの基礎 テストしづらいコード より快適な手法8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  8. 8. PHPUnitの無い開発8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  9. 9. 原始的な開発の流れ 1.コードを書く 2.ブラウザで動作確認 3.コードを直す 2に戻る8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  10. 10. 書いて8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  11. 11. 動かす8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  12. 12. 書いて8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  13. 13. 動かす8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  14. 14. 原始的な開発の流れコードの記述と動作確認 のループを繰り返す ごく自然な行為8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  15. 15. しかし8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  16. 16. プログラム は複雑化する8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  17. 17. ライブラリ化 ページ ライブラリ8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  18. 18. 原始的な開発の流れ 修正 修正 ページ ライブラリ 修正 修正 修正 動作確認修正ファイルと確認対象が 一致しなくなる8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  19. 19. 複数ページから共用 ページ ライブラリ8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  20. 20. きつくなってきた ページ動作確認 修正 修正 ページ ライブラリ 修正動作確認 修正 修正 ページ動作確認 確認対象が増える 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  21. 21. ページも複雑化 入力動作確認 修正 修正 確認 ライブラリ 修正動作確認 修正 修正 登録完了動作確認 ステップに手間がかかる 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  22. 22. ライブラリが複雑化 修正 修正 ライブラリ 修正 修正 修正 ページ ライブラリ動作確認 直感的でない結びつき 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  23. 23. 開発中だったら? 修正 修正 ライブラリ 修正 修正 修正 ページ 未完成動作確認 動作確認できない 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  24. 24. 複雑化したプログラム コードの記述と ブラウザでの動作確認 手間の増大8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  25. 25. それなら 動作確認しないで ひたすら開発?8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  26. 26. それはヤバイ8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  27. 27. テストの種類•ユニットテスト(単体テスト) クラスや関数を単体のテスト•結合テスト クラスや関数を組み合わせたテスト•ファンクショナルテスト(機能テスト) システムの機能の動作のテストブラウザでの動作確認は機能テスト 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  28. 28. ユニットテスト ユニットテストツールを学ぶ事で複雑なプログラムを快適にテストできる 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  29. 29. PHPUnitの基礎8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  30. 30. PHPUnit定番ユニットテストツールSebastian Bergman氏作 圧倒的な多機能さ 各種OSSも利用中PHPならこれで間違い無し8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  31. 31. PHPUnitの基礎 インストールテストケース作成・実行ケース内でのテクニック8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  32. 32. インストール8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  33. 33. インストール PEAR形式で提供コマンドラインからのイン ストールが必要pear config-set auto_discover 1pear install pear.phpunit.de/PHPUnit 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  34. 34. PEAR?PEAR(PHP Extension and Application Repository)はPHPで利用する事ができるライブラリ(パッケージ)を提供しているサービス。 PEARはPHPで書かれたライブラリを提供しているが、C言語で書かれた拡張ライブラリ(extension)を提供するPECLというサービスも存在する。インストールが完了すると、pearという同名のコマンドが利用できるようになっている。 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  35. 35. PEARのインストール先•通常のインストール /usr/lib/php/PHPUnit•個人用 (要Pyrus) /home/ユーザ名/ 内•プロジェクト用 (要Pyrus) プロジェクト内/vendor/ 内通常のインストールは複数共存に問題 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  36. 36. これからはPyruspyrus.pharをプロジェクト内に配置 (約10MBあるので時間かかる)8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  37. 37. Pyrusでのセットアップ例 適宜変更通常のインストールは複数共存に問題 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  38. 38. 準備OK8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  39. 39. テストケース作成・実行 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  40. 40. テストケース•テストを行う場合に書くプログラム•テスト対象のコードを実行•実行結果をアサートメソッドで確認•場合分けに応じてアサートを追加•phpunitコマンドで実行されるPHPUnitを使う=テストケースを書く 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  41. 41. テストケースの例 PHPUnitのクラスを継承 テストはtest○○という名前 テスト対象を実行 結果が想定と等しいかを検査8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  42. 42. テストケースの実行./vendor/bin/phpunit [テストケース名]        又は./vendor/bin/phpunit [ディレクトリ名]ディレクトリを指定すると配下のテスト ケースを全て実行する 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  43. 43. テストケースの実行 .が1つのテスト テスト項目を文字で表示 x がOKの意味(英語的)8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  44. 44. エラーがある場合 Fがエラー 失敗した検査の内容8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  45. 45. --colors で色つき8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  46. 46. PHPUnitのイメージ テストケース 修正 修正 テストケース ライブラリ 修正phpunit 修正 修正 テストケース ライブラリをコマンド1つで 高速にテストを実行可能 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  47. 47. 練習•Tankiyoクラスのテスト•テストケースを作成 tests/TankiyoTest.php•各メソッドへテストを記述•テストを実行 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  48. 48. 補足各テストケースはテスト対象のコードをrequireする必要があるautoload機構を使わない場合は適宜 require_once8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  49. 49. テストの重要点•テストケースは幅広く•テストはこまめに実行•テスト成功なら 同条件での挙動は同一•思い切ったコード変更へ! 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  50. 50. ケース内でのテクニック 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  51. 51. setUp / tearDown•テストメソッドの前後に実行される処理を記述できる•前処理や後始末が必要な場合に利用する•各テストの共通部分を統合8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  52. 52. setUp / tearDownの例 重複した初期化処理8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  53. 53. setUp / tearDownの例 テストメソッドの前後に実 行される処理になる8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  54. 54. アサーション•実行結果を検査するassertEquals()だけでかなり生きていける•他のメソッドは応用的•種類は増え続けている 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  55. 55. 超豊富なアサーションassertArrayHasKey() assertLessThanOrEqual()assertClassHasAttribute() assertNull()assertClassHasStaticAttribute() assertObjectHasAttribute()assertContains() assertRegExp()assertContainsOnly() assertStringMatchesFormat()assertCount() assertStringMatchesFormatFile()assertEmpty() assertSame()assertEqualXMLStructure() assertSelectCount()assertEquals() assertSelectEquals()assertFalse() assertSelectRegExp()assertFileEquals() assertStringEndsWith()assertFileExists() assertStringEqualsFile()assertGreaterThan() assertStringStartsWith()assertGreaterThanOrEqual() assertTag()assertInstanceOf() assertThat()assertInternalType() assertTrue()assertJsonFileEqualsJsonFile() assertXmlFileEqualsXmlFile()assertJsonStringEqualsJsonFile() assertXmlStringEqualsXmlFile()assertJsonStringEqualsJsonString() assertXmlStringEqualsXmlString()assertLessThan() 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  56. 56. assertEquals($a,$b)•$aがあるべき値•$bに実際の実行結果•一致しない場合はエラー(エラー時のメッセージを第3引数に渡せる)8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  57. 57. assertCount($num,$a)•$aが$num件かどうかを検査する•一致しない場合はエラー(エラー時のメッセージを第2引数に渡せる) 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  58. 58. assertTrue($a) assertFalse($a) assertEmpty($a) assertNull($a)•$aがtrue false 空 nullかどうかを検査する 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  59. 59. assertRegExp($reg,$a)•$aが$regの正規表現にマッチするかどうかを検査する 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  60. 60. アノテーション•特殊なコメントを記述•テストケースの実行時にさまざまなオプション設定•作者、依存、グループ等•種類は増え続けている 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  61. 61. アノテーションの例8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  62. 62. アノテーションの例8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  63. 63. テストケース生成•クラスからケースを生成•ケースからクラスを生成•あくまでひな形なのでテスト自体は自力で記述する•既存のコードの移行に便利8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  64. 64. SkeletonGenerator インストール php pyrus.phar install phpunit/PHPUnit_SkeletonGenerator 対象のクラス名とファイル名を指定 ./vendor/bin/phpunit-skelgen --test -- Kid ./lib/Kid.phpテストの出力先やrequireが足り ない点を補う必要がある 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  65. 65. 練習 Kid / HtmlKid•コマンドからケースを生成•適切な場所にケースを移動•require を補う•テストが実行できるか確認 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  66. 66. テストファースト•テストケースを先に記述してコードの挙動を決定•記述したテストケースを通過できるように開発•テスト駆動開発の典型例8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  67. 67. テストしづらいコード8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  68. 68. テストしづらい?•実際に開発を進めると発生•テストが書けない例が出る•テストの実行時間が長い•結果が不安定コードをテストしやすく修正しないと テストできない場合がある 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  69. 69. テストしづらい例 処理が外部のWebに依存8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  70. 70. テストしづらいコード•機能が外部に依存している(各種WebAPI)•データベースに存在しているデータに依存している•処理に時間がかかる部分8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  71. 71. 外部に依存 DB テストケース テストケース ライブラリphpunit テストケース API 実質、結合テストになっている 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  72. 72. モック•コードの中で外部に依存する部分をテスト時に別のものに置き換える手法8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  73. 73. モックできない Getterを直接newして使う 必ずGetterのgetを呼んでしまう8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  74. 74. モックできる! 処理に使うオブジェクトを注入 渡されたオブジェクトのgetを使う 渡ってくるのはGetterのオブジェクト とは限らない!8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  75. 75. モック用のクラス•自力でスタブを作成•PHPUnitの機能で生成も可 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  76. 76. モック利用例 スタブの生成 スタブの振る舞いを設定する部分 (すごい記述だが動く)8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  77. 77. 練習モックの利用•まずは元の状態のRecentクラスをテストしてみる•遅さを確認•モックを使ったテスト•実物を使ったテスト 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  78. 78. DBUnit•テスト用のDBを毎回生成•テスト後に全削除•データの状態に左右されずにデータベースを使ったテストを行う8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  79. 79. さらに効率良いテスト8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  80. 80. phpunit.xml•phpunitコマンドのオプションを記述しておく事でテスト実行が簡略化される•コマンドの引数と併用もできる 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  81. 81. phpunit.xml8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  82. 82. カバレッジレポート•テストがコードのどの部分を実行したかをレポート•xDebug拡張を導入する必要があるphpunit --coverage-html=/path/to/report 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  83. 83. カバレッジレポート8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  84. 84. カバレッジレポート8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  85. 85. 継続ビルド(CI)コードをコミットする度に自動でテスト実 行、レポート出力、アラート送信 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  86. 86. まとめ8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  87. 87. テストとCI•モダンな開発の定番 •フレームワーク •Gitによるコード管理 •ユニットテスト •継続ビルド 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)
  88. 88. PHPUnit•かなり抽象的なツール•進化も早いが一度覚えればそのまま使い続けられる•不毛な動作確認とバグから逃れる希望 8時間耐久PHPUnitの教室 / Yusuke Ando (@yando)

×