Magento 2モジュールの統合テストの作成


27

これまでのところ、Magento 2のテストニーズに合わせて、PHPユニットを(多少なりとも)受け入れテスターとして使用してきました。サーバーの結果をテストし、モジュールがインストールされたシステムにHTMLリクエストを送信しました。独自の統合テストを作成できるようにします。Magento 2に同梱されているテストツールを使用すると、サードパーティの開発者は、Magentoのテストフレームワークコードを活用する独自の統合テストを作成できますか?それとも、私たち全員が独自のブートストラップを展開しますか?

あれは

  1. 私はMagentoの開発者です
  2. 統合テストを作成したい
  3. 統合テストでは、Magento環境を完全にブートストラップして再生します(使用するオブジェクトマネージャーや依存関係の注入など)。
  4. 統合テストでテストを拡張しMagento\TestFramework\TestCase\AbstractControllerて、Magentoテストと同じヘルパーを使用したい
  5. テスト他のテストスイートから分離して実行できるようにしたい(つまり、15秒のテストを実行するのに2時間待つ必要がない)
  6. Magentoのテストとは別にテストを保存したい

dev docsサイトにはテストに関するいくつかのスターター記事がありますが、Magentoに同梱されているテストを実行することを目的としており、独自のテストを作成して実行することはしていません。古いサンプルモジュールがありますが、それらはすべてPHPUnit_Framework_TestCaseクラスを拡張し、単体テスト(つまり、Magentoフレームワークに依存しないコードのテスト)のようです。

これを行うMagento提供の方法はありますか?

そうでない場合、Magento開発者コミュニティのテストがそれを標準として採用できるように、誰かが独自のセットアップを展開しましたか?

回答:


20

これは機能しますが、まだアドレス6の別の場所に移動することを検討していません。

1.)の下に統合テストを置き、dev/tests/integration/testsuite/Vendor
2)をコピーdev/tests/integration/phpunit.dist.xml
します
dev/tests/integration/phpunit.xml

そして交換

        <directory suffix="Test.php">testsuite</directory>
        <directory suffix="Test.php">../../../update/dev/tests/integration/testsuite</directory>
        <exclude>testsuite/Magento/Test/Integrity</exclude>
        <exclude>testsuite/Magento/MemoryUsageTest.php</exclude>

        <directory suffix="Test.php">testsuite/Vendor</directory>

3.)それを実行する../../../vendor/bin/phpunit../../../vendor/bin/phpunit path/to/tests、dev / test / integrationフォルダーから

基本的にMagentoをインストールするため、少なくとも最初の実行では、統合テストに15秒以上かかることに注意してください。を使用すると、後続の実行で保存できます

<const name="TESTS_CLEANUP" value="disabled"/>

あなたの phpunit.xml


11

統合テストを別のディレクトリに正常に配置しました:src/My/Module/test/integration。のような他のディレクトリでも構いませんapp/code/My/Module/Test

それらをMagento統合テストに新しいテストスイートとして追加します。ノードに次をコピーdev/tests/integration/phpunit.xml.distdev/tests/integration/phpunit.xmlて追加し<testsuites>ます。

<testsuite name="My_Module">
    <directory suffix="Test.php">../../../src/My/Module/test</directory>
</testsuite>

次に、dev/tests/integrationディレクトリから次のようなテストを実行します。

../../../vendor/bin/phpunit --testsuite "My_Module"

では--testsuite、パラメータあなたはいないすべての統合テストを一度に実行されているように、名前で一つのテストスイートを選択することができます

更新:フィクスチャ

独自のフィクスチャを使用するにはMagento\TestFramework\Annotation、フィクスチャのベースディレクトリがグローバルに定義されているため、少しの回避策が必要でした。しかし幸いなことに、Magentoではメソッド名をフィクスチャとしても使用できるため、次のように機能します。

/**
 * @magentoDataFixture loadFixture
 */
public function testSomething()
{
}

public static function loadFixture()
{
    include __DIR__ . '_files/something_fixture.php';
}

1
@magentoDataFixtureを使用しているときは、ここで問題に実行しませんgithub.com/magento/magento2/blob/develop/dev/tests/integration/...コア1を使用して、モジュールからカスタム治具と組み合わせたときに特に?
クリストフ、フーマンで16年

1
まだ試していませんが、問題のように見えます。これらのフィクスチャを機能させるには、インクルードパスを設定する必要がある場合があります。
ファビアンシュメングラー16年

1
@KristofatFoomanフィクスチャーのソリューションが見つかりました。更新を参照してください
ファビアンシュメングラー

素晴らしい解決策。ここにはいくつかの欠陥があるかもしれません。まず、タイプミスが__DIR__あります- 後にスラッシュ(/_files)が続く必要があります。次に、フィクスチャがTestFramework内からロードされるため、__DIR__実際には独自のモジュールではなくTestFrameworkディレクトリをポイントします。ComponentRegistrarこのために使用することができますrequire $ObjectManager::getInstance()->get(ComponentRegistrar::class)->getPath('module', 'Foo_Bar').'/Test/Integration/_files/example.php';
Jisse Reitsma

10

私は統合テストで少し遊んだことがありますが、これは私がこれまでに見つけたものです。

基本的に、統合テストをモジュールの一部にするためにいくつかの違いはありますが、Foomanが言ったことと同様の手順を踏んでいます。

これらは私が従ったステップです:

1-統合テストを下に置きます app/code/Vendor/CustomModule/Test/Integration

2-コピーdev/tests/integration/phpunit.dist.xmldev/tests/integration/phpunit.xml

そして交換

<testsuite name="Magento Integration Tests">
    <directory suffix="Test.php">testsuite</directory>
    <directory suffix="Test.php">../../../update/dev/tests/integration/testsuite</directory>
    <exclude>testsuite/Magento/Test/Integrity</exclude>
    <exclude>testsuite/Magento/MemoryUsageTest.php</exclude>
</testsuite>

<testsuite name="Magento Integration Tests">
    <directory suffix="Test.php">../../../app/code/Vendor/CustomModule/Test/Integration</directory>
</testsuite>

3-次に、CLIツールを使用して実行します bin/magento dev:test:run integration

クリーンアップを有効にしている場合、Foomanが「TESTS_CLEANUP」と統合テストのセットアップに要する時間について述べていることを念頭に置く必要があります。

ここで、さらなる参考のために機能的な例を追加します。オブジェクトマネージャにアクセスし、Magentoフィクスチャを使用するだけでなく、Magentoクラスのインスタンスを生成する方法がわかります。

app / code / Vendor / CustomModule / Controller / Order / Info.php

namespace Vendor\CustomModule\Controller\Order;

use Magento\Framework\Controller\ResultFactory;

class Info
    extends \Magento\Framework\App\Action\Action
{
    /**
     * @param \Magento\Framework\App\Action\Context $context
     * @param \Magento\Sales\Api\OrderRepositoryInterface $orderRepository
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Sales\Api\OrderRepositoryInterface $orderRepository
    )
    {
        $this->orderRepository = $orderRepository;
        parent::__construct($context);
    }

    /**
     * Return Json OrderInfo
     *
     * @return \Magento\Framework\Controller\Result\Json $this
     */
    public function execute()
    {
        $orderId = $this->getRequest()->getParam('id');
        $order = $this->orderRepository->get($orderId);
        $orderInfo = [
            'total' => $order->getBaseGrandTotal()
        ];

        /** @var \Magento\Framework\Controller\Result\Json $result */
        $result = $this->resultFactory->create(ResultFactory::TYPE_JSON);
        return $result->setData($orderInfo);
    }

}

app / code / Vendor / CustomModule / etc / frontend / routes.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route id="vendor_custommodule" frontName="vendor_custommodule">
            <module name="Vendor_CustomModule"/>
        </route>
    </router>
</config>

app / code / Vendor / CustomModule / etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Vendor_CustomModule" setup_version="1.0.0">
        <sequence>
            <module name="Magento_Sales" />
        </sequence>
    </module>
</config>

app / code / Vendor / CustomModule / Test / Integration / Controller / Order / InfoTest.php

namespace Vendor\CustomModule\Controller\Order;

use Magento\TestFramework\TestCase\AbstractController;

class InfoTest extends AbstractController
{
    public function getOrderInfoActionDataProvider()
    {
        return [
            'order with one simple item' => [
                'incrementId' => '100000001',
                'contentType' => 'application/json',
                'orderTotal' => 100
            ]
        ];
    }

    /**
     * @dataProvider getOrderInfoActionDataProvider
     * @magentoDataFixture Magento/Sales/_files/order.php
     */
    public function testOrderInfoAction($incrementId, $expectedContentType, $expectedOrderTotal)
    {
        /** @var $objectManager \Magento\TestFramework\ObjectManager */
        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();

        /** @var \Magento\Sales\Model\OrderFactory $orderFactory */
        $orderFactory = $objectManager->get('Magento\Sales\Model\OrderFactory');
        $order = $orderFactory->create();
        $order->loadByIncrementId($incrementId);

        $this->dispatch("vendor_custommodule/order/info/id/{$order->getId()}");

        $contentType = $this->getResponse()->getHeader('Content-Type');
        $this->assertEquals($expectedContentType, $contentType->getFieldValue());

        $responseJson = $this->getResponse()->getBody();
        $responseArray = json_decode($responseJson, true);
        $this->assertEquals($expectedOrderTotal, $responseArray['total']);
    }
}

app / code / Vendor / CustomModule / registration.php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Vendor_CustomModule',
    __DIR__
);

Magentoコアのフィクスチャを使用している限り、独自のソリューションは問題なく機能します。独自のフィクスチャを使用する場合は、前述の問題にぶつかります。
Jisse Reitsma
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.