TYPO3: cli_dispatch.phpsh debugging

At work I needed to integrate some TYPO3 extension in our Jenkins Continous Integration setup that runs unit tests, builds API docs, checks coding standards etc.

The extension was written by someone else, so it did not use our self-made TYPO3 loading scripts for PHPUnit but the TYPO3 phpunit extension. You can't simply run

$ cd tests
$ phpunit .

but have to use the TYPO3 CLI script it provides:

$ cd /path/to/typo3
$ ./typo3/cli_dispatch.phpsh phpunit -c typo3conf/ext/someext/tests/phpunit.xml
$

Unfortunately, this was all of the output: Nothing. Time to start debugging!

Exit codes

At first I made sure that I see an error and not a normal program that just didn't output anything:

$ ./typo3/cli_dispatch.phpsh phpunit status; echo $?
1
$

$? in shell script is the variable containing the exit status of the last ended program. Here it is 1, which is non-zero and thus means: error.

The other change I made was adding the undocumented status argument - that should output some technical data for the phpunit TYPO3 CLI script. That did obviously not help in any way.

Error display

TYPO3 sets error reporting and display settings itself, and you should not simply try to add some hacks to the relevant files. There are just too many of them, it will mess up your installation and there is a simpler way: Adjust typo3conf/localconf.php by adding

$TYPO3_CONF_VARS['SYS']['displayErrors'] = 2;

This is the highest error display setting in TYPO3, and it gives us some more information:

$ ./typo3/cli_dispatch.phpsh phpunit; echo $?
ERROR: No backend user named "_cli_phpunit" was found!
 
0

We do know the cause of the problem. Creating the backend user via the admin interface (no special settings/groups, it just has to exist) makes the status command work:

$ ./typo3/cli_dispatch.phpsh phpunit status; echo $?
Status of TYPO3 CLI script:
 
Username [uid]: _cli_phpunit [55]
Database: bbag_relaunch2012
PATH_site: /home/christian.weiske/bm/
 
0

Error reporting

Now that the script works, phpunit can be run again:

$ ./typo3/cli_dispatch.phpsh phpunit typo3conf/ext/someext/tests/; echo $?
1

Still an error that does not get displayed. This time we need to tell TYPO3 that we are developers and not just normal users by adding the following line to typo3conf/localconf.php:

$TYPO3_CONF_VARS['SYS']['devIPmask'] = '*';

The devIPmask should be as restrictive as possible, but since we're on the development system AND have no real IP (since we're on CLI), this setting is temporarily ok. And it helps:

$ ./typo3/cli_dispatch.phpsh phpunit typo3conf/ext/someext/tests/; echo $?
 
Uncaught TYPO3 Exception Neither "typo3conf/ext/someext/tests/.php" nor
  "typo3conf/ext/some/ext/tests/.php" could be opened.
thrown in file
  /path/to/typo3/typo3conf/ext/phpunit/PEAR/PHPUnit/Util/Skeleton/Test.php
  in line 100
 
0

Using the configuration file made it work then:

$ ./typo3/cli_dispatch.phpsh phpunit -c typo3conf/ext/someext/tests/phpunit.xml
PHPUnit 3.6.11 by Sebastian Bergmann
 
Configuration read from /path/to/typo3/typo3conf/ext/someext/tests/phpunit.xml
 
...................................
 
Time: 41 seconds, Memory: 79.42Mb
 
OK (52 tests, 274 assertions)

Conclusion

To debug TYPO3 CLI scripts, make sure your typo3conf/localconf.php contains

$TYPO3_CONF_VARS['SYS']['displayErrors'] = 2;
$TYPO3_CONF_VARS['SYS']['devIPmask'] = '*';

Written by Christian Weiske.

Comments? Please send an e-mail.