wagnerpinheiro/sf-php-unit2plugin

此包最新版本(dev-master)没有可用的许可信息。

symfony 插件 sfPHPUnit2Plugin 的非官方 git 复制

dev-master 2014-05-26 18:03 UTC

This package is not auto-updated.

Last update: 2024-09-24 07:24:56 UTC


README

此仓库是 symfony-project.org 上的此插件 svn 版本的非官方复制,链接:symfony-project.org

所有荣誉归原作者 Frank Stelzer 所有。

sfPHPUnit2Plugin 是一个 symfony 插件,它为 PHPUnit 添加了单元测试和功能测试的基本功能。

Symfony 1.x 默认提供 lime 作为测试框架,但这可能不符合每个公司的测试指南。此插件提供了一些生成 PHPUnit 测试用例和执行它们的任务。它模仿了 lime 的用法,因此从 lime 测试切换过来非常容易。此插件针对 sf 1.4 项目进行了优化,但通过一些技巧也可以用于 sf 1.2。

新插件版本支持生成和执行 selenium 测试。这些测试某种程度上是功能测试的扩展,但它们是独立于现有的单元或功能测试处理的。只想运行正常原生功能测试的开发者无需担心 selenium 的处理。

要求

  • 需要 symfony 版本 1.2 或更高
  • sf 1.2 项目需要运行特殊的兼容性任务(见下面的 phpunit:generate-compat)
  • 命令行中必须可用 PHPUnit 命令行测试运行器,作为 phpunit(此插件未捆绑 PHPUnit)
  • 运行所有测试需要 PHPUnit 3.4,否则此插件与 PHPUnit 版本无关

安装

此插件目前标记为 beta。因此,必须在插件安装器中添加稳定性选项

    $ ./symfony plugin:install --stability=beta sfPHPUnit2Plugin

生成测试用例

单元测试

为单元测试生成测试用例

    $ ./symfony phpunit:generate-unit <name>

test/phpunit/unit/<name>Test.php 中创建一个新文件

必须运行一个额外的任务为 symfony 1.2 项目创建特殊的引导文件

    $ ./symfony phpunit:generate-compat

此任务只需调用一次。

功能测试

为功能测试生成测试用例

    $ ./symfony phpunit:generate-functional <application> <controller_name>

test/phpunit/functional/<application>/<controller_name>ActionsTest.php 中创建一个新文件。此生成不是在新模块生成时自动完成的,目前需要手动调用。

Selenium 测试

为 selenium 测试生成测试用例

    $ ./symfony phpunit:generate-selenium <application> <controller_name>

test/phpunit/selenium/<application>/<controller_name>ActionsTest.php 中创建一个新文件。此生成不是在新模块生成时自动完成的,目前需要手动调用。

选项

  • overwrite: 默认情况下不会覆盖现有的测试用例。使用此选项启用覆盖。
  • dir: 生成的测试用例应保存到的子文件夹。
  • template: 要用于此测试的模板名称。模板文件应放在 "data/sfPHPUnitPlugin/template//"
  • plugin: 要为该插件生成测试的插件名称,不带基础目录(例如 sfPHPUnit 而不是 sfPHPUnitPlugin)。

示例

    $ #test/phpunit/unit/somesubfolder/SomeToolsTest.php
    $ ./symfony phpunit:generate-unit --dir="somesubfolder" --overwrite --template="my_own_template" SomeTools

    $ #test/phpunit/functional/frontend/homeActionsTest.php
    $ ./symfony phpunit:generate-functional frontend home

    $ #test/phpunit/selenium/frontend/homeActionsTest.php
    $ ./symfony phpunit:generate-selenium frontend home

    $ #plugins/anExamplePlugin/test/phpunit/unit/SomeToolsTest.php
    $ ./symfony phpunit:generate-unit --plugin=anExample SomeTools

用法

用法

单元测试

官方文档中给出的单元测试示例将如下所示

<?php
require_once dirname(__FILE__).'/../bootstrap/unit.php';

class SomeTest extends sfPHPUnitBaseTestCase
{
  protected function _start()
  {
    $this->getTest()->diag('test is starting');
  }

  protected function _end()
  {
    $this->getTest()->diag('test is ending');
  }

  public function testStrtolower()
  {
    $t = $this->getTest();

    // strtolower()
    $t->diag('strtolower() ...');
    $t->isa_ok(strtolower('Foo'), 'string',
	    'strtolower() returns a string');
    $t->is(strtolower('FOO'), 'foo',
	    'strtolower() transforms the input to lowercase');
    $t->is(strtolower('foo'), 'foo',
	    'strtolower() leaves lowercase characters unchanged');
    $t->is(strtolower('12#?@~'), '12#?@~',
	    'strtolower() leaves non alphabetical characters unchanged');
    $t->is(strtolower('FOO BAR'), 'foo bar',
	    'strtolower() leaves blanks alone');
    $t->is(strtolower('FoO bAr'), 'foo bar',
	    'strtolower() deals with mixed case input');

    $this->assertEquals('foo', strtolower('FOO'));
  }
}

getTest 方法返回一个 sfPHPUnitTest 实例,该实例模仿 lime 接口。这种机制使得从现有的 lime 测试迁移变得非常简单。当然,您可以直接调用本机 PHPUnit API 进行断言。此测试用例的基类使用 PHPUnit 的 setUptearDown 方法在每次测试前后执行某些操作。当您在测试阶段需要一些自定义代码时,请使用相应的 _start_end 方法。

功能测试

这里是一些生成的功能测试的内容

<?php
require_once dirname(__FILE__).'/../../bootstrap/functional.php';

class functional_frontend_homeActionsTest extends sfPHPUnitBaseFunctionalTestCase
{
  protected function getApplication()
  {
    return 'frontend';
  }

  public function testDefault()
  {
    $browser = $this->getBrowser();

    $browser->
      get('/home/index')->

      with('request')->begin()->
        isParameter('module', 'home')->
        isParameter('action', 'index')->
      end()->

      with('response')->begin()->
        isStatusCode(200)->
        checkElement('body', '!/This is a temporary page/')->
      end()
    ;
  }
}

如您所见,主要的测试代码几乎与 lime 的相同。这是因为浏览器实例在这里与当前的 PHPUnit 测试用例相关联,而不是与 lime 测试实例相关联。唯一不同的是获取浏览器实例的方式。

Selenium 测试

Selenium 测试具有额外的 Selenium 支持,其基类扩展了 PHPUnit 的 PHPUnit_Extensions_SeleniumTestCase。请参阅 PHPUnitSelenium 的官方文档,获取详细信息和使用方法。

生成配置

可以通过此新任务为任何 PHPUnit 测试运行器生成默认配置文件:$ ./symfony phpunit:generate-configuration

这将在项目的根目录下生成一个 phpunit.xml.dist 配置文件。它包含默认配置,但您可以根据项目需求修改此文件。此文件在生成用户引导文件时默认不会生成。一些开发者可能不喜欢这种生成,因此它是可选的。

phpunit.xml.dist 非常强大,您可以使用一些附加选项完全更改 PHPUnit 的行为。例如,您可以启用或禁用彩色输出或将测试运行程序的结果记录到与 JUnit 兼容的文件中,例如由 Hudson 等持续集成工具分析。

也许您已经习惯了在项目中集成 phpunit.xml 文件。但 Christian 指出,使用 phpunit.xml.dist 配置文件是一种很好的做法。phpunit.xml.dist 包含项目级别的配置选项。如果需要单独的配置,请创建一个 phpunit.xml 并将其放置在那里。PHPUnit 将首先检查 phpunit.xml 文件的存在,然后查找 .dist 文件。

重要

当在项目中使用 phpunit.xml(.dist) 文件时,必须使用此命令运行运行所有测试的任务

    $ ./symfony phpunit:test-all --configuration

否则,配置文件不会被 PHPUnit 读取。

执行测试用例

单元测试

执行单元测试

    $ ./symfony phpunit:test-unit <name>
    $ # equal to
    $ phpunit test/phpunit/unit/<name>Test.php

如果没有提供名称参数,则将执行所有单元测试!

功能测试

执行功能测试

    $ ./symfony phpunit:test-functional <application> <controller_name>
    $ # equal to
    $ phpunit test/phpunit/functional/<application>/<controller_name>ActionsTest.php

这两个参数都是可选的。如果没有提供,则将执行所有功能测试。

Selenium 测试

执行 Selenium 测试

    $ ./symfony phpunit:test-selenium <application> <controller_name>
    $ # equal to
    $ phpunit test/phpunit/selenium/<application>/<controller_name>ActionsTest.php

这两个参数都是可选的。如果没有提供,则将执行所有 Selenium 测试。

选项

  • 选项:一个字符串选项,它将被直接传递给 PHPUnit 的命令行测试运行程序。
  • dir(仅限单元测试):现有单元测试所在的子文件夹。
  • base(实验性):自定义测试用例所在的基文件夹路径。例如,可以用于插件测试。

示例

执行单元测试

    $ ./symfony phpunit:test-unit SomeTools
    $ # equal to
    $ phpunit test/phpunit/unit/SomeToolsTest.php

从子文件夹执行单元测试

    $ ./symfony phpunit:test-unit --dir="somesubfolder" --options="--colors --verbose" SomeTools
    $ # equal to
    $ phpunit --colors --verbose test/phpunit/unit/somesubfolder/SomeToolsTest.php

执行功能测试

    $ ./symfony phpunit:test-functional --options="--colors" frontend home
    $ # equal to
    $ phpunit --colors test/phpunit/functional/frontend/homeActionsTest.php

在进程隔离的情况下执行所有功能测试(需要 PHPUnit 3.4)

    $ ./symfony phpunit:test-functional --options="--colors --process-isolation"
    $ # equal to
    $ phpunit --colors --process-isolation test/phpunit/functional

在进程隔离的情况下执行所有测试(需要进程隔离选项!)

    $ ./symfony phpunit:test-all --options="--colors --process-isolation"

使用在 phpunit.xml(.dist) 中定义的定制测试套件执行所有测试

    $ ./symfony phpunit:test-all --configuration

在插件中执行单元测试

    $ # file has to be located in plugins/sfPHPUnit2Plugin/test/unit/fooPluginTest.php
    $ ./symfony phpunit:test-unit --base="plugins/sfPHPUnit2Plugin/test" fooPlugin

自定义模板

该插件提供对位于 sfPHPUnit2Plugin/data/template 中的模板进行自定义。如果需要覆盖模板内容,请在您的数据目录中添加新的模板文件: your_project/data/sfPHPUnit2Plugin/template。文件和文件夹结构必须与插件中的结构相同。当项目数据目录中不存在模板文件时,插件将使用原始模板作为备选。

例如

your_project/data/sfPHPUnit2Plugin/template/unit/unit_test.tpl 中放置文件将覆盖单元测试模板的内容。下次生成单元测试时,插件将使用此自定义内容。

另外,您可以在测试生成时使用 --template 选项,通过名称强制使用模板,如下所示

    $ ./symfony phpunit:generate-unit --template="unit_test" MyNewUnitTest

一些提示

  • 需要使用 "process isolation" PHPUnit 选项(仅在 PHPUnit 3.4 中可用)来运行多个应用程序的功能测试!
  • 使用 PHPUnit 的 colors 选项来获取您测试结果的彩色表示
  • 您不喜欢 PHPUnit 语法?使用 $this->getTest() 获取 sfPHPUnitTest 的实例,该实例模仿 lime-like 接口!
  • 使用 _start_end 方法在测试前后执行某些操作(请勿覆盖 setUp 和 tearDown 方法)!
  • 在您的单元测试中实现 getApplication 方法,然后调用 getContext 来创建相应的 sfContext 实例

代码片段

在测试中加载 fixtures

Doctrine

  protected function _start()
  {
    new sfDatabaseManager(ProjectConfiguration::getApplicationConfiguration('frontend', 'test', true));
    Doctrine_Core::loadData(sfConfig::get('sf_test_dir').'/fixtures');
  }

Propel

  protected function _start()
  {
    new sfDatabaseManager(ProjectConfiguration::getApplicationConfiguration('frontend', 'test', true));
    $loader = new sfPropelData();
    $loader->loadData(sfConfig::get('sf_test_dir').'/fixtures');
  }

在单元测试中创建 sfContext 实例

  protected function getApplication()
  {
    return 'frontend';
  }

  public function testContext()
  {
    $this->assertEquals('frontend', $this->getContext()->getConfiguration()->getApplication());
  }

插件测试文件的代码

  require_once dirname(__FILE__).'/../../../../test/phpunit/bootstrap/unit.php';

  class unit_plugin_sfPHPUnit2Plugin_fooPluginTest extends sfPHPUnitBaseTestCase
  {
    public function testDefault()
    {
      $t = $this->getTest();
      // test something
    }
  }

待办事项

  • 添加对插件测试的完整支持