1. ホーム
  2. php

テストをまとめるための PHPUnit のベストプラクティス

2023-09-02 05:35:37

質問

私は現在、あるプロジェクトのためにphpunitのテストをゼロから始めようとしています。そこで、私はいくつかのプロジェクト(Zendなど)を調べて、彼らがどのように物事を行い、どのようにテストを組織しているかを見ていました。

ほとんどのことは非常に明確ですが、唯一の問題は、テストスイートを適切に組織化する方法です。 Zend には AllTests.php があり、そこから他のテスト スイートをロードします。

使用しているクラスを見るのは難しいです。 PHPUnit_Framework_TestSuite を使ってスイートオブジェクトを作成し、そこに他のスイートを追加しているようですが、 PHPUnit のドキュメントで 3.4 以降のバージョンのテストを整理する方法を調べても、 XML あるいは FileHierarchy の記述しかありません。クラスを使用してテストを整理するものは削除されました。

この方法が非推奨であるという情報はなく、Zendのようなプロジェクトではまだ使っているようです。

しかし、もしそれが非推奨であるなら、どのように私はxml構成と同じ構造でテストを整理することができるのでしょうか?すべてのテストを実行することは問題ありませんが、いくつかのテストだけを実行したい場合、(xml で)どのようにテストを整理するのでしょうか。おそらく、実行するいくつかのテスト/テストスイートのみを指定するいくつかのxmlを作成するのでしょうか?

私がアプリケーションのモジュール1とモジュール2のみをテストしたい場合、私はそれぞれのために余分なxmlを持ち、その中でそれらのモジュール(モジュールによって使用されるクラス)だけのためにテストスイートを定義するのでしょうか。また、すべてのテストのためのテストスイートを定義するものですか?

それとも @group アノテーションを使用した方が良いのでしょうか?

いくつかのベストプラクティスを指摘してくれることに感謝します。

どのように解決するのですか?

まずはマニュアルにリンクして、私が現場で見聞きしたことを紹介します。

phpunitのテストスイートを整理する

ファイルシステムにおけるモジュール/テストフォルダの構成

私の推奨するアプローチは、ファイルシステムと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 モードを最初から使用して、決してオフにしないでください。

見るべきサンプルプロジェクト