Running single tests in Codeception
January 17, 2014
While undergoing a major architectural change in my framework I've found myself overwhelmed by the wall of failures and errors that Codeception threw once I launched an innocent
codecept run unit
from the project root. It's easier to launch single tests when everything works.
One test at a time
It's possible to run one test at a time via codeception CLI interface via a command like
codecept run tests/unit/NamespaceResolverTest.php
but my problem is that, in my furious coding restructuring, I've broken many dependencies and the default bootstrap file, the _bootstrap.php
in the tests/unit
folder, will try to include many classes with missing or broken links.
Create an alternative bootstrap file for PHPUnit
First approach to get around the block was to create an alternative PHPUnit bootstrap file loading only working classes and specifying its path while running PHPUnit
phpunit --colors --bootstrap tests/unit/_phpunit_bootstrap.php tests/unit/NamespaceResolver.php
It now works but it works because I'm running a PHPUnit test generated via Codeception with the command
codecept generate:phpunit unit NamespaceResolver
but many other tests I'd like to run are not PHPUnit tests at all.
A better dynamic way
Codeception is very smart and a better way to do it is to configure either the local to the unit tests tests/unit/_bootstrap.php
or the global tests/_bootstrap.php
files to autoload classes that are requested.
Autoloading will include only classes that are called in code and since I'm running single tests file with
codecept run test/unit/NamespaceResolverTest.php
only the NamespaceResolver
class will be included. I can either add in one of the above mentioned bootstrap files a straight require_once
line (not so smart) like
// file tests/unit/_bootstrap.php or tests/_bootstrap.php
require_once dirname(__FILE__) . '/path/to/class/to/include.php'
or use the very polite and convenient autoload structure Codeception provides (smart)
// file tests/unit/_bootstrap.php or tests/_bootstrap.php
Codeception\Util\Autoload::register( 'TAD\\MVC\\Helpers', 'Resolver', dirname( dirname( __FILE__ ) ) . '/libs/mvc/helpers' );
that means
Codeception\Util\Autoload::register( 'TAD\\MVC\\Helpers', // anytime I request a class in this namespace
'Resolver', // whose name ends in 'Resolver'
dirname( dirname( __FILE__ ) ) . '/libs/mvc/helpers' ); // go and look for it here
I can now run single tests via Codeception.