七、测试和质量保证

到目前为止,我们已涵盖:

  • 马根托基础
  • 前端开发
  • 后端开发
  • 扩展和使用 API

然而,我们忽略了开发任何扩展或定制代码的一个关键步骤:测试和质量保证。

尽管 Magento 是一个非常复杂和大型的平台,但在 Magento2 之前的版本中没有包含/集成的单元测试套件。

由于这个原因,大多数 Magento 开发人员常常忽视适当的测试和质量保证,这可能是因为缺乏信息,也可能是因为某些测试工具的开销太大,虽然没有很多工具可用于使用 Magento 运行适当的测试,但现有的工具质量非常高。

在本章中,我们将了解可用于测试 Magento 代码的不同选项,并且还将为自定义扩展构建一些非常基本的测试。

让我们回顾一下本章所涵盖的主题:

  • Magento 提供的不同测试框架和工具
  • 测试 Magento 代码的重要性
  • 如何设置、安装和使用 Ecomdev PHPUnit 扩展
  • 如何设置、安装和使用 Magento Mink 运行功能测试

测试 Magento

在我们开始编写任何测试之前,我们必须了解与测试相关的概念,尤其是与每种可用方法相关的概念。

单元测试

单元测试背后的想法是为代码的特定区域(单元)编写测试,因此我们可以验证代码是否按预期工作,以及函数是否返回预期值。

单元测试是一种测试源代码的单个单元、一套或多套计算机程序模块以及相关的控制数据、使用程序和操作程序,以确定它们是否适合使用的方法。

编写单元测试的另一个优点是,通过执行测试,我们更有可能编写更易于测试的代码。

这意味着随着我们继续编写越来越多的测试,我们的代码倾向于被分解成更小但更专业化的函数。我们开始构建一个测试套件,每次引入更改或功能时,它都可以针对我们的代码库运行;这就是所谓的回归测试。

回归检验

回归测试主要是指在进行代码更改后重新运行现有测试套件的实践,以检查新功能是否也引入了新的 bug。

回归测试是任何类型的软件测试,其目的是在系统的现有功能和非功能区域中发现新的软件缺陷或回归,这些缺陷或回归是在对其进行更改(如增强、补丁或配置更改)后发生的。

在 Magento 商店或任何电子商务站点的特定情况下,我们希望对商店的关键功能执行回归测试,例如结帐、客户注册、添加到购物车等。

功能测试

功能测试更关注于测试应用程序是否基于特定输入返回适当的输出,而不是内部发生的事情。

功能测试是一种黑盒测试,其测试用例基于被测软件组件的规范。函数通过输入和检查输出进行测试,很少考虑内部程序结构。

这对于像我们这样的电子商务网站尤其重要,因为我们希望根据客户的体验来测试网站。

TDD

最近几年,受到欢迎的一种测试方法被称为测试驱动开发TDD)。

测试驱动开发(TDD)是一个软件开发过程,它依赖于非常短的开发周期的重复:首先,开发人员编写一个(最初失败的)自动测试用例,定义期望的改进或新功能,然后生成通过该测试的最少代码量,并最终将新代码重构到可接受的标准。

TDD 背后的基本概念是首先编写一个失败的测试,然后编写代码以通过测试;这将生成非常短的开发周期,并有助于简化代码。

理想情况下,您希望通过在 Magento 中使用 TDD 开始模块和扩展的开发。我们在前几章中省略了这一点,因为它会增加不必要的复杂性,并使读者感到困惑。

如需有关从头开始使用 Magento 的 TDD 的完整教程,请访问http://magedevguide.com/getting-started-with-tdd

工具和测试框架

如前所述,有几种框架和工具可用于测试 PHP 代码和 Magento 代码。让我们更好地了解他们中的每一个人:

  • Ecomdev_PHPUnit:这个扩展太神奇了;Ecomdev 的开发人员创建了一个扩展,该扩展集成了 PHPUnit 和 Magento,还向 PHPUnit 添加了特定于 Magento 的断言,而无需修改核心文件或影响数据库。
  • Magento_Mink:Mink 是用于 Behat 框架的 PHP 库,允许您编写功能测试和验收测试;Mink 允许编写模拟用户行为和浏览器交互的测试。
  • Magento_TAFMagento_TAF代表 Magento 测试自动化框架,是 Magento 提供的官方测试工具。Magento_TAF包含 1000 多个功能测试,功能强大。不幸的是,它有一个很大的缺点;它有很大的开销和陡峭的学习曲线。

使用 PHPUnit 进行单元测试

Ecomdev_PHPUnit之前,使用 PHPUnit 测试 Magento 是有问题的,而且从可用的不同方法来看,实际上并不太实用。几乎所有需要修改的核心代码或开发人员都必须跳转来建立基本的 phpunit。

安装 Ecomdev_PHPUnit

安装Ecomdev_PHPUnit最简单的方法是直接从 GitHub 存储库获取副本。让我们在控制台上编写以下命令:

git clone git://github.com/IvanChepurnyi/EcomDev_PHPUnit.git

现在将文件复制到您的 Magento 根文件夹。

Composer 和 Modman 是可供安装的可选选项。欲了解更多信息,请访问http://magedevguide.com/module-managers

最后,我们需要设置配置来指示 PHPUnit 扩展使用哪个数据库;local.xml.phpunitEcomdev_PHPUnit新增的文件。此文件保存所有特定于扩展名的配置,并指定测试数据库的名称。

文件位置为app/etc/local.xml.phpunit。请参阅以下代码:

<?xml version="1.0"?>
<config>
    <global>
        <resources>
            <default_setup>
                <connection>
                   <dbname><![CDATA[magento_unit_tests]]></dbname>
                </connection>
            </default_setup>
        </resources>
    </global>
    <default>
        <web>
            <seo>
                <use_rewrites>1</use_rewrites>
            </seo>
            <secure>
                <base_url>[change me]</base_url>
            </secure>
            <unsecure>
                <base_url>[change me]</base_url>
            </unsecure>
            <url>
                <redirect_to_base>0</redirect_to_base>
            </url>
        </web>
    </default>
    <phpunit>
        <allow_same_db>0</allow_same_db>
    </phpunit>
</config>

您需要为运行测试创建一个新的数据库,并替换local.xml.phpunit文件中的示例配置值。

默认情况下,此扩展不允许您在同一数据库上运行测试;将测试数据库与开发和生产分开,可以让我们自信地运行测试。

设置我们分机的配置

现在我们已经安装并设置了 PHPUnit 扩展,我们需要准备 gift 注册表扩展以运行单元测试。遵循以下步骤:

  1. 打开礼品注册表扩展名config.xml文件
  2. 添加以下代码(文件位置为app/code/local/Mdg/Giftregistry/etc/config.xml

    php … <phpunit> <suite> <modules> <Mdg_Giftregistry/> </modules> </suite> </phpunit> …

这个新的配置节点允许 PHPUnit 扩展识别扩展并运行匹配测试。

我们还需要创建一个名为Test的新目录,用于放置所有测试文件。与以前的方法相比,使用Ecomdev_PHPUnit的优点之一是该扩展遵循 Magento 标准。

这意味着我们必须在Test文件夹中保持相同的模块目录结构:

Test/
Model/
Block/
Helper/
Controller/
Config/

基于此,每个Test案例类的命名约定为[Namespace]_[Module Name]_Test_[Group Directory]_[Entity Name]

每个Test类必须扩展以下三个基本Test类之一:

  • EcomDev_PHPUnit_Test_Case:此类用于测试助手、模型和块
  • EcomDev_PHPUnit_Test_Case_Config:此类用于测试模块配置
  • EcomDev_PHPUnit_Test_Case_Controller:此类用于测试布局渲染过程和控制器逻辑

一个测试用例的剖析

在开始尝试创建我们的第一个测试之前,让我们先分解Ecomdev_PHPUnit提供的一个示例:

<?php
class EcomDev_Example_Test_Model_Product extends EcomDev_PHPUnit_Test_Case
{
    /**
     * Product price calculation test
     *
     * @test
     * @loadFixture
     * @doNotIndexAll
     * @dataProvider dataProvider
     */
    public function priceCalculation($productId, $storeId)
    {
        $storeId = Mage::app()->getStore($storeId)->getId();
        $product = Mage::getModel('catalog/product')
            ->setStoreId($storeId)
            ->load($productId);
        $expected = $this->expected('%s-%s', $productId, $storeId);
        $this->assertEquals(
            $expected->getFinalPrice(),
            $product->getFinalPrice()
        );
        $this->assertEquals(
            $expected->getPrice(),
            $product->getPrice()
        );
    }
}

在示例test类中,首先要注意的是注释注释:

…
/**
     * Product price calculation test
     *
     * @test
     * @loadFixture
     * @doNotIndexAll
     * @dataProvider dataProvider
     */
…

PHPUnit 扩展使用这些注释来识别哪些类函数是测试,并且允许我们为运行每个测试设置特定的设置。让我们来看看一些可用的注释:

  • @test:此注释将类函数标识为 PHPUnit 测试
  • @loadFixture:此注释指定了夹具的使用
  • @loadExpectation:此注释指定了期望值的使用
  • @doNotIndexAll:通过添加此注释,我们告诉 PHPUnit 测试在加载装置后不应运行任何索引
  • @doNotIndex [index_code]:通过添加此注释,我们可以指示 PHPUnit 不运行特定索引

所以现在,你可能有点困惑。固定设施期望?它们是什么?

以下是关于固定装置和预期的简要说明:

  • fixture:fixture 是另一种标记语言YAML文件表示数据库或配置实体
  • 期望值:如果我们不希望在测试中使用硬编码值,并且在 YAML 值中也指定了期望值是有用的

有关 YAML 标记的更多信息,请访问http://magedevguide.com/resources/yaml

因此,正如我们所看到的,fixture 为测试提供了要处理的数据,期望值用于检查测试返回的结果是否是我们期望看到的结果。

夹具和期望值存储在每个Test类型目录中。按照前面的示例,我们将有一个名为Product/的新目录。在它里面,我们需要一个新的期望目录和一个装置目录。

让我们看一下修改后的文件夹结构:

Test/
Model/  
  Product.php
  Product/
    expectations/
    fixtures/
Block/
Helper/
Controller/
Config/

Anatomy of a Test case

创建单元测试

对于我们的第一个单元测试,让我们创建一个非常基础的测试,它允许我们测试我们之前创建的礼物注册模型。

正如我们前面提到的,Ecomdev_PHPUnit使用一个单独的数据库来运行所有测试;为此,我们需要创建一个新的 fixture,它将为我们的测试用例提供所有数据。遵循以下步骤:

  1. 打开Test/Model文件夹。
  2. 创建一个名为Registry的新文件夹。
  3. Registry文件夹中,创建一个名为fixtures的新文件夹。
  4. 创建一个名为registryList.yaml的新文件,并在其中粘贴以下代码(文件位置为app/code/local/Mdg/Giftregistry/Test/Model/fixtures/registryList.yaml

    php website: # Initialize websites - website_id: 2 code: default name: Test Website default_group_id: 2 group: # Initializes store groups - group_id: 2 website_id: 2 name: Test Store Group default_store_id: 2 root_category_id: 2 # Default Category store: # Initializes store views - store_id: 2 website_id: 2 group_id: 2 code: default name: Default Test Store is_active: 1 eav: customer_customer: - entity_id: 1 entity_type_id: 3 website_id: 2 email: test@magentotest.com group_id: 2 store_id: 2 is_active: 1 mdg_giftregistry_entity: - entity_id: 1 customer_id: 1 type_id: 2 website_id: 2 event_date: 12/12/2012 event_country: Canada event_location: Dundas Square created_at: 21/12/2012 - entity_id: 2 customer_id: 1 type_id: 3 website_id: 2 event_date: 01/01/2013 event_country: Canada event_location: Eaton Center created_at: 21/12/2012

看起来可能不太像,但我们在这个装置中添加了很多信息。我们将创建以下夹具数据:

  • 网站范围
  • 商店集团
  • 店景
  • 客户记录
  • 两间礼品登记处

通过使用 fixture,我们可以动态地创建可用于测试用例的数据。这为我们提供了针对相同数据多次运行测试的一致性,以及轻松更改测试的灵活性。

现在,您可能想知道 PHPUnit 扩展如何知道如何将Test案例与特定夹具配对。

扩展加载设备有两种方式:一种是通过在注释注释中指定设备,或者如果未指定设备名称,扩展将搜索与正在执行的Testcase 函数同名的设备。

知道了这一点,让我们创建我们的第一个Test案例:

  1. 导航到Test/Model文件夹。
  2. 创建一个名为Registry.php的新Test类。
  3. 添加以下基本代码(文件位置为app/code/local/Mdg/Giftregistry/Test/Model/Registry.php):

    ```php <?php class Mdg_Giftregistry_Test_Model_Registry extends EcomDev_PHPUnit_Test_Case { /* * Listing available registries * * @test * @loadFixture * @doNotIndexAll * @dataProvider dataProvider / public function registryList() {

    }
    

    } ```

我们刚刚创建了基函数,但还没有添加任何逻辑。在这样做之前,让我们来看看实际上是什么构成了一个案例。

Test案例通过使用断言来评估和测试我们的代码。断言是我们的Test案例从父TestCase类继承的特殊函数。在可用的默认断言中,我们有:

  • assertEquals()
  • assertGreaterThan()
  • assertGreaterThanOrEqual()
  • assertLessThan()
  • assertLessThanOrEqual()
  • assertTrue()

现在,如果我们想检查变量的值,这些默认断言非常有用;搜索数组键、检查属性等。但是,仅使用这些类型的断言来测试 Magento 代码可能很困难,甚至是不可能的。这就是Ecomdev_PHPUnit拯救的地方。

这个扩展不仅按照他们的标准将 PHPUnit 与 Magento 干净地集成在一起,而且还将 Magento 特定的断言添加到 PHPUnit 测试中。让我们来看看扩展的一些断言:

  • assertEventDispatched()
  • assertBlockAlias()
  • assertModelAlias()
  • assertHelperAlias()
  • assertModuleCodePool()
  • assertModuleDepends()
  • assertConfigNodeValue()
  • assertLayoutFileExists()

这些只是可用的断言中的一小部分,如您所见,它们为构建全面的测试提供了很大的能力。

现在我们了解了更多关于 PHPUnitTest案例的工作原理,让我们继续创建我们的第一个 MagentoTest案例:

  1. 导航到我们之前创建的Registry.php测试用例类。
  2. registryList()功能中添加以下代码(文件位置为app/code/local/Mdg/Giftregistry/Test/Model/Registry.php

    php /** * Listing available registries * * @test * @loadFixture * @doNotIndexAll * @dataProvider dataProvider */ public function registryList() { $registryList = Mage::getModel('mdg_giftregistry/entity')->getCollection(); $this->assertEquals( 2, $registryList->count() ); }

这是一个非常基本的测试;我们正在做的唯一一件事就是加载注册表集合。在本例中,所有注册表都可用,然后它们运行断言以检查集合计数是否匹配。

然而,这不是很有用。如果我们能够只加载属于特定用户(我们的测试用户)的注册表并检查集合大小,那就更好了。也就是说,让我们稍微修改一下代码:

文件位置为app/code/local/Mdg/Giftregistry/Test/Model/Registry.php。请参阅以下代码:

    /**
     * Listing available registries
     *
     * @test
     * @loadFixture
     * @doNotIndexAll
     * @dataProvider dataProvider
     */
    public function registryList()
    {
        $customerId = 1;
        $registryList = Mage::getModel('mdg_giftregistry/entity')
->getCollection()
->addFieldToFilter('customer_id', $customerId);
        $this->assertEquals(
            2,
            $registryList->count()
        );
    }

只需更改几行代码,我们就创建了一个测试,可以检查注册表集合是否正常工作,以及它们是否正确链接到客户记录。

在 shell 中运行以下命令:

$ phpunit

如果一切按预期进行,我们将看到以下输出:

PHPUnit 3.4 by Sebastian Bergmann
.
Time: 1 second
Tests: 1, Assertions: 1, Failures 0

您还可以运行$phpunit-颜色以获得更好的输出。

现在,我们只需要一个测试来验证注册表项是否正常工作:

  1. 导航到我们之前创建的Registry.php测试用例类。
  2. registryItemsList()功能中添加以下代码(文件位置为app/code/local/Mdg/Giftregistry/Test/Model/Registry.php

    ```php /* * Listing available items for a specific registry * * @test * @loadFixture * @doNotIndexAll * @dataProvider dataProvider / public function registryItemsList() { $customerId = 1; $registry = Mage::getModel('mdg_giftregistry/entity') ->loadByCustomerId($customerId);

        $registryItems = $registry->getItems();
        $this->assertEquals(
            3,
            $registryItems->count()
        );
    }
    

    ```

我们还需要为新的Test案例配备一个新夹具:

  1. 导航到Test/Model文件夹。
  2. 打开Registry文件夹。
  3. 创建名为registryItemsList.yaml的新文件(文件位置为app/code/local/Mdg/Giftregistry/Test/Model/fixtures/ registryItemsList.yaml

    php website: # Initialize websites - website_id: 2 code: default name: Test Website default_group_id: 2 group: # Initializes store groups - group_id: 2 website_id: 2 name: Test Store Group default_store_id: 2 root_category_id: 2 # Default Category store: # Initializes store views - store_id: 2 website_id: 2 group_id: 2 code: default name: Default Test Store is_active: 1 eav: customer_customer: - entity_id: 1 entity_type_id: 3 website_id: 2 email: test@magentotest.com group_id: 2 store_id: 2 is_active: 1 mdg_giftregistry_entity: - entity_id: 1 customer_id: 1 type_id: 2 website_id: 2 event_date: 12/12/2012 event_country: Canada event_location: Dundas Square created_at: 21/12/2012 mdg_giftregistry_item: - item_id: 1 registry_id: 1 product_id: 1 - item_id: 2 registry_id: 1 product_id: 2 - item_id: 3 registry_id: 1 product_id: 3

让我们运行测试套件:

$phpunit --colors

我们应该看到这两项测试都通过了:

PHPUnit 3.4 by Sebastian Bergmann
.
Time: 4 second
Tests: 2, Assertions: 2, Failures 0

最后,让我们用适当的期望值替换硬编码的变量:

  1. 导航到Module Test/Model文件夹。
  2. 打开Registry文件夹。
  3. Registry文件夹中,创建一个名为expectations的新文件夹。
  4. 创建一个名为registryList.yaml的新文件(文件位置为app/code/local/Mdg/Giftregistry/Test/Model/expectations/registryList.yaml

    php count: 2

那不是很容易吗?好吧,这是如此简单,我们将在registryItemsList测试用例中再次进行:

  1. 导航到Module Test/Model文件夹。
  2. 打开Registry文件夹。
  3. expectations文件夹内创建一个名为registryItemsList.yaml的新文件(文件位置为app/code/local/Mdg/Giftregistry/Test/Model/expectations/registryItemsList.yaml

    php count: 3

最后,我们需要做的最后一件事是更新Test案例类以使用预期。确保更新文件具有以下代码(文件位置为app/code/local/Mdg/Giftregistry/Test/Model/Registry.php

<?php
class Mdg_Giftregistry_Test_Model_Registry extends EcomDev_PHPUnit_Test_Case
{
    /**
     * Product price calculation test
     *
     * @test
     * @loadFixture
     * @doNotIndexAll
     * @dataProvider dataProvider
     */
    public function registryList()
    {
        $customerId = 1;
        $registryList = Mage::getModel('mdg_giftregistry/entity')
                ->getCollection()
                ->addFieldToFilter('customer_id', $customerId);
        $this->assertEquals(
            $this->_getExpectations()->getCount(),$this->_getExpectations()->getCount(),
            $registryList->count()
        );
    }
    /**
     * Listing available items for a specific registry
     *
     * @test
     * @loadFixture
     * @doNotIndexAll
     * @dataProvider dataProvider
     */
    public function registryItemsList()
    {
        $customerId = 1;
        $registry   = Mage::getModel('mdg_giftregistry/entity')->loadByCustomerId($customerId);

        $registryItems = $registry->getItems();
        $this->assertEquals(
            $this->_getExpectations()->getCount(),
            $registryItems->count()
        );
    }
}

这里唯一的变化是,我们正在用期望值替换断言中的硬编码值。如果我们需要做任何更改,我们不需要更改代码;我们可以更新期望值和赛程。

水貂功能测试

到目前为止,我们已经学会了如何对我们的代码运行单元测试,虽然单元测试对于测试代码的各个部分和逻辑非常有用,但对于 Magento 这样的大型应用程序,从用户的角度进行测试非常重要。

功能测试主要涉及黑盒测试,不关心应用程序的源代码。

为了做到这一点,我们可以用水貂。Mink 是一个简单的 PHP 库,可以虚拟化 web 浏览器。Mink 使用不同的驱动程序工作。开箱即用,支持以下驱动程序:

  • GoutteDriver:这是 Symfony framework 创始人编写的纯 PHP 无头浏览器
  • SahiDriver:这是一款新的 JS 浏览器控制器,正在迅速取代 Selenium
  • ZombieDriver:这是一个用Node.js编写的浏览器仿真器,目前仅限于一个浏览器(Chromium)
  • SeleniumDriver:这是目前最流行的浏览器驱动程序;最初的版本依赖第三方服务器运行测试
  • Selenium2Driver:当前 Selenium 的版本在 Python、Ruby、Java 和 C 中得到了完全支持#

Magento 水貂的安装和设置

将水貂与 Magento 结合使用非常简单,多亏了 Johann Reinke,他创建了一个 Magento 扩展,以促进水貂与 Magento 的集成。

我们将使用 Modgit 安装此扩展,这是一个受 Modman 启发的模块管理器。Modgit 允许我们直接从 GitHub 存储库部署 Magento 扩展,而无需创建符号链接。

安装 Modgit 可以通过三行代码实现:

wget -O modgit https://raw.github.com/jreinke/modgit/master/modgit
chmod +x modgit
sudo mv modgit /usr/local/bin

那不是很容易吗?现在我们可以继续安装 Magento Mink 了,为此我们应该感谢 Modgit,因为它更容易:

  1. 移动到 Magento 根目录。
  2. 运行以下命令:

    ```php modgit init modgit -e README.md clone mink https://github.com/jreinke/magento-mink.git

    ```

就这样。Modgit 将负责直接从 GitHub 存储库为我们安装文件。

创建我们的第一个测试

Mink测试也存储在Test文件夹中。让我们创建Mink测试类的基本框架:

  1. 导航到模块根目录上的Test文件夹。
  2. 创建一个名为Mink的新目录。
  3. Mink目录中,创建一个名为Registry.php的新 PHP 类。
  4. 复制以下代码(文件位置为app/code/local/Mdg/Giftregistry/Test/Mink/Registry.php

    ```php <?php class Mdg_Giftregistry_Test_Mink_Registry extends JR_Mink_Test_Mink {
    public function testAddProductToRegistry() { $this->section('TEST ADD PRODUCT TO REGISTRY'); $this->setCurrentStore('default'); $this->setDriver('goutte'); $this->context();

        // Go to homepage
        $this->output($this->bold('Go To the Homepage'));
        $url = Mage::getStoreConfig('web/unsecure/base_url');
        $this->visit($url);
        $category = $this->find('css', '#nav .nav-1-1 a');
        if (!$category) {
            return false;
        }
    
        // Go to the Login page
        $loginUrl = $this->find('css', 'ul.links li.last a');
        if ($loginUrl) {
            $this->visit($loginUrl->getAttribute('href'));
        }
    
        $login = $this->find('css', '#email');
        $pwd = $this->find('css', '#pass');
        $submit = $this->find('css', '#send2');
    
        if ($login && $pwd && $submit) {
            $email = 'user@example.com';
            $password = 'password';
            $this->output(sprintf("Try to authenticate '%s' with password '%s'", $email, $password));
            $login->setValue($email);
            $pwd->setValue($password);
            $submit->click();
            $this->attempt(
                $this->find('css', 'div.welcome-msg'),
                'Customer successfully logged in',
                'Error authenticating customer'
            );
        }
    
        // Go to the category page
        $this->output($this->bold('Go to the category list'));
        $this->visit($category->getAttribute('href'));
        $product = $this->find('css', '.category-products li.first a');
        if (!$product) {
            return false;
        }
    
        // Go to product view
        $this->output($this->bold('Go to product view'));
        $this->visit($product->getAttribute('href'));
        $form = $this->find('css', '#product_registry_form');
        if ($form) {
            $addToCartUrl = $form->getAttribute('action');
            $this->visit($addToCartUrl);
            $this->attempt(
                $this->find('css', '#btn-add-giftregistry'),
                'Product added to gift registry successfully',
                'Error adding product to gift registry'
            );
        }
    }
    

    } ```

乍一看,您可以看出这个功能测试与我们之前构建的单元测试有很大的不同,尽管看起来很多代码都非常简单。先前的测试已在代码块中停止。让我们分析一下上一个测试的作用:

  • 设置浏览器驱动程序和当前存储
  • 转到主页并检查有效的类别链接
  • 尝试以测试用户身份登录
  • 转到分类页
  • 打开该类别的第一个产品
  • Try to add the product to the customer's gift registry

    此测试不做任何假设,并且期望现有礼品注册中心中有一个有效的客户。

在创建Mink测试时,我们必须记住一些注意事项:

  • 每个测试类必须扩展JR_Mink_Test_Mink
  • 每个测试函数必须以 test 关键字开头

最后,我们唯一要做的就是运行测试。我们可以通过转到命令行并运行以下命令来完成此操作:

$ php shell/mink.php

如果一切顺利,我们将看到类似于以下输出的结果:

---------------------- SCRIPT START ---------------------------------
Found 1 file
-------------- TEST ADD PRODUCT TO REGISTRY -------------------------
Switching to store 'default'
Now using Goutte driver
----------------------------------- CONTEXT ------------------------------------
website: base, store: default
Cache info:
config            Disabled  N/A       Configuration
layout            Disabled  N/A       Layouts
block_html        Disabled  N/A       Blocks HTML output
translate         Disabled  N/A       Translations
collections       Disabled  N/A       Collections Data
eav               Disabled  N/A       EAV types and attributes
config_api        Disabled  N/A       Web Services Configuration
config_api2       Disabled  N/A       Web Services Configuration
ecomdev_phpunit   Disabled  N/A       Unit Test Cases

Go To the Homepage [OK]
Try to authenticate user@example.com with password password [OK]
Go to the category list [OK]
Go to product view [OK]
Product added to gift registry successfully

总结

在本章中,我们复习了 Magento 测试的基础知识。本章的目的不是构建复杂的测试或深入研究,而是让我们了解如何测试扩展。

在本章中,我们讨论了几个重要的主题,通过使用适当的测试套件和工具,它可以使我们避免将来的麻烦并提高代码的质量。

在下一章也是最后一章中,我们将学习如何打包和分发自定义代码和扩展。