Test inline code samples from your docblocks using PHPUnit!
- This is not particularly mature. Issues and pull requests welcome.
- The extracted sample code is
eval
'd for testing, with all those security implications. As always, be mindful only to run trusted code in sensitive environments. - Right now it only works on classes, class methods, and functions. It does no magic to expose private or protected methods, so normal rules apply.
First, install sampler
as a dependency.
$ composer require aaronhipple/sampler
Then, in your PHPUnit suite, implement a case extending AbstractSampleTestCase
.
use AaronHipple\Sampler\AbstractSampleTestCase;
class SampleTest extends AbstractSampleTestCase
{
/**
* Provide absolute paths to the directories to scan for samples.
*
* @return []string An array of folder paths.
*/
protected function paths()
{
return [__DIR__ . '/../src'];
}
/**
* (Optional) Provide a list of file extensions to scan.
*/
protected function extensions()
{
return ['php', 'inc'];
}
}
Finally, write some samples! You can use our @sample
annotation...
/**
* Say hello to someone!
*
* @sample
* use PHPUnit\Framework\Assert;
* Assert::assertInternalType(
* 'string',
* say_hello('Frank')
* );
* @sample
* use PHPUnit\Framework\Assert;
* Assert::assertEquals(
* 'Hello, Aaron!',
* say_hello('Aaron')
* );
*/
function say_hello($name) {
return "Hello, $name!";
}
...or good ol' inline markdown.
/**
* Say hello to someone!
*
* # Examples
*
* ```
* use PHPUnit\Framework\Assert;
* Assert::assertEquals(
* 'Hello, Aaron!',
* say_hello('Aaron')
* );
* ```
*
* ```
* use PHPUnit\Framework\Assert;
* Assert::assertEquals(
* 'Hello, Frank!',
* say_hello('Frank')
* );
* ```
*/
function say_hello($name) {
return "Hello, $name!";
}
Run your test suite as usual, with phpunit
.
- Pull requests are welcome.
- More tests please.
- PSR-2 is good. Use
phpcbf
.