webgriffe / functional-test-trait
通过 EcomDev_PHPUnit 和 CgiHttpKernel 在 Magento 中实现功能测试的特性。
Requires
- symfony/browser-kit: ^3.2
- webgriffe/cgi-http-kernel: ^1.1
Suggests
- ecomdev/ecomdev_phpunit: Allows to load fixtures before your functional tests.
- symfony/css-selector: Allows to filter DOM elements with CSS selectors.
- webgriffe/config-extension: Allows to use the EcomDev_PHPUnit database in your functional tests.
README
通过 EcomDev_PHPUnit 和 CgiHttpKernel 在 Magento 中实现功能测试的特性。
安装
使用 Composer 导入(注意,这是一个开发依赖项)
$ composer require --dev webgriffe/functional-test-trait
使用方法
建议将此特性与 EcomDev_PHPUnit 和 Webgriffe 的 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_url
(app/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.yaml
的 category.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_TYPE
和 MAGE_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或建议。