Milind Daraniya

PHPUnit Testing in Laravel: Writing Effective Test Cases

Published January 11th, 2023 20 min read

Unit testing is a crucial aspect of web development that ensures your code functions as expected and helps catch bugs early in the development process. Laravel provides robust support for testing using PHPUnit, making it easy to write effective test cases for your applications. In this post, we'll explore how to perform PHPUnit testing in Laravel by writing comprehensive and meaningful test cases.

Before starting, ensure you have the following:

  1. A working installation of Laravel.
  2. PHPUnit installed in your Laravel project.

Step 1: Set Up the Test Environment

In Laravel, test cases are stored in the tests directory. By default, Laravel includes a TestCase class that extends PHPUnit's base test case.

Step 2: Writing a Basic Test

Let's create a simple test to check if the homepage of our application returns a 200 status code.

Create a new test file called HomePageTest.php in the tests/Feature directory:

touch tests/Feature/HomePageTest.php

In HomePageTest.php, write the test:

use Tests\TestCase;

class HomePageTest extends TestCase
{
    public function testHomePageReturns200StatusCode()
    {
        $response = $this->get('/');
        $response->assertStatus(200);
    }
}

Step 3: Running the Test

To execute the test, run the following command:

php artisan test

You should see an output indicating that the test was successful.

Step 4: Writing More Test Cases

Let's add more test cases to ensure our application's functionality.

Create a new test file called ProductTest.php in the tests/Feature directory:

touch tests/Feature/ProductTest.php

In ProductTest.php, write the test cases:

use App\Models\Product;
use Tests\TestCase;

class ProductTest extends TestCase
{
    public function testProductCreation()
    {
        $productData = [
            'name' => 'Test Product',
            'description' => 'This is a test product.',
            'price' => 9.99,
        ];

        $this->post('/products', $productData)
            ->assertStatus(201)
            ->assertJson($productData);
    }

    public function testProductListing()
    {
        $products = Product::factory()->count(3)->create();

        $this->get('/products')
            ->assertStatus(200)
            ->assertJson($products->toArray());
    }

    public function testProductDeletion()
    {
        $product = Product::factory()->create();

        $this->delete('/products/' . $product->id)
            ->assertStatus(204);

        $this->assertDatabaseMissing('products', ['id' => $product->id]);
    }
}

Step 5: Running the Updated Test

Run the test again to check the newly added test cases:

php artisan test

Ensure that all the tests pass successfully.

PHPUnit testing in Laravel is a powerful tool to verify the correctness of your application's functionality. By writing effective test cases, you can confidently make changes to your code without worrying about breaking existing features.

Remember to write tests that cover different scenarios and edge cases. Always test both the positive and negative outcomes of your methods to ensure comprehensive test coverage.

As your Laravel application grows, continue to write additional test cases to maintain code integrity and deliver a high-quality product.