私が提案した解決策とその背後にある理由:
フォルダ レイアウト:
.
├── src
│ ├── bar
│ │ └── BarAwesomeClass.php
│ └── foo
│ └── FooAwesomeClass.php
└── tests
├── helpers
│ └── ProjectBaseTestClassWithHelperMethods.php
├── integration
│ ├── BarModuleTest.php
│ └── FooModuleTest.php
└── unit
├── bar
│ └── BarAwesomeClassTest.php
└── foo
└── FooAwesomeClassTest.php
フォルダーには、helpers/
テストではなく、テスト コンテキストでのみ使用されるクラスが含まれています。通常、そのフォルダーには BaseTestClass が含まれている可能性があり、プロジェクト固有のヘルパー メソッドといくつかの簡単に再利用できるスタブ クラスが含まれているため、それほど多くのモックは必要ありません。
このintegration/
フォルダーには、より多くのクラスにまたがるテストと、システムの「より大きな」部分をテストするテストが含まれています。それらの数はそれほど多くありませんが、本番クラスへの 1:1 のマッピングはありません。
unit/
フォルダは に 1:1 でマッピングされますsrc/
。したがって、すべてのプロダクション クラスには、そのクラスのすべての単体テストを含む 1 つのクラスがあります。
名前空間
アプローチ 1: 各 TestCase クラスを対象クラスと同じ名前空間に配置します。
このフォルダー アプローチは、アプローチ 1の欠点の 1 つを解決するはずです。純粋な 1:1 マッピングよりも多くのテストを柔軟に行うことができますが、すべてが整然と配置されています。
名前空間の使用の背後にある原則を破っているようです - 無関係なテストは同じ名前空間にグループ化されます。
テストが「無関係」であると感じた場合、製品コードに同じ問題がある可能性がありますか?
テストが相互に依存していないことは事実ですが、「近い」クラスをモックとして使用するか、DTO または値オブジェクトの場合は実際のクラスを使用する可能性があります。だから、関係があると言えます。
アプローチ 2: 各 TestCase を、対象となるクラスにちなんで名付けられた名前空間に配置します。
それを行うプロジェクトがいくつかありますが、通常は少し異なる構造になっています。
ではありません\SomeFramework\Utilities\AwesomeClass\Test
が\SomeFramework\Tests\Utilities\AwesomeClassTest
、1:1 のマッピングは維持されますが、テスト用の名前空間が追加されています。
追加のテスト名前空間
私の個人的な見解は、テスト用の名前空間を別々にするのは好きではないということです。そのため、その選択に対する賛否両論をいくつか見つけようと思います。
テストは、クラスの使用方法に関するドキュメントとして機能する必要があります
実際のクラスが別の名前空間にある場合、テストはそのクラスを独自のモジュールの外で使用する方法を示します。
実際のクラスが同じ名前空間にある場合、テストはそのモジュール内からそのクラスを使用する方法を示します。
違いはごくわずかです (通常、いくつかの「use」ステートメントまたは完全修飾パス)。
$this->getMock(AwesomeClass::CLASS)
PHP 5.5 では、$this->getMock('\SomeFramework\Utilities\AwesomeClass')
すべてのモックの代わりに use ステートメントが必要になる可能性があります。
私にとって、モジュール内での使用は、ほとんどのクラスにとってより価値があります
「プロダクション」ネームスペースの汚染
あなたが言うと、new \SomeFramework\Utilities\A
オートコンプリートが表示されるかもしれませんが、それを望まない人もいます。外部で使用する場合、またはソースを出荷する場合は、テストが出荷されないため、もちろん問題ではありませんが、考慮すべきことかもしれません。AwesomeClass
AwesomeClassTest