モジュールを作成するとき、アプリケーションの最も重要な部分の単体テストをモジュールに提供しようとしています。ただし、現時点(Magento 2.1.3)では、単体テストの作成方法についていくつかの方法があります。
さまざまなテスト方法
- それを統合し、
bin/magento dev:tests:run unit
Magentoにバンドルされているデフォルトのphpunit設定の上で実行します。 - それらを別々に
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
記述し、実行して、Magentoであるすべてをモックします。 - それらを個別に記述し、すべてをモックし、PHPUnitのシステムグローバルバージョンを使用します。
- それらを別々に記述し、で実行しますが
vendor/bin/phpunit
、それでも利用し\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
ます。
Magento 2およびPHPUnit
それに加えて、Magento 2にはPHPUnit 4.1.0がバンドルされており、PHP7互換ではありません。ネイティブ型(string
およびintなど)を型ヒントし、署名で戻り値の型を宣言すると、エラーがスローされます。たとえば、次のようなメソッドシグネチャを持つインターフェイス/クラス:
public function foo(string $bar) : bool;
... PHPUnit 4.1.0でモックすることはできません。:-(
私の現在の状況
このため、私はほとんどの場合、3番目の方法(システムグローバルなPHPUnitバージョンを呼び出すこと)で単体テストを書いています。
私の設定では、PHPUnit 5.6がグローバルにインストールされているため、適切なPHP7コードを記述して解決できますが、いくつかの調整が必要です。例えば:
phpunit.xml
コンポーザーオートローダーを使用できるように、次のようにする必要があります。
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
...そして、私のすべての- setUp()
メソッドでは、次のチェックを行っているので、前方互換性でテストを書くことができます:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
このように、Magentosの組み込みPHPUnitでテストを実行すると、エラーはスローされません。
私の質問
だからここに私の質問があります:これは単体テストを書く「健康な」方法ですか?なぜなら、Magentoにはテストを支援するためのツールが多数バンドルされているのは正しくないと思われ、PHP7を使用しているため使用できません。この問題に対処するGitHubのチケットがあることは知っていますが、コミュニティが現在どのようにテストを書いているのでしょうか。
Magento 2でユニットテストを書く方法はありますか?コードを「ダウングレード」する必要はなく、Magentoのビルトインヘルパーを使用してオブジェクトマネージャーが触れるすべてをモックできますか?または、単体テストでもオブジェクトマネージャーを使用するのは悪い習慣ですか?
独自のカスタムモジュールを単体テストする方法に関する適切な方法について、多くのガイダンス/例が不足しています。