テストをまとめるための PHPUnit のベストプラクティス
質問
私は現在、あるプロジェクトのためにphpunitのテストをゼロから始めようとしています。そこで、私はいくつかのプロジェクト(Zendなど)を調べて、彼らがどのように物事を行い、どのようにテストを組織しているかを見ていました。
ほとんどのことは非常に明確ですが、唯一の問題は、テストスイートを適切に組織化する方法です。
Zend には AllTests.php があり、そこから他のテスト スイートをロードします。
使用しているクラスを見るのは難しいです。
PHPUnit_Framework_TestSuite
を使ってスイートオブジェクトを作成し、そこに他のスイートを追加しているようですが、 PHPUnit のドキュメントで 3.4 以降のバージョンのテストを整理する方法を調べても、 XML あるいは FileHierarchy の記述しかありません。クラスを使用してテストを整理するものは削除されました。
この方法が非推奨であるという情報はなく、Zendのようなプロジェクトではまだ使っているようです。
しかし、もしそれが非推奨であるなら、どのように私はxml構成と同じ構造でテストを整理することができるのでしょうか?すべてのテストを実行することは問題ありませんが、いくつかのテストだけを実行したい場合、(xml で)どのようにテストを整理するのでしょうか。おそらく、実行するいくつかのテスト/テストスイートのみを指定するいくつかのxmlを作成するのでしょうか?
私がアプリケーションのモジュール1とモジュール2のみをテストしたい場合、私はそれぞれのために余分なxmlを持ち、その中でそれらのモジュール(モジュールによって使用されるクラス)だけのためにテストスイートを定義するのでしょうか。また、すべてのテストのためのテストスイートを定義するものですか?
それとも
@group
アノテーションを使用した方が良いのでしょうか?
いくつかのベストプラクティスを指摘してくれることに感謝します。
どのように解決するのですか?
まずはマニュアルにリンクして、私が現場で見聞きしたことを紹介します。
ファイルシステムにおけるモジュール/テストフォルダの構成
私の推奨するアプローチは、ファイルシステムとxmlコンフィグを組み合わせることです。
tests/
\ unit/
| - module1
| - module2
- integration/
- functional/
には
phpunit.xml
を使って、シンプルに
<testsuites>
<testsuite name="My whole project">
<directory>tests</directory>
</testsuite>
</testsuites>
テストスイートを分割することもできますが、それはプロジェクトごとに選択することになります。
実行中
phpunit
を実行すると、すべてのテストが実行され
phpunit tests/unit/module1
を実行すると、module1 のすべてのテストが実行されます。
unit"フォルダの構成
ここで最も一般的なアプローチは
source/
ディレクトリ構造を
tests/unit/
フォルダー構造に追加します。
どうせProductionClassごとにTestClassが1つあるのだから、良い方法だと思う。
ファイル構成で
- 1ファイルにつき1クラス。
1つのファイルに複数のテストクラスがあると、とにかくうまくいかないので、その落とし穴を避けましょう。
- テストの名前空間がない
testClass は本番クラスと同じ名前空間に置くべきだと思いますが、 これは PHPUnit が強制することではありません。しかし、これは PHPUnit が強制することではありません。
少数のテストのみを実行する
例えば
phpunit --filter Factory
はすべての FactoryTests を実行し、一方
phpunit tests/unit/logger/
はロギングに関連する全てのテストを実行します。
を使うことができます。
@group
タグを使うことができますが、モジュールにはフォルダー・レイアウトを使用します。
複数の xml ファイル
複数のxmlファイルが必要な場合、複数のxmlファイルを作成すると便利です。
- コードカバレッジのないもの
- 単体テストのみ(機能テスト、統合テスト、長時間実行テストは含まない)。
- その他の一般的なフィルターケース
-
例えば PHPBB3 は
their phpunit.xmls
テストのコードカバレッジ
テストを含む新しいプロジェクトを開始することに関連しているため。
-
私の提案は
@covers
タグを使うことです。 を使うことをお勧めします。 (ユニットテストの場合のみ、公開されていない関数はすべてカバーし、常にcoverタグを使用します。 - 統合テストのカバレッジを生成しないでください。誤った安心感を与えてしまいます。
- 数値が嘘をつかないように、常にホワイトリストを使ってすべてのプロダクションコードを含めるようにしましょう!
テストのオートローディングとブートストラップ
テストの自動読み込みは必要ありません。PHPUnit がそれをやってくれます。
を使用します。
<phpunit bootstrap="file">
属性を使って、テスト用のブートストラップを指定します。
tests/bootstrap.php
は、それを置くのに良い場所です。そこで、アプリケーションのオートローダなどを設定することができます (あるいは、そのためにアプリケーションのブートストラップを呼び出すこともできます)。
概要
- ほとんどの場合、xml 設定を使用する
- ユニットテストと統合テストを分離する
- ユニットテストのフォルダは、アプリケーションのフォルダ構造を反映する必要があります。
-
特定のテストだけを実行するには
phpunit --filter
またはphpunit tests/unit/module1
-
を使用します。
strict
モードを最初から使用して、決してオフにしないでください。
見るべきサンプルプロジェクト
- Sebastian Bergmanns "Bank Account" プロジェクト例
- phpBB3 それでも彼らはそのレガシーでいくらか戦わなければならない ;)
- symfony2
- Doctrine2
関連
-
[解決済み】空の配列要素を削除する
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】Xampp ローカルホスト/ダッシュボード
-
[解決済み】「Fatal error: Class 'MySQLi' not found "を解決するには?
-
[解決済み] [Solved] Fatal error: 非オブジェクトのメンバ関数fetch_assoc()の呼び出し [重複]。
-
[解決済み】PHPUnitでprotectedメソッドをテストするためのベストプラクティス
-
[解決済み] phpunitに失敗したときに停止するように指示する方法
-
[解決済み] PHPunitでテストをスキップするには?
-
[解決済み] PHPUnit - 設定ファイルを使用すると「テストが実行されない」。
-
[解決済み] PHPUnit。クラス内のすべてのテストに対して一度だけ呼び出される関数を作成するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Fatal error: 未定義の関数 sqlsrv_connect() を呼び出した。
-
[解決済み】phpのob_start()の使い道は?
-
[解決済み] 整形されていない数値が発生しました。
-
[解決済み】「初期通信パケットの読み込み」でMySQLサーバーに接続できなくなり、システムエラーになる。0
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み】PHPからPythonスクリプトを実行する
-
[解決済み】子テーマのCSSが親テーマをオーバーライドしない
-
[解決済み】Laravel 5.2 Storage::makeDirectory($dir) でディレクトリが作成されない。
-
[解決済み】メッセージ。Trying to access array offset on value of type null [重複]配列のオフセットにアクセスしようとしています。
-
[解決済み] mysqli_fetch_assoc() は、パラメータ 1 が mysqli_result であることを期待し、boolean が与えられる [重複] 。