Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ひよこテスト駆動開発 
- PHPとユニットテストとJenkinsとGitHubの話 - 
株式会社サイバード 大西啓太郎
自己紹介 
• 名前: 大西啓太郎 @Dollhyn_kei 
• 株式会社サイバード 
ゲーム事業本部 恋愛ゲーム技術チーム所属 
• エンジニア歴: 新卒1年目、半年が過ぎました 
• 普段のお仕事:  
・女性向け恋愛ゲームのサーバーサイ...
実際にプロジェクトで 
ユニットテストをはじめて使った時 
にハマったことを 
簡単にまとめてみました。 
PHPUnitを使っています。
今日のアジェンダ 
• DBを使ったユニットテストとスローテス 
ト問題 
• Jenkins・GitHubを使ったテストの自動化 
• テストコードのアンチパターン 
• まとめ
DBを使ったユニットテ 
ストとスローテスト問題
チームの状況 
• 実DB(MYSQL)を使ってDB処理 
をテストしたい! 
• モックは使いたくない! 
• 本番に近いデータでテストがしたい
DBを使ったユニットテスト 
を実行出来る条件 
• DB/テーブルが存在する 
• マスタデータが存在する 
• 不要なレコードに干渉されない
ダメだったやりかた
1つのテストが走るたびに 
マスターデータが読み込まれる
1つのテストが終了する際には 
すべてデータを『TRUNCATE』して掃除する
流石にテストにかかる時間が 
長くなってしまった。
やっぱり、最初のロード処理と 
最後のTRUNCATE処理がボトルネックに
マスターデータの読み込みは 
一番最初に実行されるテストクラス 
(データセットアップ用クラス)でのみロードする 
テストが実行されるたびに 
新しいユーザーデータを発行することで 
『TRUNCATE』を不要にしました。
イメージ(以前) 
user_id: 001_t 
test_hoge() 
TRUNCATE 
LOAD 
ユーザー作成 
user_id: 001_t 
test_fuga() 
TRUNCATE 
LOAD 
ユーザー作成 
user_i...
user_id: 001_t 
test_hoge() 
TRUNCATE 
LOAD 
ユーザー作成 
user_id: 002_t 
test_fuga() 
ユーザー作成 
user_id: 003_t 
test_piyo() 
ユーザ...
user_id: 001_t 
test_hoge() 
TRUNCATE 
LOAD 
ユーザー作成 
user_id: 002_t 
test_fuga() 
ここが浮きます 
ユーザー作成 
user_id: 003_t 
test_pi...
Jenkins・GitHubを使った 
ユニットテストの自動化
開発の進め方
出てきた問題点 
• 複数のユニットテストのジョブが回っている時に 
DBの整合性を保証ができない 
• ジョブを複数実行できず、待ちが発生して『プル 
リク』→『レビュー』→『マージ』→『デプロイ』 
をスムーズに行えない 
• マイグレーシ...
解決策 
ジョブの実行毎に新しいDBを作る。
ビルド時の環境変数をもとに 
CREATE DATABASEを発行! 
CREATE DATABASE 
HOGE_${BUILD_NUMBER}
テストコードの 
アンチパターン
アンチパターン1 
『assertXXX(expected, actual)』 
の引数の順番が逆
期待値に検証対象の値が・・・
テストが失敗した際の 
メッセージの文脈が逆になってしまう
アンチパターン2 
1つのテストケースに 
複数のアサーション
なにをテストしたいかが 
よくわからない
1テストケース 
1メソッドを守ればスッキリ
アンチパターン3 
類似なテストケース
引数が違うだけ・・・
@dataProviderでスッキリ
まとめ
まとめ 
• まずは、PHPユニットのドキュメントをじっく 
り目を通す! 
• テストで扱うデータの初期化・破棄には気をつ 
ける! 
• Jenkinsでテストする場合はビルド毎に 
DBを作成する!
ご静聴、 
ありがとうございました
Upcoming SlideShare
Loading in …5
×

ひよこテスト駆動開発(PHPカンファレンス2014)

3,467 views

Published on

PHPカンファレンス2014で発表させていただいた資料です。

Published in: Technology
  • Be the first to comment

ひよこテスト駆動開発(PHPカンファレンス2014)

  1. 1. ひよこテスト駆動開発 - PHPとユニットテストとJenkinsとGitHubの話 - 株式会社サイバード 大西啓太郎
  2. 2. 自己紹介 • 名前: 大西啓太郎 @Dollhyn_kei • 株式会社サイバード ゲーム事業本部 恋愛ゲーム技術チーム所属 • エンジニア歴: 新卒1年目、半年が過ぎました • 普段のお仕事:  ・女性向け恋愛ゲームのサーバーサイド開発 ・最近はJavaScriptでクライアントも • プライベートな開発 ・Ruby > PHP ・iOS, Androidのアプリなんかもやっています
  3. 3. 実際にプロジェクトで ユニットテストをはじめて使った時 にハマったことを 簡単にまとめてみました。 PHPUnitを使っています。
  4. 4. 今日のアジェンダ • DBを使ったユニットテストとスローテス ト問題 • Jenkins・GitHubを使ったテストの自動化 • テストコードのアンチパターン • まとめ
  5. 5. DBを使ったユニットテ ストとスローテスト問題
  6. 6. チームの状況 • 実DB(MYSQL)を使ってDB処理 をテストしたい! • モックは使いたくない! • 本番に近いデータでテストがしたい
  7. 7. DBを使ったユニットテスト を実行出来る条件 • DB/テーブルが存在する • マスタデータが存在する • 不要なレコードに干渉されない
  8. 8. ダメだったやりかた
  9. 9. 1つのテストが走るたびに マスターデータが読み込まれる
  10. 10. 1つのテストが終了する際には すべてデータを『TRUNCATE』して掃除する
  11. 11. 流石にテストにかかる時間が 長くなってしまった。
  12. 12. やっぱり、最初のロード処理と 最後のTRUNCATE処理がボトルネックに
  13. 13. マスターデータの読み込みは 一番最初に実行されるテストクラス (データセットアップ用クラス)でのみロードする テストが実行されるたびに 新しいユーザーデータを発行することで 『TRUNCATE』を不要にしました。
  14. 14. イメージ(以前) user_id: 001_t test_hoge() TRUNCATE LOAD ユーザー作成 user_id: 001_t test_fuga() TRUNCATE LOAD ユーザー作成 user_id: 001_t test_piyo() TRUNCATE LOAD ユーザー作成
  15. 15. user_id: 001_t test_hoge() TRUNCATE LOAD ユーザー作成 user_id: 002_t test_fuga() ユーザー作成 user_id: 003_t test_piyo() ユーザー作成 イメージ(いま)
  16. 16. user_id: 001_t test_hoge() TRUNCATE LOAD ユーザー作成 user_id: 002_t test_fuga() ここが浮きます ユーザー作成 user_id: 003_t test_piyo() ユーザー作成 イメージ(いま)
  17. 17. Jenkins・GitHubを使った ユニットテストの自動化
  18. 18. 開発の進め方
  19. 19. 出てきた問題点 • 複数のユニットテストのジョブが回っている時に DBの整合性を保証ができない • ジョブを複数実行できず、待ちが発生して『プル リク』→『レビュー』→『マージ』→『デプロイ』 をスムーズに行えない • マイグレーションが扱いにくい
  20. 20. 解決策 ジョブの実行毎に新しいDBを作る。
  21. 21. ビルド時の環境変数をもとに CREATE DATABASEを発行! CREATE DATABASE HOGE_${BUILD_NUMBER}
  22. 22. テストコードの アンチパターン
  23. 23. アンチパターン1 『assertXXX(expected, actual)』 の引数の順番が逆
  24. 24. 期待値に検証対象の値が・・・
  25. 25. テストが失敗した際の メッセージの文脈が逆になってしまう
  26. 26. アンチパターン2 1つのテストケースに 複数のアサーション
  27. 27. なにをテストしたいかが よくわからない
  28. 28. 1テストケース 1メソッドを守ればスッキリ
  29. 29. アンチパターン3 類似なテストケース
  30. 30. 引数が違うだけ・・・
  31. 31. @dataProviderでスッキリ
  32. 32. まとめ
  33. 33. まとめ • まずは、PHPユニットのドキュメントをじっく り目を通す! • テストで扱うデータの初期化・破棄には気をつ ける! • Jenkinsでテストする場合はビルド毎に DBを作成する!
  34. 34. ご静聴、 ありがとうございました

×