webgriffe/functional-test-trait

通过 EcomDev_PHPUnit 和 CgiHttpKernel 在 Magento 中实现功能测试的特性。

3.0.0 2018-02-13 17:12 UTC

This package is auto-updated.

Last update: 2024-09-07 21:18:12 UTC


README

通过 EcomDev_PHPUnitCgiHttpKernel 在 Magento 中实现功能测试的特性。

安装

使用 Composer 导入(注意,这是一个开发依赖项)

$ composer require --dev webgriffe/functional-test-trait

使用方法

建议将此特性与 EcomDev_PHPUnitWebgriffe 的 Magento 配置扩展 结合使用。因此,首先将以下依赖项添加到您的 Magento 项目中

$ composer require --dev webgriffe/functional-test-trait ecomdev/ecomdev_phpunit
$ composer require webgriffe/config-extension

另一个建议的依赖项是 symfony/css-selector,它允许在功能测试中使用 CSS 选择器选择 DOM 元素

$ composer require --dev symfony/css-selector

然后,像往常一样使用 EcomDev_PHPUnit 设置您的测试套件。

您还可以在 phpunit.xml.dist 中添加一个 <testsuite> 节点,将功能测试分组到专门的测试套件中

<testsuite name="My Project Functional Test Suite">
    <directory suffix="Test.php">tests</directory>
</testsuite>

此外,为了避免会话问题,您应确保在测试设置和运行期间始终使用相同的 base_url。您可以通过在 phpunit.xml.dist 中设置 MAGE_ENVIRONMENT 服务器变量来完成此操作

<php>
    <server name="MAGE_ENVIRONMENT" value="test" />
</php>

然后,使用该环境的覆盖配置文件设置 base_urlapp/etc/config-override.test.xml.dist),内容如下

<?xml version="1.0"?>
<config>
    <default>
        <web>
            <secure>
                <base_url>http://url-functional.test/</base_url>
            </secure>
            <unsecure>
                <base_url>http://url-functional.test/</base_url>
            </unsecure>
        </web>
    </default>
</config>

现在您已经准备好编写第一个 Magento 功能测试了。将测试文件放在 tests/ 目录中。例如,HomepageTest.php

<?php
	
class HomepageTest extends EcomDev_PHPUnit_Test_Case_Controller
{
    use Webgriffe_FunctionalTest_Trait;
	
    /**
     * @loadFixture category.yaml
     */
    public function testHome()
    {
        $client = self::createClient();
        $crawler = $client->request('GET', '/');
	
        $this->assertTrue($client->getResponse()->isSuccessful());
        $this->assertContains('Default welcome msg!', $crawler->filter('div.welcome-msg')->text());
        $this->assertCount(1, $crawler->filter('ul.nav.mega-menu'));
        $categoryLink = $crawler->filter('ul.nav.mega-menu')->filter('li')->eq(0)->filter('a');
        $this->assertCount(1, $categoryLink);
        $this->assertContains('My Category', $categoryLink->text());
	
        $crawler = $client->click($categoryLink->link());
	
        $this->assertTrue($client->getResponse()->isSuccessful());
        $this->assertContains('My Category', $crawler->filter('div.page-title h1')->text());
    }
}

重要的是您的测试需要扩展 EcomDev_PHPUnit_Test_Case_Controller 类,以便正确加载 Magento 的前端区域配置。

您可能会注意到有 @loadFixture 注解,它从位于 tests/HomepageTest/fixtures/category.yamlcategory.yaml 文件中加载数据,其内容可能如下

eav:
  catalog_category:
    - entity_id: 3
      name: My Category
      parent_id: 2
      path: 1/2/3
      level: 2
      url_key: my-category
      is_active: 1
      include_in_menu: 1

支持多个网站

如果您想,您可以创建针对不同网站的客户

$secondaryWebsite = Mage::app()->getWebsite('otherwebsite');
$client = self::createClient($secondaryWebsite);

这将使用次要网站的基础 URL 并设置 MAGE_RUN_TYPEMAGE_RUN_CODE 环境变量。

使用 xDebug 调试测试

有时您需要在功能测试执行期间调试应用程序。要这样做,您可以通过将 true 传递给 createClient() 方法来创建一个启用 xDebug 的客户端

$client = self::createClient(true);

不要忘记根据您的 IDE 设置配置 XDEBUG_SESSION cookie 值。例如,对于 MAC 上的 PHPStorm,此值应为 PHPSTORM

<?xml version="1.0"?>
<config>
	<!-- ... -->
	<phpunit>
        <functional>
            <xdebug_session>PHPSTORM</xdebug_session>
        </functional>
    </phpunit>
</config>

在浏览器中打开响应

有时打开 Magento 返回的最后响应并在浏览器中进一步分析是有用的。为此,您可以使用 openResponseInBrowser() 方法,例如

$client = self::createClient();
$client->request('GET', '/');
self::openResponseInBrowser($client)

这将将最后响应的内容转储到临时文件中,并通过系统命令打开它。不要忘记在 app/etc/local.xml 中配置您的系统打开文件在浏览器中的命令(%s 占位符将替换为临时文件路径)。例如,在 MAC 上,您可以使用 open %s

<?xml version="1.0"?>
<config>
	<!-- ... -->
	<phpunit>
        <functional>
            <open_browser_command>open %s</open_browser_command>
        </functional>
    </phpunit>
</config>

不同的前端控制器

您还可以指定替代前端控制器而不是 index.php。当您需要通过 Magento 提供的 get.php 前端控制器提供静态文件时,这非常有用

$staticFilesClient = self::createClient(null, false, 'test', 'get.php');
$staticFilesClient->request('GET', '/path/to/media/file.jpg');

许可

此库受 MIT 许可证的约束。有关完整的许可证,请参阅 LICENSE 文件。

鸣谢

Webgriffe®开发。请通过GitHub issue向我们报告任何bug或建议。