Successfully reported this slideshow.
一人でゲームをリリースするための自動化PHPUnit編~~ 目指せCoverage 100% ~すずな株式会社  代表取締役  中村悟PHPカンファレンス関西2013 (2013/6/1)
✤ 名前  中村悟✤ 所属  すずな株式会社  代表取締役✤ Twitter @cloned ((読み方::  クローンディー))✤ Blog http://d.hatena.ne.jp/cloned/✤ 略歴自己紹介営業マン派遣エンジニア
✤ インサイド  クリプト  よかったら遊んでね♪✤ https://play.google.com/store/apps/details?id=com.suzna.labyrinth.android44//2255  ゲームをリリースしました
✤ 誰が企画するのか✤ 誰が開発するのか✤ 誰がテストするのか✤ 誰がサーバ用意するのか✤ 誰が((rryy“一人でやる”ゲーム開発
あなたです
✤ 私が企画します✤ 私とSymfonyが開発します✤ PHPUnitがテストします✤ Chefがサーバ用意します✤ Jenkinsが(ry“一人でやる”には分身が必要
上記、すずなで実際に利用しているツールなどの一部です✤ 私が企画します✤ 私とSymfonyが開発します✤ PHPUnitがテストします✤ Chefがサーバ用意します✤ Jenkinsが(ry“一人でする”には分身が必要時間が短いので今日はココ...
✓ --coverage-htmlして現状を確認✓ time()やmt_rand()などを使うコードもテスト✓ 複雑なオブジェクトを使うコードもテスト✓ ファイルシステムを使うコードもテストCoverage 100%への道のり※注11※注11 ...
--coverage-htmlして現状を確認
✤ 弊社プロジェクトの場合✤ 開発のみで使うツール24% 全体95%--coverage-htmlして現状を確認
✤ とはいえ、100%のモジュールもたくさんあります!!--coverage-htmlして現状を確認
✤ --coverage-htmlの出力を見れば、どこがテストできてないか一目瞭然✤ 人間の目では判り難い間違いも・・・--coverage-htmlして現状を確認
✤ --coverage-htmlの出力を見れば、どこがテストできてないか一目瞭然✤ 人間の目では判り難い間違いも・・・--coverage-htmlして現状を確認rroollllbbaakkaa??
✤ すべてのコードをテストで実行していれば単純なttyyppooや、きっと動く筈(でも動かない)なコードの多くを排除できる✤ まずはここから始めましょう--coverage-htmlして現状を確認
time()やmt_rand()などを使うコードもテスト
time()やmt_rand()などを使うコードもテストclass Campaign{public function isEnabled(){// キャンペーンは5/31まで!return time() < strtotime(2013-06-...
time()やmt_rand()などを使うコードもテストclass Campaign{public function isEnabled(){// キャンペーンは5/31まで!return $this->getNow() < strtotime...
time()やmt_rand()などを使うコードもテストclass CampaignTest extends PHPUnit_Framework_TestCase{public function testIsEnabled(){$c = $th...
複雑なオブジェクトを使うコードもテスト
複雑なオブジェクトを使うコードもテストclass Kansai extends ContainerAware{public function __construct(ContainerInterface $container){$this->c...
複雑なオブジェクトを使うコードもテストpublic function getKansai($id){return $this->container->get(doctrine)->getManager()->getRepository(PhpC...
複雑なオブジェクトを使うコードもテスト$doctrine = $this->getMockBuilder(DoctrineBundleDoctrineBundleRegistry)->disableOriginalConstructor()->...
ファイルシステムを使うコードもテスト
ファイルシステムを使うコードもテスト✤ vfsStreamを使いましょう!✤ PHPUnitにドキュメントがあります✤ http://phpunit.de/manual/3.8/ja/test-doubles.html✤ vfsStreamのG...
ファイルシステムを使うコードもテスト✤ こんな感じで、仮想のURLに対してファイル操作してテストできるpublic function testAText() {vfsStreamWrapper::register();vfsStreamWrap...
まとめ✤ Coverage 100%を目指すためのTTiippssをほんの少し紹介しました。✤ 本番環境でPHP Parse errorとかPHP Fatalerrorとかを出すの、やめましょう。やめましょう。やめましょう。
ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

一人でゲームをリリースするための自動化 PHPUnit編 ~目指せCoverage 100%~

4,655 views

Published on

Coverage 100%への道のり
1. --coverage-htmlして現状を確認
2. time()やmt_rand()などを使うコードもテスト
3. 複雑なオブジェクトを使うコードもテスト
4. ファイルシステムを使うコードもテスト

Published in: Technology
  • Be the first to comment

一人でゲームをリリースするための自動化 PHPUnit編 ~目指せCoverage 100%~

  1. 1. 一人でゲームをリリースするための自動化PHPUnit編~~ 目指せCoverage 100% ~すずな株式会社 代表取締役 中村悟PHPカンファレンス関西2013 (2013/6/1)
  2. 2. ✤ 名前 中村悟✤ 所属 すずな株式会社 代表取締役✤ Twitter @cloned ((読み方:: クローンディー))✤ Blog http://d.hatena.ne.jp/cloned/✤ 略歴自己紹介営業マン派遣エンジニア
  3. 3. ✤ インサイド クリプト よかったら遊んでね♪✤ https://play.google.com/store/apps/details?id=com.suzna.labyrinth.android44//2255 ゲームをリリースしました
  4. 4. ✤ 誰が企画するのか✤ 誰が開発するのか✤ 誰がテストするのか✤ 誰がサーバ用意するのか✤ 誰が((rryy“一人でやる”ゲーム開発
  5. 5. あなたです
  6. 6. ✤ 私が企画します✤ 私とSymfonyが開発します✤ PHPUnitがテストします✤ Chefがサーバ用意します✤ Jenkinsが(ry“一人でやる”には分身が必要
  7. 7. 上記、すずなで実際に利用しているツールなどの一部です✤ 私が企画します✤ 私とSymfonyが開発します✤ PHPUnitがテストします✤ Chefがサーバ用意します✤ Jenkinsが(ry“一人でする”には分身が必要時間が短いので今日はココを話します♪
  8. 8. ✓ --coverage-htmlして現状を確認✓ time()やmt_rand()などを使うコードもテスト✓ 複雑なオブジェクトを使うコードもテスト✓ ファイルシステムを使うコードもテストCoverage 100%への道のり※注11※注11 ここでのCoverage 100%はすべてのケースという意味ではなくすべてのコードがテストで実行されるという意味です
  9. 9. --coverage-htmlして現状を確認
  10. 10. ✤ 弊社プロジェクトの場合✤ 開発のみで使うツール24% 全体95%--coverage-htmlして現状を確認
  11. 11. ✤ とはいえ、100%のモジュールもたくさんあります!!--coverage-htmlして現状を確認
  12. 12. ✤ --coverage-htmlの出力を見れば、どこがテストできてないか一目瞭然✤ 人間の目では判り難い間違いも・・・--coverage-htmlして現状を確認
  13. 13. ✤ --coverage-htmlの出力を見れば、どこがテストできてないか一目瞭然✤ 人間の目では判り難い間違いも・・・--coverage-htmlして現状を確認rroollllbbaakkaa??
  14. 14. ✤ すべてのコードをテストで実行していれば単純なttyyppooや、きっと動く筈(でも動かない)なコードの多くを排除できる✤ まずはここから始めましょう--coverage-htmlして現状を確認
  15. 15. time()やmt_rand()などを使うコードもテスト
  16. 16. time()やmt_rand()などを使うコードもテストclass Campaign{public function isEnabled(){// キャンペーンは5/31まで!return time() < strtotime(2013-06-01);}}class CampaignTest extends PHPUnit_Framework_TestCase{public function testIsEnabled(){えーっと・・・time()ってどうやってテストするんだっ!}}テストコード
  17. 17. time()やmt_rand()などを使うコードもテストclass Campaign{public function isEnabled(){// キャンペーンは5/31まで!return $this->getNow() < strtotime(2013-06-01);}protected function getNow(){return time();}}✤ せめてメソッドを分けるtime()をgetNow()に移動
  18. 18. time()やmt_rand()などを使うコードもテストclass CampaignTest extends PHPUnit_Framework_TestCase{public function testIsEnabled(){$c = $this->getMock(Campaign, array(getNow));$c->expects($this->at(0))->method(getNow)->will($this->returnValue(strtotime(2013-05-31)));$c->expects($this->at(1))->method(getNow)->will($this->returnValue(strtotime(2013-06-01)));$this->assertTrue($c->isEnabled(), キャンペーン中);$this->assertFalse($c->isEnabled(), キャンペーン終了);}}✤ メソッドが分かれていればテスト可能
  19. 19. 複雑なオブジェクトを使うコードもテスト
  20. 20. 複雑なオブジェクトを使うコードもテストclass Kansai extends ContainerAware{public function __construct(ContainerInterface $container){$this->container = $container;}public function getKansai($id){return $this->container->get(doctrine)->getManager()->getRepository(PhpConBundle:Kansai)->find($id);}}✤ こんな“関西さん”をDDBBから取得するSymfonyのコードがあったとして
  21. 21. 複雑なオブジェクトを使うコードもテストpublic function getKansai($id){return $this->container->get(doctrine)->getManager()->getRepository(PhpConBundle:Kansai)->find($id);}✤ どうやってdoctrineを生成するんだ!?✤ 仕方ない、DBにデータ入�れてテストするか。。。となりがち✤ これをユニットテストするのは苦しい
  22. 22. 複雑なオブジェクトを使うコードもテスト$doctrine = $this->getMockBuilder(DoctrineBundleDoctrineBundleRegistry)->disableOriginalConstructor()->setMethods(array(getManager))->getMock();✤ disableOriginalConstructor() を使ってコンストラクタをスキップしてモックを作る✤ time()のケースと同じくモックを使ったテストがすぐに始められる✤ ただし・・・✤ このメソッドは多くのことをやり過ぎなのでもっと分解しましょう✤ 実際のデータベースを使ったファンクショナルテストも書きましょう
  23. 23. ファイルシステムを使うコードもテスト
  24. 24. ファイルシステムを使うコードもテスト✤ vfsStreamを使いましょう!✤ PHPUnitにドキュメントがあります✤ http://phpunit.de/manual/3.8/ja/test-doubles.html✤ vfsStreamのGitHub✤ https://github.com/mikey179/vfsStream
  25. 25. ファイルシステムを使うコードもテスト✤ こんな感じで、仮想のURLに対してファイル操作してテストできるpublic function testAText() {vfsStreamWrapper::register();vfsStreamWrapper::setRoot(new vfsStreamDirectory(test_dir));$aText = vfsStream::url(test_dir) ./a.txt;touch($aText);$this->assertTrue(is_file($aText));}
  26. 26. まとめ✤ Coverage 100%を目指すためのTTiippssをほんの少し紹介しました。✤ 本番環境でPHP Parse errorとかPHP Fatalerrorとかを出すの、やめましょう。やめましょう。やめましょう。
  27. 27. ご清聴ありがとうございました

×