การสร้างการทดสอบการรวมสำหรับโมดูลวีโอไอพี 2


27

จนถึงตอนนี้สำหรับความต้องการในการทดสอบ Magento 2 ของฉันฉันได้ใช้หน่วย PHP เป็น (มากหรือน้อย) ผู้ทดสอบการยอมรับ - ผลการทดสอบของเซิร์ฟเวอร์และคำขอ HTML ที่ทำไว้ในระบบโดยติดตั้งโมดูลของฉัน ฉันต้องการที่จะสร้างการทดสอบการรวมกลุ่มของฉันเอง เครื่องมือทดสอบที่มาพร้อมกับ Magento 2 อนุญาตให้นักพัฒนาบุคคลที่สามสร้างการทดสอบการรวมกลุ่มของตนเองซึ่งใช้ประโยชน์จากกรอบการทดสอบของ Magento หรือไม่ หรือเราทุกคนจะกลิ้ง bootstrap ของเราเอง?

นั่นคือ

  1. ฉันเป็นนักพัฒนาวีโอไอพี
  2. ฉันต้องการสร้างการทดสอบการรวมระบบ
  3. ฉันต้องการทดสอบการรวมระบบของฉันเพื่อให้ bootstrap Magento มีสภาพแวดล้อมที่เหมาะสมสำหรับการเล่น (เช่น object manager และ / หรือการใช้ dependency injection)
  4. ฉันต้องการรวมการทดสอบเพื่อขยายการ Magento\TestFramework\TestCase\AbstractControllerทดสอบดังนั้นฉันจึงมีผู้ช่วยเหมือนการทดสอบ Magento
  5. ฉันต้องการให้สามารถทำการทดสอบแยกจากส่วนที่เหลือของชุดทดสอบ (เช่นไม่ต้องรอ 2 ชั่วโมงเพื่อรันการทดสอบ 15 วินาทีของฉัน)
  6. ฉันต้องการเก็บการทดสอบแยกต่างหากจากการทดสอบของวีโอไอพี

ไซต์ dev docs มีบทความเริ่มต้นบางส่วนเกี่ยวกับการทดสอบ แต่พวกเขาดูเหมือนจะมุ่งเน้นไปที่การทดสอบที่มาพร้อมกับวีโอไอพีและไม่ได้สร้างและดำเนินการทดสอบของคุณเอง มีโมดูลตัวอย่างอันเก่าแต่พวกมันทั้งหมดขยายPHPUnit_Framework_TestCaseคลาสและดูเหมือนเป็นการทดสอบหน่วย (เช่นรหัสการทดสอบที่ไม่ขึ้นกับกรอบวีโอไอพี)

วีโอไอพีมีวิธีการทำเช่นนี้หรือไม่?

ถ้าไม่ใช่มีใครสะสมการตั้งค่าของตนเองในแบบที่ชุมชนนักพัฒนาของวีโอไอพีสามารถใช้มันเป็นมาตรฐานได้หรือไม่?

คำตอบ:


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

โปรดทราบว่าการทดสอบการรวมใช้เวลานานกว่า 15 วินาทีอย่างน้อยในการเปิดใช้ครั้งแรกเนื่องจากติดตั้ง Magento เป็นหลัก คุณสามารถบันทึกในการทำงานต่อมาถ้าคุณใช้

<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ไดเรกทอรีฐานการติดตั้งถูกกำหนดไว้ทั่วโลก แต่โชคดีที่วีโอไอพีอนุญาตให้ใช้ชื่อเมธอดเป็นส่วนควบเช่นกันดังนั้นงานต่อไปนี้:

/**
 * @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/โดยเฉพาะอย่างยิ่งเมื่อรวมกับฟิกซ์เจอร์แบบกำหนดเองจากโมดูลของคุณด้วยแกนหลัก?
Kristof ที่ Fooman

1
tbh ฉันยังไม่ได้ลองเลย แต่ดูเหมือนว่ามีปัญหาใช่ อาจจำเป็นต้องตั้งค่าเส้นทางการรวมเพื่อให้การแข่งขันเหล่านี้ทำงาน
Fabian Schmengler

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

ฉันได้เล่นกับการทดสอบการรวมกันเล็กน้อยและนี่คือสิ่งที่ฉันพบ

โดยทั่วไปฉันได้ทำตามขั้นตอนที่คล้ายกับสิ่งที่ Fooman พูดด้วยความแตกต่างบางอย่างเพื่อให้การทดสอบการรวมเข้าเป็นส่วนหนึ่งของโมดูลของฉัน

นี่คือขั้นตอนที่ฉันปฏิบัติตาม:

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

คุณควรคำนึงถึงสิ่งที่ Fooman พูดเกี่ยวกับ "TESTS_CLEANUP" และเวลาที่ใช้ในการตั้งค่าการทดสอบการรวมระบบหากคุณเปิดใช้งานการล้างข้อมูล

ที่นี่ฉันเพิ่มตัวอย่างการทำงานสำหรับการอ้างอิงเพิ่มเติม คุณจะเห็นว่าคุณสามารถเข้าถึงตัวจัดการวัตถุและสร้างอินสแตนซ์ของคลาส Magento ได้อย่างไรรวมถึงการใช้ Magento Fixture

app / รหัส / ผู้ขาย / 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);
    }

}

app / รหัส / ผู้ขาย / 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>

app / รหัส / ผู้ขาย / 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 / รหัส / ผู้ขาย / 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']);
    }
}

app / รหัส / ผู้ขาย / CustomModule / registration.php

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

โปรดทราบว่าวิธีการแก้ปัญหาของคุณเองนั้นใช้ได้และใช้งานได้ตราบใดที่คุณใช้อุปกรณ์ติดตั้งของแกนกลางวีโอไอพี หากคุณต้องการใช้การแข่งขันของคุณเองคุณจะชนกับปัญหาดังที่กล่าวไว้ก่อนหน้านี้
Jisse Reitsma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.