nimut/testing-framework

此包已被废弃,不再维护。作者建议使用 typo3/testing-framework 包。

TYPO3 测试框架,提供 PHPUnit 测试的基础类和配置

6.0.1 2022-03-15 10:42 UTC

README

没有计划支持高于 TYPO3 v11 版本的 nimut/testing-framework。建议您切换到 typo3/testing-framework 以支持 TYPO3 v12 及以上版本。typo3/testing-framework 提供了对测试多个核心版本的改进支持。更多信息和介绍可以在官方 TYPO3 文档中找到

ℹ️ 显示 TYPO3 9.5 到 11.5 的文档

Latest Stable Version Build Status StyleCI

测试框架的目标是提供一种良好的方式来编写和运行多个版本的 TYPO3 CMS 的单元测试和功能测试。目前支持并测试了 TYPO3 CMS 9.5 到 11.5

安装

使用 Composer 安装测试框架。

composer require --dev nimut/testing-framework

Composer 将将包添加到您的 composer.json 中的开发要求,并安装 PHPUnit 和 vfsStream 作为其依赖项。

使用

单元测试

\Nimut\TestingFramework\TestCase\UnitTestCase 继承您的测试类。

要执行扩展的单元测试,请运行

vendor/bin/phpunit -c vendor/nimut/testing-framework/res/Configuration/UnitTests.xml \
    typo3conf/ext/example_extension/Tests/Unit

ViewHelper

为了方便测试您的 Fluid ViewHelper,您可以从 \Nimut\TestingFramework\TestCase\ViewHelperBaseTestcase 继承测试类。

您应该在测试类的 setUp() 方法中设置您的主题类

/**
 * @var \PHPUnit_Framework_MockObject_MockObject
 */
protected $viewHelper;

protected function setUp()
{
    parent::setUp();
    $this->viewHelper = $this->getMockBuilder(RenderChildrenViewHelper::class)->setMethods(['renderChildren'])->getMock();
    $this->injectDependenciesIntoViewHelper($this->viewHelper);
    $this->viewHelper->initializeArguments();
}

功能测试

\Nimut\TestingFramework\TestCase\FunctionalTestCase 继承您的测试类。

要执行扩展的功能测试,请运行

vendor/bin/phpunit -c vendor/nimut/testing-framework/res/Configuration/FunctionalTests.xml \
    typo3conf/ext/example_extension/Tests/Functional

扩展准备

您可以在 composer.json 文件中添加一个脚本部分,将您的扩展符号链接到正确的根目录/web目录。

"scripts": {
    "post-autoload-dump": [
        "@prepare-extension-test-structure"
    ],
    "prepare-extension-test-structure": [
        "Nimut\\TestingFramework\\Composer\\ExtensionTestEnvironment::prepare"
    ]
}

数据库抽象

为了能够测试 TYPO3 CMS 8 及以上版本,nimut/testing-framework 提供了自己的数据库抽象层。

在 FunctionalTestCase 中调用 $this->getDatabaseConnection() 以获取 \Nimut\TestingFramework\Database\DatabaseInterface 的实例。

nimut/testing-framework 数据库接口内置以下数据库函数:

  • select
  • selectSingleRow
  • selectCount
  • insertArray
  • lastInsertId
  • updateArray
  • delete
  • getDatabaseInstance

如果您需要自定义数据库请求,可以使用 $this->getDatabaseConnection()->getDatabaseInstance() 获取当前 TYPO3 版本的适当数据库实例。您需要检查此实例是否是 \TYPO3\CMS\Core\Database\Query\QueryBuilder(TYPO3 CMS 8 及以上)或 \TYPO3\CMS\Core\Database\DatabaseConnection 的实例(TYPO3 CMS 7)。

数据库固件

nimut/testing-framework 随带多个 TYPO3 CMS 核心数据库表的数据库固件

  • pages
  • pages_language_overlay
  • sys_file_storage
  • sys_language
  • tt_content

要使用数据库固定数据,您可以在测试文件中触发导入。

$this->importDataSet('ntf://Database/pages.xml');

前端请求

nimut/testing-framework 随带一个支持前端请求的自定义 TypoScript 文件。

// First import some page records
$this->importDataSet('ntf://Database/pages.xml');

// Import tt_content record that should be shown on your home page
$this->importDataSet('ntf://Database/tt_content.xml');

// Setup the page with uid 1 and include the TypoScript as sys_template record
$this->setUpFrontendRootPage(1, array('ntf://TypoScript/JsonRenderer.ts'));

// Fetch the frontend response
$response = $this->getFrontendResponse(1);

// Assert no error has occured
$this->assertSame('success', $response->getStatus());

// Get the first section from the response
$sections = $response->getResponseSections();
$defaultSection = array_shift($sections);

// Get the section structure
$structure = $defaultSection->getStructure();

// Make assertions for the structure
$this->assertTrue(is_array($structure['pages:1']['__contents']['tt_content:1']));

结构

前端请求返回的结构是一个包含有关您的页面及其子页面信息的数组。

[
    // Page for your request
    'pages:1' => [
        'uid' => '1',
        'pid' => '0',
        'sorting' => '0',
        'title' => 'Root',
        // Array with subpages
        '__pages' => [
            'pages:2' => [
                'uid' => '2',
                'pid' => '1',
                'sorting' => '0',
                'title' => 'Dummy 1-2',
            ],
            'pages:5' => [
                'uid' => '5',
                'pid' => '1',
                'sorting' => '0',
                'title' => 'Dummy 1-5',
            ],
        ],
        // Array with content elements
        '__contents' => [
              'tt_content:1' => [
                  'uid' => '1',
                  'pid' => '1',
                  'sorting' => '0',
                  'header' => 'Test content',
                  'sys_language_uid' => '0',
                  'categories' => '0',
              ],
        ],
    ],
]

如果您需要有关记录的附加信息,可以提供带有所需配置的附加 TypoScript。

// Setup the page with uid 1 and include ntf and own TypoScript
$this->setUpFrontendRootPage(
    1,
    array(
        'ntf://TypoScript/JsonRenderer.ts',
        'EXT:example_extension/Tests/Functional/Fixtures/TypoScript/Config.ts'
    )
);

Config.ts TypoScript 文件的内容

config.watcher.tableFields.tt_content = uid,_ORIG_uid,_LOCALIZED_UID,pid,sorting,sys_language_uid,header,categories,CType,subheader,bodytext

附加信息

以下链接提供了关于TYPO3 CMS 扩展测试的文档和附加信息

最后但同样重要的是,您可以在 "#cig-testing" Slack频道中寻求进一步的支持。