Tạo các thử nghiệm tích hợp cho các mô-đun Magento 2


27

Cho đến nay đối với nhu cầu thử nghiệm Magento 2 của tôi, tôi đã sử dụng Đơn vị PHP dưới dạng (ít nhiều) một thử nghiệm chấp nhận - kết quả thử nghiệm của các yêu cầu máy chủ và HTML được thực hiện trong một hệ thống có cài đặt mô-đun của tôi. Tôi muốn có thể tạo các bài kiểm tra tích hợp của riêng tôi. Các công cụ kiểm tra đi kèm với Magento 2 có cho phép các nhà phát triển bên thứ ba tạo các thử nghiệm tích hợp của riêng họ để tận dụng mã khung thử nghiệm của Magento không? Hay tất cả chúng ta sẽ tự khởi động bootstrap của mình?

Đó là

  1. Tôi là một nhà phát triển Magento
  2. Tôi muốn tạo một bài kiểm tra tích hợp
  3. Tôi muốn kiểm tra tích hợp để có môi trường Magento khởi động hoàn toàn để chơi (ví dụ: trình quản lý đối tượng và / hoặc nội dung phụ thuộc để sử dụng)
  4. Tôi muốn thử nghiệm tích hợp của mình để mở rộng Magento\TestFramework\TestCase\AbstractControllerthử nghiệm để tôi có cùng những người trợ giúp như các thử nghiệm Magento
  5. Tôi muốn có thể chạy các thử nghiệm của mình một cách tách biệt với phần còn lại của bộ thử nghiệm (nghĩa là không phải chờ 2 giờ để chạy 15 giây thử nghiệm của tôi)
  6. Tôi muốn các bài kiểm tra của tôi được lưu trữ riêng biệt từ các bài kiểm tra của Magento

Trang web dev docs có một số bài viết khởi đầu về thử nghiệm, nhưng chúng dường như được định hướng để chạy các thử nghiệm đi kèm với Magento và không tạo và chạy thử nghiệm của riêng bạn. Có các mô-đun mẫu cũ , nhưng tất cả chúng đều mở rộng PHPUnit_Framework_TestCaselớp và dường như là các thử nghiệm đơn vị (tức là mã thử nghiệm không dựa vào khung Magento)

Có một Magento cung cấp cách làm này?

Nếu không, có ai đã tự thiết lập theo cách mà thử nghiệm của cộng đồng nhà phát triển Magento có thể áp dụng nó như một tiêu chuẩn?

Câu trả lời:


20

Điều này hiệu quả với chúng tôi nhưng chúng tôi chưa xem xét việc chuyển chúng đến một vị trí riêng biệt để giải quyết 6.)

1.) Đặt các bài kiểm tra tích hợp của bạn dưới dev/tests/integration/testsuite/Vendor
2.) sao chép dev/tests/integration/phpunit.dist.xml
vào
dev/tests/integration/phpunit.xml

và thay thế

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

với

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

3.) chạy nó ../../../vendor/bin/phpunithoặc với ../../../vendor/bin/phpunit path/to/teststhư mục dev / test / integration

Xin lưu ý rằng các bài kiểm tra tích hợp mất hơn 15 giây, ít nhất là trong lần chạy đầu tiên vì về cơ bản nó sẽ cài đặt Magento. Bạn có thể lưu vào các lần chạy tiếp theo nếu bạn sử dụng

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

trong bạn phpunit.xml


11

Tôi đã đặt thành công các bài kiểm tra tích hợp của mình vào một thư mục riêng : src/My/Module/test/integration. Nó có thể là bất kỳ thư mục khác là tốt, như app/code/My/Module/Test.

Thêm chúng như bộ thử nghiệm mới cho thử nghiệm hội nhập Magento: Sao chép dev/tests/integration/phpunit.xml.disttới dev/tests/integration/phpunit.xmlvà thêm những điều sau đây trong <testsuites>nút:

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

Sau đó chạy các bài kiểm tra như thế này từ dev/tests/integrationthư mục:

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

Với --testsuitetham số, bạn có thể chọn một bộ kiểm tra theo tên, để không phải tất cả các kiểm tra tích hợp đều được chạy cùng một lúc

Cập nhật: Lịch thi đấu

Để sử dụng đồ đạc riêng, một cách giải quyết nhỏ là cần thiết, bởi vì trong Magento\TestFramework\Annotationthư mục cơ sở vật cố được xác định trên toàn cầu. Nhưng may mắn thay, Magento cũng cho phép tên phương thức là đồ đạc, vì vậy các công việc sau:

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

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

1
Bạn sẽ không gặp vấn đề khi sử dụng @magentoDataFixture tại đây github.com/magento/magento2/blob/develop/dev/tests/integration/ trộm nhất là khi kết hợp với một vật cố tùy chỉnh từ mô-đun của bạn với một lõi?
Kristof tại Fooman

1
Tôi chưa thử nó nhưng có vẻ như là một vấn đề, yeah. Có thể cần thiết để thiết lập đường dẫn bao gồm để làm cho các đồ đạc này hoạt động.
Fabian Schmengler

1
@KristofatFooman Tìm thấy giải pháp cho đồ đạc, xem cập nhật
Fabian Schmengler 11/03/2016

Giải pháp tuyệt vời. Có thể có một vài sai sót ở đây. Trước hết, có một lỗi đánh máy - __DIR__nên được theo sau bởi dấu gạch chéo ( /_files). Thứ hai, vật cố được tải từ bên trong TestFramework để __DIR__thực sự trỏ đến thư mục TestFramework chứ không phải mô-đun của riêng bạn. Có ComponentRegistrarthể được sử dụng cho việc này:require $ObjectManager::getInstance()->get(ComponentRegistrar::class)->getPath('module', 'Foo_Bar').'/Test/Integration/_files/example.php';
Jisse Reitsma

10

Tôi đã chơi một chút với các bài kiểm tra tích hợp, và đây là những gì tôi tìm thấy cho đến nay.

Về cơ bản, tôi đã làm theo các bước tương tự như những gì Fooman nói, với một số khác biệt để làm cho bài kiểm tra tích hợp là một phần của mô-đun của tôi.

Đây là các bước tôi đã làm theo:

1- Đặt các bài kiểm tra tích hợp của bạn dưới app/code/Vendor/CustomModule/Test/Integration

2- Sao chép dev/tests/integration/phpunit.dist.xmlvàodev/tests/integration/phpunit.xml

và thay thế

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

với

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

3- Sau đó, tôi chạy nó bằng công cụ CLI bin/magento dev:test:run integration

Bạn nên ghi nhớ những gì Fooman nói về "TESTS_CLEANUP" và thời gian cần thiết để thiết lập các bài kiểm tra tích hợp nếu bạn bật tính năng dọn dẹp.

Ở đây tôi thêm một ví dụ chức năng để tham khảo thêm. Bạn sẽ thấy cách bạn có thể truy cập trình quản lý đối tượng và tạo phiên bản của các lớp Magento, cũng như sử dụng đồ đạc Magento.

ứng dụng / mã / Nhà cung cấp / CustomModule / Trình điều khiển / Đặt hàng / 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);
    }

}

ứng dụng / mã / Nhà cung cấp / CustomModule / etc / frontend / Rout.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>

ứng dụng / mã / Nhà cung cấp / 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>

ứng dụng / mã / Nhà cung cấp / CustomModule / Kiểm tra / Tích hợp / Trình điều khiển / Đặt hàng / 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']);
    }
}

ứng dụng / mã / Nhà cung cấp / CustomModule / đăng ký.php

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

Xin lưu ý rằng giải pháp của riêng bạn là tốt và nó hoạt động, miễn là bạn đang sử dụng đồ đạc của lõi Magento. Nếu bạn muốn sử dụng đồ đạc của riêng mình, bạn sẽ gặp phải các vấn đề như đã thảo luận trước đó.
Jisse Reitsma
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.