ম্যাজেন্টো 2 মডিউলগুলির জন্য ইন্টিগ্রেশন টেস্ট তৈরি করা


27

এখনও পর্যন্ত আমার ম্যাজেন্টো 2 টেস্টিংয়ের প্রয়োজনীয়তার জন্য, আমি পিএইচপি ইউনিটকে (আরও কম) একটি গ্রহণযোগ্যতা পরীক্ষক হিসাবে ব্যবহার করছি - আমার মডিউল ইনস্টল করা একটি সিস্টেমে সার্ভার এবং এইচটিএমএল অনুরোধগুলির পরীক্ষার ফলাফল। আমি আমার নিজস্ব ইন্টিগ্রেশন পরীক্ষা তৈরি করতে সক্ষম হতে চাই। ম্যাজেন্টো 2 সহ শিপিংয়ের যে সরঞ্জামগুলি তৃতীয় পক্ষ বিকাশকারীদের তাদের নিজস্ব ইন্টিগ্রেশন পরীক্ষা তৈরি করার অনুমতি দেয় যা ম্যাগেন্টোর পরীক্ষার কাঠামো কোডটি উত্তোলন করে? বা আমরা সবাই আমাদের নিজস্ব বুটস্ট্র্যাপ ঘূর্ণায়মান হবে?

এটাই

  1. আমি একজন ম্যাজেন্টো বিকাশকারী
  2. আমি একটি ইন্টিগ্রেশন পরীক্ষা তৈরি করতে চাই
  3. আমি আমার ইন্টিগ্রেশন টেস্টটি খেলতে পুরো বুটস্ট্র্যাপ ম্যাজেন্টো পরিবেশে থাকি (যেমন অবজেক্ট ম্যানেজার এবং / অথবা ব্যবহারের জন্য নির্ভরতা ইনজেকশন)
  4. আমি আমার সংহতকরণ পরীক্ষাটি পরীক্ষা বাড়ানোর জন্য চাই Magento\TestFramework\TestCase\AbstractControllerযাতে আমার কাছে ম্যাগেন্টো পরীক্ষার মতো একই সহায়ক রয়েছে ers
  5. আমি আমার পরীক্ষার বাকী পরীক্ষা স্যুট থেকে বিচ্ছিন্নভাবে চালাতে সক্ষম হতে চাই (যেমন আমার 15 সেকেন্ডের পরীক্ষা চালাতে 2 ঘন্টা অপেক্ষা করতে হবে না)
  6. আমি আমার পরীক্ষাগুলি ম্যাজেন্টোর পরীক্ষাগুলি থেকে আলাদাভাবে সঞ্চয় করতে চাই

ডেভ ডক্স সাইটের টেস্টিংয়ের উপর কিছু স্টার্টার আর্টিকেল রয়েছে তবে তারা ম্যাজেন্টো দিয়ে চালানো পরীক্ষা চালানো এবং আপনার নিজের পরীক্ষা তৈরি ও পরিচালনা না করে ওরিয়েন্টেড বলে মনে হচ্ছে। আছে পুরাতন নমুনা মডিউল , কিন্তু তারা সব প্রসারিত PHPUnit_Framework_TestCaseশ্রেণী এবং হবে বলে মনে হচ্ছে ইউনিট পরীক্ষা (অর্থাত পরীক্ষামূলক কোডটি 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>

৩) এটি ../../../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

তাদের Magento ইন্টিগ্রেশন পরীক্ষার নতুন পরীক্ষা স্যুট হিসেবে যুক্ত করো: কপি 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প্যারামিটার যাদের নাম আপনি এক পরীক্ষা স্যুট নির্বাচন করতে পারেন, যাতে সব ইন্টিগ্রেশন পরীক্ষার একযোগে চালানো হয়

আপডেট: ফিক্সচার

নিজস্ব ফিক্সচার ব্যবহার করার জন্য, সামান্য workaround প্রয়োজন ছিল, কারণ ফিক্সচার Magento\TestFramework\Annotationবেস ডিরেক্টরি বিশ্বব্যাপী সংজ্ঞায়িত করা হয়। তবে ভাগ্যক্রমে ম্যাজেন্টো পদ্ধতির নামগুলি ফিক্সচার হিসাবেও মঞ্জুরি দেয়, সুতরাং নিম্নলিখিতগুলি কাজ করে:

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

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

1
আপনি এখানে @ এমজেন্টো ডেটা ফিকচারটি ব্যবহার করার সময় সমস্যার মধ্যে পড়ে যাবেন না github.com/magento/magento2/blob/develop/dev/tests/integration/… বিশেষত যখন কোনও একটির সাথে আপনার মডিউল থেকে একটি কাস্টম ফিক্সারের সাথে সংযুক্ত করে?
ক্রিস্টফ ফুমন

1
tbh আমি এটি এখনও চেষ্টা করি নি তবে এটি দেখতে সমস্যার মতো মনে হচ্ছে, হ্যাঁ। এই ফিক্সচারগুলিকে কাজ করার জন্য অন্তর্ভুক্তের পথটি নির্ধারণ করা প্রয়োজন।
ফ্যাবিয়ান শেমংলার

1
@ ক্রিস্টোফ্যাটফুমান ফিক্সচারগুলির জন্য একটি সমাধান খুঁজে পেয়েছিলেন, আপডেট দেখুন
ফ্যাবিয়ান শেমংলার 11'16

দুর্দান্ত সমাধান। এখানে বেশ কয়েকটি ত্রুটি থাকতে পারে। প্রথমত, একটি টাইপো রয়েছে - এর __DIR__পরে একটি স্ল্যাশ হওয়া উচিত ( /_files)। দ্বিতীয়ত, টেস্টফ্রেমওয়ার্কের মধ্যে থেকে ফিক্সিংটি লোড করা হয় যাতে __DIR__প্রকৃতপক্ষে টেস্টফ্রেমওয়ার্ক ডিরেক্টরিতে নির্দেশ করা হয় আপনার নিজের মডিউলটি নয়। এর ComponentRegistrarজন্য এটি ব্যবহার করা যেতে পারে:require $ObjectManager::getInstance()->get(ComponentRegistrar::class)->getPath('module', 'Foo_Bar').'/Test/Integration/_files/example.php';
জিস রিটসমা

10

ইন্টিগ্রেশন টেস্টগুলির সাথে আমি কিছুটা খেলেছি, এবং এটি আমি এখনও অবধি খুঁজে পেয়েছি।

মূলত, ইন্টিগ্রেশন টেস্টটি আমার মডিউলের অংশ হতে যাতে কিছু পার্থক্য নিয়ে আমি ফুমন যা বলেছিলাম তার অনুরূপ পদক্ষেপগুলি আমি অনুসরণ করেছি।

এই আমি অনুসরণ করা পদক্ষেপগুলি:

1- এর অধীনে আপনার সংহতকরণ পরীক্ষা রাখুন Place 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- তারপরে আমি এটি সি এল এল সরঞ্জাম ব্যবহার করে চালাচ্ছি bin/magento dev:test:run integration

"TESTS_CLEANUP" সম্পর্কে ফুম্যান কী বলেছে এবং আপনার যদি ক্লিনআপ সক্ষম থাকে তবে ইন্টিগ্রেশন টেস্ট সেটআপ করতে যে সময় লাগে তা আপনার মনে থাকা উচিত।

এখানে আমি আরও রেফারেন্সের জন্য একটি কার্যকরী উদাহরণ যুক্ত করছি। আপনি কীভাবে অবজেক্ট ম্যানেজারটি অ্যাক্সেস করতে পারবেন এবং ম্যাজেন্টো ক্লাসগুলির উদাহরণ তৈরি করতে পারবেন পাশাপাশি ম্যাজেন্টো ফিক্সচারও ব্যবহার করতে পারবেন।

অ্যাপ্লিকেশন / কোড / বিক্রেতা / CustomModule / কন্ট্রোলার / 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);
    }

}

অ্যাপ্লিকেশন / কোড / বিক্রেতা / 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 / পরীক্ষা / ইন্টিগ্রেশন / কন্ট্রোলার / 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']);
    }
}

অ্যাপ্লিকেশন / কোড / বিক্রেতা / CustomModule / registration.php

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

দয়া করে মনে রাখবেন যে আপনার নিজের সমাধানটি ঠিক আছে এবং এটি কাজ করে, যতক্ষণ আপনি ম্যাজেন্টো কোরটির ফিক্সচার ব্যবহার করছেন। আপনি যদি নিজের নিজস্ব ফিক্সার ব্যবহার করতে চান তবে আপনি আগে আলোচনা মতো বিষয়গুলিতে ঝাঁপিয়ে পড়বেন।
জিস রিটসমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.