Magento 2 मॉड्यूल के लिए एकीकरण टेस्ट बनाना


27

अब तक मेरी Magento 2 परीक्षण आवश्यकताओं के लिए, मैं एक स्वीकृति परीक्षक के रूप में (अधिक या कम) PHP इकाई का उपयोग कर रहा हूं - सर्वर और HTML अनुरोधों के परीक्षण परिणामों को मेरे मॉड्यूल (सिस्टम) में स्थापित किया गया है। मैं अपना एकीकरण परीक्षण बनाने में सक्षम होना चाहूंगा। Magento 2 के साथ जहाज परीक्षण उपकरण क्या तीसरे पक्ष के डेवलपर्स को अपने एकीकरण परीक्षण बनाने की अनुमति देते हैं जो Magento के परीक्षण ढांचे कोड का लाभ उठाते हैं? या हम सब अपने अपने बूटस्ट्रैप को रोल कर रहे होंगे?

अर्थात्

  1. मैं एक Magento डेवलपर हूं
  2. मैं एक एकीकरण परीक्षण बनाना चाहूंगा
  3. मैं अपने एकीकरण परीक्षण का उपयोग करने के लिए (यानी ऑब्जेक्ट मैनेजर और / या निर्भरता इंजेक्शन का उपयोग करने के लिए) खेलने के लिए पूरी तरह से बूटस्ट्रैप Magento का वातावरण है
  4. मैं अपने एकीकरण परीक्षण का विस्तार करना चाहूंगा Magento\TestFramework\TestCase\AbstractControllerताकि मेरे पास मैगेंटो परीक्षणों के समान सहायक हों
  5. मैं टेस्ट सूट के बाकी हिस्सों से अलगाव में अपने परीक्षण चलाने में सक्षम होना चाहता हूं (अर्थात मेरे 15 सेकंड के परीक्षणों को चलाने के लिए 2 घंटे इंतजार नहीं करना पड़ता)
  6. मुझे अपने परीक्षण मैगेंटो के परीक्षणों से अलग जमा करने चाहिए

देव डॉक्स साइट के परीक्षण पर कुछ स्टार्टर लेख हैं, लेकिन वे उन परीक्षणों को चलाने में उन्मुख लगते हैं जो मैगनेटो के साथ जहाज करते हैं और अपने स्वयं के परीक्षण नहीं बनाते और चलाते हैं। नहीं है पुराने नमूना मॉड्यूल , लेकिन वे सभी का विस्तार PHPUnit_Framework_TestCaseवर्ग और होने लगते हैं इकाई परीक्षण (यानी परीक्षण कोड है कि 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देव / परीक्षण / एकीकरण फ़ोल्डर से

कृपया ध्यान दें कि एकीकरण परीक्षण में 15 सेकंड से अधिक समय लगता है, कम से कम पहले चलाने पर क्योंकि यह अनिवार्य रूप से मैगनेटो को स्थापित करता है। यदि आप उपयोग करते हैं तो आप बाद के रन पर बचत कर सकते हैं

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

अपने में phpunit.xml


11

मैंने अपने एकीकरण परीक्षणों को सफलतापूर्वक एक अलग निर्देशिका में रखा है src/My/Module/test/integration:। यह किसी भी अन्य निर्देशिका के रूप में अच्छी तरह से हो सकता है app/code/My/Module/Test

मैगेंटो एकीकरण परीक्षणों में उन्हें नए टेस्ट सूट के रूप में जोड़ें : नोड में निम्नलिखित dev/tests/integration/phpunit.xml.distको कॉपी करें dev/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
tbh मैंने अभी तक इसकी कोशिश नहीं की, लेकिन यह एक समस्या की तरह लग रहा है, हाँ। इन जुड़नार काम करने के लिए शामिल पथ निर्धारित करने के लिए आवश्यक हो सकता है।
फाबियन शेंगलर

1
@KristofatFooman जुड़नार के लिए एक समाधान मिला, अद्यतन देखें
Fabian Schmengler

महान समाधान। यहां कुछ खामियां हो सकती हैं। सबसे पहले, एक टाइपो है - __DIR__एक स्लैश ( /_files) द्वारा पीछा किया जाना चाहिए । दूसरा, फ़िक्चर को TestFramework के भीतर से लोड किया जाता है ताकि __DIR__वास्तव में TestFramework निर्देशिका को इंगित किया जा सके और आपका अपना मॉड्यूल न हो। इस के ComponentRegistrarलिए इस्तेमाल किया जा सकता है:require $ObjectManager::getInstance()->get(ComponentRegistrar::class)->getPath('module', 'Foo_Bar').'/Test/Integration/_files/example.php';
Jisse Reitsma

10

मैंने एकीकरण परीक्षणों के साथ थोड़ा सा खेला है, और यही मैंने अब तक पाया है।

मूल रूप से, फोमेन ने जो कहा, मैंने कुछ इसी तरह के कदमों का पालन किया है ताकि एकीकरण परीक्षण को मेरे मॉड्यूल का हिस्सा बनाया जा सके।

ये चरण हैं जिनका मैंने अनुसरण किया है:

1- अपने एकीकरण परीक्षण के तहत रखें app/code/Vendor/CustomModule/Test/Integration

2- कॉपी dev/tests/integration/phpunit.dist.xmlकरेंdev/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

आपको यह ध्यान में रखना चाहिए कि फोमन "TESTS_CLEANUP" के बारे में क्या कहता है और यदि आपको क्लीनअप सक्षम है तो एकीकरण परीक्षणों को सेटअप करने में समय लगता है।

यहां मैं आगे के संदर्भ के लिए एक कार्यात्मक उदाहरण जोड़ता हूं। आप देखेंगे कि आप ऑब्जेक्ट मैनेजर तक कैसे पहुँच सकते हैं, और Magento वर्गों के उदाहरण उत्पन्न कर सकते हैं, साथ ही Magento जुड़नार का उपयोग कर सकते हैं।

एप्लिकेशन / कोड / विक्रेता / CustomModule / नियंत्रक / आदेश / 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);
    }

}

एप्लिकेशन / कोड / विक्रेता / CustomModule / etc / दृश्यपटल / 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>

एप्लिकेशन / कोड / विक्रेता / 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>

एप्लिकेशन / कोड / विक्रेता / CustomModule / टेस्ट / एकता / नियंत्रक / आदेश / 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']);
    }
}

एप्लिकेशन / कोड / विक्रेता / CustomModule / registration.php

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

कृपया ध्यान दें कि आपका अपना समाधान ठीक है और यह तब तक काम करता है, जब तक आप Magento कोर के जुड़नार का उपयोग कर रहे हैं। यदि आप अपने स्वयं के जुड़नार का उपयोग करना चाहते हैं, तो आप पहले से चर्चा किए गए मुद्दों से टकराएंगे।
जिस्से रीत्समा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.