|
| 1 | +テスト |
| 2 | +===== |
| 3 | + |
| 4 | +大まかに言うと、テストには2つの種類が存在します。ユニットテストは、特定の関数の入力と出力をテストすることができます。機能テストは、あなたが閲覧するサイト上のページに対して "ブラウザ" を制御し、リンクをクリックしたり、フォームに記入を行ったり、ページ上の特定の物事を確認することができます。 |
| 5 | + |
| 6 | +ユニットテスト |
| 7 | +---------- |
| 8 | + |
| 9 | +ユニットテストは、Symfonyから独立したクラス内に存在すべき、あなたの "ビジネスロジック" をテストするために使用されます。この理由により、Symfonyは実際のところ、ユニットテストのためにあなたがどのツールを使用するかについて意見を持ちません。しかしながら、最もポピュラーなツールは `PhpUnit`_ と `PhpSpec`_ です。 |
| 10 | + |
| 11 | +機能テスト |
| 12 | +---------- |
| 13 | + |
| 14 | +真に優れた機能テストを作成することは困難であるため、一部の開発者は完全にこれを省略します。機能テストを省略しないでください!いくつかの *シンプルな* 機能テストを定義することで、いかなる大きなエラーであれ、それらをデプロイしてしまう前にすばやく発見できます。 |
| 15 | + |
| 16 | +.. best-practice:: |
| 17 | + |
| 18 | + 機能テストを定義することは、結局のところあなたのアプリケーションのページが正常にロードにされるかどうかチェックすることです。 |
| 19 | + |
| 20 | +機能テストは以下の例のように簡単です: |
| 21 | + |
| 22 | +.. code-block:: php |
| 23 | +
|
| 24 | + /** @dataProvider provideUrls */ |
| 25 | + public function testPageIsSuccessful($url) |
| 26 | + { |
| 27 | + $client = self::createClient(); |
| 28 | + $client->request('GET', $url); |
| 29 | +
|
| 30 | + $this->assertTrue($client->getResponse()->isSuccessful()); |
| 31 | + } |
| 32 | +
|
| 33 | + public function provideUrls() |
| 34 | + { |
| 35 | + return array( |
| 36 | + array('/'), |
| 37 | + array('/posts'), |
| 38 | + array('/post/fixture-post-1'), |
| 39 | + array('/blog/category/fixture-category'), |
| 40 | + array('/archives'), |
| 41 | + // ... |
| 42 | + ); |
| 43 | + } |
| 44 | +
|
| 45 | +このコードは全ての与えられたURLが正しくロードできることをチェックし、それは各HTTPレスポンスのステータスコードが ``200`` から ``299`` の間であることを意味します。 |
| 46 | +これは有用に見えないかもしれませんが、かかる労力がいかに少ないかを考慮すると、あなたのアプリケーションで行う価値があります。 |
| 47 | + |
| 48 | +コンピュータソフトウェアにおいて、この種のテストは `smoke testing`_ と呼ばれ、 *「将来のソフトウェアリリースを退けるほど深刻な、単純な失敗を発見にするための予備的なテスト」* で構成されます。 |
| 49 | + |
| 50 | +機能テスト内のハードコードされたURL |
| 51 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 52 | + |
| 53 | +皆さんのうち一部の方は何故、上記の機能テストがURLジェネレータサービスを使用していないのかを尋ねるかもしれません: |
| 54 | + |
| 55 | +.. best-practice:: |
| 56 | + 機能テストにおいては、URLジェネレータを使用する代わりに、URLのハードコードが使用されます。 |
| 57 | + |
| 58 | +テストページのURLを生成するために ``router`` サービスを使用した、以下の機能テストについて考えてみましょう。 |
| 59 | + |
| 60 | +.. code-block:: php |
| 61 | +
|
| 62 | + public function testBlogArchives() |
| 63 | + { |
| 64 | + $client = self::createClient(); |
| 65 | + $url = $client->getContainer()->get('router')->generate('blog_archives'); |
| 66 | + $client->request('GET', $url); |
| 67 | +
|
| 68 | + // ... |
| 69 | + } |
| 70 | +
|
| 71 | +これは動作するでしょうが、一つ大きな欠点があります。もし開発者が ``blog_archives`` ルートのパスを誤って変更した場合、テストは未だ成功しますが、元の(古い)URLは動作しなくなるでしょう!これは、そのURLに対する全てのブックマークが壊れ、あなたが全ての検索エンジンのページランキングを失うことを意味します。 |
| 72 | + |
| 73 | +JavaScriptの機能テスト |
| 74 | +~~~~~~~~~~~~~~~~~~~~~~ |
| 75 | + |
| 76 | +組み込みの機能テストクライアントは素晴らしいですが、それをあなたのページで、任意のJavaScriptの振る舞いをテストするために使用することはできません。もしあなたがこのテストを行う必要がある場合、PHPUnitの内部から、 `Mink`_ ライブラリを使用することを検討してください。 |
| 77 | + |
| 78 | +もちろん、もしもあなたが大規模なJavaScriptフロントエンドを使用している場合、純粋なJavaScriptベースのテストツールを検討すべきです。 |
| 79 | + |
| 80 | +機能テストについてさらに学ぶ |
| 81 | +~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 82 | + |
| 83 | +`Faker`_ と `Alice`_ ライブラリを使用して、あなたのテストフィクスチャのため実運用に近いデータを生成することを検討してください。 |
| 84 | + |
| 85 | + |
| 86 | +.. _`Faker`: https://github.com/fzaninotto/Faker |
| 87 | +.. _`Alice`: https://github.com/nelmio/alice |
| 88 | +.. _`PhpUnit`: https://phpunit.de/ |
| 89 | +.. _`PhpSpec`: http://www.phpspec.net/ |
| 90 | +.. _`Mink`: http://mink.behat.org |
| 91 | +.. _`smoke testing`: http://en.wikipedia.org/wiki/Smoke_testing_(software) |
0 commit comments