nimut / testing-framework
TYPO3 testing framework that provides base classes and configuration for PHPUnit tests
Installs: 501 286
Dependents: 309
Suggesters: 0
Security: 0
Stars: 49
Watchers: 6
Forks: 24
Open Issues: 13
Requires
- php: >= 7.0, < 7.5
- mikey179/vfsstream: ^1.6
- phpunit/phpunit: ^6.0 || ^7.0
- typo3/cms-backend: ^8.7.30 || ^9.5.13 || ^10.4 || ~11.0 || dev-master
- typo3/cms-core: ^8.7.30 || ^9.5.13 || ^10.4 || ~11.0 || dev-master
- typo3/cms-extbase: ^8.7.30 || ^9.5.13 || ^10.4 || ~11.0 || dev-master
- typo3/cms-fluid: ^8.7.30 || ^9.5.13 || ^10.4 || ~11.0 || dev-master
- typo3/cms-frontend: ^8.7.30 || ^9.5.13 || ^10.4 || ~11.0 || dev-master
- typo3/cms-install: ^8.7.30 || ^9.5.13 || ^10.4 || ~11.0 || dev-master
- typo3/cms-recordlist: ^8.7.30 || ^9.5.13 || ^10.4 || ~11.0 || dev-master
Requires (Dev)
- composer/composer: ^1.10
- nimut/phpunit-merger: ^0.3
- nimut/testing-framework-testbase: @dev
Conflicts
- symfony/finder: 2.7.44 || 2.8.37 || 3.4.7 || 4.0.7
- typo3/cms-composer-installers: <1.5
- typo3/phar-stream-wrapper: <3.1.3
- dev-master / 5.x-dev
- 5.2.0
- 5.1.0
- 5.0.4
- 5.0.3
- 5.0.2
- 5.0.1
- 5.0.0
- 4.x-dev
- 4.2.0
- 4.1.11
- 4.1.10
- 4.1.9
- 4.1.8
- 4.1.7
- 4.1.6
- 4.1.5
- 4.1.4
- 4.1.3
- 4.1.2
- 4.1.1
- 4.1.0
- 4.0.0
- 3.x-dev
- 3.0.7
- 3.0.6
- 3.0.5
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.x-dev
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.x-dev
- 1.1.9
- 1.1.8
- 1.1.7
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.1
- 1.0.0
- 0.4.1
- 0.4.0
- 0.3.1
- 0.3.0
- 0.2.1
- 0.2.0
- 0.1.1
- 0.1.0
- dev-pre-merge
- dev-check-database-import
This package is auto-updated.
Last update: 2021-01-19 11:38:37 UTC
README
The aim of the testing framework is to provide a good way to write and run unit and functional tests for multiple versions of the TYPO3 CMS. Currently TYPO3 CMS 8.7 up to 10.3-dev are tested and supported.
Installation
Use Composer to install the testing framework.
$ composer require --dev nimut/testing-framework
Composer will add the package as a dev requirement to your composer.json and install PHPUnit and vfsStream as its dependencies.
Usage
Unit Tests
Inherit your test class from \Nimut\TestingFramework\TestCase\UnitTestCase
.
To execute the unit tests of your extension run
$ vendor/bin/phpunit -c vendor/nimut/testing-framework/res/Configuration/UnitTests.xml \ typo3conf/ext/example_extension/Tests/Unit
ViewHelper
For an easy way to test your Fluid ViewHelper you can inherit the test class from \Nimut\TestingFramework\TestCase\ViewHelperBaseTestcase
.
You should setup your subject class in your setUp() method of the test class:
/** * @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(); }
Functional Tests
Inherit your test class from \Nimut\TestingFramework\TestCase\FunctionalTestCase
.
To execute the functional tests of your extension run
$ vendor/bin/phpunit -c vendor/nimut/testing-framework/res/Configuration/FunctionalTests.xml \ typo3conf/ext/example_extension/Tests/Functional
Extension preparation
You can add a script section to your composer.json
file to symlink your extension to the proper root-dir/web-dir.
"scripts": { "post-autoload-dump": [ "@prepare-extension-test-structure" ], "prepare-extension-test-structure": [ "Nimut\\TestingFramework\\Composer\\ExtensionTestEnvironment::prepare" ] }
Database abstraction
To be able to test against TYPO3 CMS 8 and later, nimut/testing-framework provides an own database abstraction layer.
In your FunctionalTestCase call $this->getDatabaseConnection()
to get an instance of
\Nimut\TestingFramework\Database\DatabaseInterface
.
Following database functions are built in the nimut/testing-framework database interface:
- select
- selectSingleRow
- selectCount
- insertArray
- lastInsertId
- updateArray
- delete
- getDatabaseInstance
If you need own database requests you can get the proper database instance of the current TYPO3 version by using
$this->getDatabaseConnection()->getDatabaseInstance()
. You have to check weather this instance is a
\TYPO3\CMS\Core\Database\Query\QueryBuilder
(TYPO3 CMS 8 and above) or an instance of
\TYPO3\CMS\Core\Database\DatabaseConnection
(TYPO3 CMS 7).
Database fixtures
The nimut/testing-framework ships database fixtures for several TYPO3 CMS core database tables:
- pages
- pages_language_overlay
- sys_file_storage
- sys_language
- tt_content
To use the database fixtures you can trigger an import in your test file
$this->importDataSet('ntf://Database/pages.xml');
Frontend requests
The nimut/testing-framework ships an own TypoScript file for supporting frontend requests out of the box.
// 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']));
Structure
The returned structure of a frontend request is an array with some information about your page and its children.
[ // 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', ], ], ], ]
If you need additional information about a record, you can provide additional TypoScript with the needed configuration.
// 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' ) );
Content of the TypoScript file Config.ts
config.watcher.tableFields.tt_content = uid,_ORIG_uid,_LOCALIZED_UID,pid,sorting,sys_language_uid,header,categories,CType,subheader,bodytext
Additional information
Following links provide documentation and additional information about TYPO3 CMS extension testing
- Unit tests for dummies
- How to write functional test
- Functional tests with TYPO3
- Functional tests for dummies
Last but not least you may ask for further support in the Slack channel "#cig-testing".