In case you didn't notice, recently I have been working in a secret project called Pest: a delightful PHP Testing Framework with a focus on simplicity.
Pest is under works, and it will be out soon! I've put together a website where you can subscribe to the @pestphp newsletter. Join now, and be the first to get news about this project: pestphp.com.
In this article, we are going to use PEST in a fresh Laravel application.
To get started, let's require
Pest using composer:
composer require pestphp/pest --dev
In case you don't remember, here is how the Laravel default test suite looks like:

PEST is a progressive testing framework, so Laravel default test suite written in PHPUnit will just work, even if you run it under the pest
command:

Remember: Pest is built on top of PHPUnit. It's just a different API for creating tests.
Next, let's head over to tests/Unit/ExampleTest.php
and see the content:
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$this->assertTrue(true);
}
}
Now, let's rewrite the basic unit test using Pest:
<?php
test('basic', function () {
$this->assertTrue(true);
});
Assertions are globally accessibly with PEST, so we can remove the $this
variable:
<?php
test('basic', function () {
assertTrue(true);
});
Finally, because Pest supports higher-order messages, we can make it one-liner:
<?php
test('basic')->assertTrue(true);
Great! Now let's move to the tests/Feature/ExampleTest.php
:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
We can rewrite this test in PEST like this:
<?php
uses(Tests\TestCase::class);
it('has welcome page', function () {
$response = $this->get('/');
$response->assertStatus(200);
});
Note that, the it
function is an alias for test
, and it adds the prefix "it" to the description of the test:

As Pest supports higher order messages, we can make the test even more simple:
<?php
uses(Tests\TestCase::class);
it('has welcome page')->get('/')->assertStatus(200);
In addition, we may want to use this Tests\TestCase::class
to all tests within the Feature
folder. So let's create a Pest.php
file within the root of our tests
folder with the content:
<?php
uses(Tests\TestCase::class)->in('Feature');
And now we can remove the uses
from our feature test:
<?php
it('has welcome page')->get('/')->assertStatus(200);
Finally, and as expected, the final result is very similar to the original one:

Hope you like this article. Stay tuned: the early beta version will be out soon: pestphp.com.