Magento 2 Modülleri için Entegrasyon Testleri Oluşturma


27

Şimdiye kadar Magento 2 test ihtiyaçlarım için, PHP Ünitesini (az ya da çok) bir kabul test cihazı olarak kullanıyorum - sunucu ve HTML isteklerinin sonuçları, sistemimin yüklü olduğu bir sisteme girdim. Kendi entegrasyon testlerimi oluşturabilmek istiyorum. Magento 2 ile birlikte verilen test araçları, üçüncü taraf geliştiricilerin Magento'nun test çerçevesi kodunu kullanan kendi entegrasyon testlerini oluşturmalarına izin veriyor mu? Yoksa hepimiz kendi önyüklememizi mi yapacağız?

Yani

  1. Ben bir Magento geliştiricisiyim
  2. Bir entegrasyon testi oluşturmak istiyorum
  3. Entegrasyon testimin, oynamak için tamamen önyükleyici bir Magento ortamına sahip olmasını isterdim (örneğin, nesne yöneticisi ve / veya bağımlılık enjeksiyonunu kullanmak)
  4. Entegrasyon sınavımın testi uzatmasını istiyorum, Magento\TestFramework\TestCase\AbstractControllerböylece Magento testleri ile aynı yardımcılara sahibim.
  5. Testlerimi tecritte yapabilmek istiyorum test takımının geri kalanından olarak (yani 15 saniyelik testlerimi çalıştırmak için 2 saat beklememize gerek yok)
  6. Testlerimin Magento'nun testlerinden ayrı olarak saklanmasını istiyorum

Dev docs sitesinde testle ilgili bazı başlangıç ​​makaleleri var, ancak Magento ile birlikte gelen testleri yürütmek ve kendi testlerinizi oluşturup çalıştırmamak gibi görünüyor. Orada eski örnek modülleri , ama hepsi uzatmak PHPUnit_Framework_TestCasesınıf ve görünmektedir birim testleri (Magento çerçevesinde dayanmaz yani test kodu)

Bunu yapmanın bir yolu var mı?

Olmazsa, herhangi biri Magento geliştirici topluluğunun testinin standart olarak benimseyebileceği şekilde kendi kurulumunu yaptı mı?

Yanıtlar:


20

Bu bizim için işe yarıyor ancak henüz 6. adrese ayırmak için ayrı bir yere gitmedik.)

1.) altında bütünleşme testleri yerleştirin dev/tests/integration/testsuite/Vendor
2.) kopyalamak dev/tests/integration/phpunit.dist.xml
için
dev/tests/integration/phpunit.xml

ve değiştir

        <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>

ile

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

3.) ../../../vendor/bin/phpunitveya ../../../vendor/bin/phpunit path/to/testsdev / test / Integration klasöründen çalıştırın.

Entegrasyon testlerinin en azından ilk olarak Magento'yu kurdukça ilk çalıştırmada 15 saniyeden uzun sürdüğünü lütfen unutmayın. Kullanırsanız sonraki çalıştırmaları kaydedebilirsiniz

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

senin içinde phpunit.xml


11

Ben başarıyla ayrı bir dizine benim entegrasyon testleri koydum: src/My/Module/test/integration. Başka herhangi bir dizin olabilir app/code/My/Module/Test.

Magento entegrasyon testleri için yeni test paketi olarak ekleyin: Kopyala dev/tests/integration/phpunit.xml.distiçin dev/tests/integration/phpunit.xmlve de aşağıdakileri ekleyin <testsuites>düğümü:

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

Ardından bu gibi testleri dizinden çalıştırın dev/tests/integration:

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

İle --testsuiteParametre tek bir test takımı seçebilir, böylece tüm entegrasyon testlerinin bir kerede çalıştırılmaması için

Güncelleme: Fikstür

Kendi fikstürlerini kullanmak için küçük bir geçici çözüm gerekliydi, çünkü Magento\TestFramework\Annotationfikstür taban dizininde genel olarak tanımlanıyordu. Ancak neyse ki Magento, yöntem adlarına da fikstür olarak izin veriyor, bu nedenle aşağıdakiler işe yarıyor:

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

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

1
@MagentoDataFixture here github.com/magento/magento2/blob/develop/dev/tests/integration/… özellikle modülden bir çekirdeği özel bir fikstürle birleştirirken sorun yaşamayacak mıydınız ?
Fooman'daki Kristof,

1
tbh Henüz denemedim ama bir sorun gibi görünüyor, evet. Bu fikstürlerin çalışması için dahil etme yolunu ayarlamak gerekebilir.
Fabian Schmengler

1
@KristofatFooman Fikstür için bir çözüm bulundu, güncelleme bakınız
Fabian Schmengler

Harika çözüm Burada birkaç kusur olabilir. Her şeyden önce, bir yazım hatası var - __DIR__bir eğik çizgi ( /_files) ile takip edilmelidir . İkincisi, fikstür TestFramework içinden yüklenir, böylece __DIR__gerçekte kendi modülünüzü değil TestFramework dizinini gösterir. Bunun ComponentRegistrariçin kullanılabilir:require $ObjectManager::getInstance()->get(ComponentRegistrar::class)->getPath('module', 'Foo_Bar').'/Test/Integration/_files/example.php';
Jisse Reitsma

10

Entegrasyon testleriyle biraz oynadım ve şimdiye dek bu buldum.

Temel olarak, Fooman'ın söylediğine benzer adımları izledim, entegrasyon testini yapmak için bazı farklılıklar modülümün bir parçası olacaktı.

İşte izlediğim adımlar:

1- Entegrasyon testlerinizi altına yerleştirin app/code/Vendor/CustomModule/Test/Integration

2- kopyalama dev/tests/integration/phpunit.dist.xmliçindev/tests/integration/phpunit.xml

ve değiştir

<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>

ile

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

3- Sonra CLI aracını kullanarak çalıştırıyorum bin/magento dev:test:run integration

Fooman'ın "TESTS_CLEANUP" hakkında söylediklerini ve temizleme özelliğini etkinleştirdiyseniz entegrasyon testlerini yapmak için geçen süreyi aklınızda bulundurmanız gerekir.

Burada daha fazla referans için işlevsel bir örnek ekliyorum. Magento armatürlerini kullanmanın yanı sıra, nesne yöneticisine nasıl erişebileceğinizi ve Magento sınıflarının bir örneğini oluşturabildiğinizi göreceksiniz.

Uygulamanın / kod / Satıcı / CustomModule / Kontrolör / Sipariş / ismi info.php olmalıdır

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);
    }

}

Uygulamanın / kod / Satıcı / CustomModule / etc / kullanıcı arayüzü / 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>

Uygulamanın / kod / Satıcı / 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>

Uygulamanın / kod / Satıcı / CustomModule / Test / Entegrasyon / Kontrolör / Sipariş / 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']);
    }
}

Uygulamanın / kod / Satıcı / CustomModule / registration.php

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

Magento çekirdeğinin armatürlerini kullandığınız sürece, kendi çözümünüzün iyi olduğunu ve işe yaradığını lütfen unutmayın. Kendi demirbaşlarınızı kullanmak istiyorsanız, daha önce tartışıldığı gibi konulara gireceksiniz.
Jisse Reitsma,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.