DEV Community

Cover image for Testing in Laravel: Types and Setup
Omar Malas
Omar Malas

Posted on

Testing in Laravel: Types and Setup

For Laravel Developers Testing is an essential part of development, it can ensure your function is doing what it’s supposed to.
To ensure that you need to have a robust testing suite in your Laravel applications, your testing techniques may differ from your co-worker, but the goal is always the same.

Testing can be difficult when you don’t have a UI to work with, as lots of errors appear later when bootstrapping with your frontend team.

Without further ado, here’s the top kinds of Testing in Laravel:


1. Unit Tests
Unit tests focus on isolating and testing individual components or units of your code in isolation. These components can be functions, methods, or classes. Unit tests ensure that each piece of code behaves as expected and produces the correct output for a given input.

When to Use Unit Tests:

  • Testing individual methods or functions.
  • Validating core business logic.
  • Ensuring that edge cases and error handling are correctly implemented. For example:
public function testUserCanChangePassword()
{
    $user = User::factory()->create();

    $user->changePassword('newpassword');

    $this->assertTrue(Hash::check('newpassword', $user->password));
}
Enter fullscreen mode Exit fullscreen mode

2. Feature Tests
Feature tests take a broader approach by testing the interaction between various components of your application. These tests simulate a user’s interaction with the application, such as visiting a webpage and performing actions like form submissions.

When to Use Feature Tests:

  • Testing user interactions with your application.
  • Validating entire user flows and user interface behavior.
  • Ensuring that routes, controllers, and views work harmoniously. For example:
public function testUserCanLogin()
{
    $user = User::factory()->create();

    $response = $this->post('/login', [
        'email' => $user->email,
        'password' => 'password',
    ]);

    $response->assertRedirect('/dashboard');
    $this->assertAuthenticatedAs($user);
}
Enter fullscreen mode Exit fullscreen mode

3. Integration Tests
Integration tests examine how different parts of your application interact with each other. These tests help ensure that components integrate correctly and work seamlessly as a cohesive unit.
When to Use Integration Tests:

  • Testing interactions between different layers (e.g., database, external APIs).
  • Validating database operations and data persistence.
  • Ensuring proper communication between controllers, models, and views.
public function testUserCanCreatePost()
{
    $user = User::factory()->create();

    $response = $this->actingAs($user)
                     ->post('/posts', ['title' => 'New Post']);

    $response->assertStatus(201);
    $this->assertDatabaseHas('posts', ['title' => 'New Post']);
}
Enter fullscreen mode Exit fullscreen mode

These three types of tests form the foundation of Laravel’s testing suite. By employing a combination of unit, feature, and integration tests, you can thoroughly assess your application’s functionality, codebase, and user interactions. A comprehensive testing strategy contributes to code quality, reduces bugs, and enables smoother development and maintenance.

In the next sections, we’ll delve into setting up your testing environment.


Setting Up Testing Environment
Before you embark on your journey of writing tests for your Laravel applications, it’s essential to set up a proper testing environment. Laravel makes this process straightforward, providing tools and configurations that facilitate effective testing. Here’s how to get started:

1. Configure Testing Environment
Laravel comes with predefined environment configurations for testing. In your .env file, ensure the APP_ENV is set to testing when running tests. This helps Laravel automatically use the testing configuration settings.

APP_ENV=testing

2. Artisan Commands
Laravel’s Artisan command-line tool provides essential commands to assist you in testing:

To run all tests in the tests directory:

php artisan test

To run tests in a specific file or directory:

php artisan test path/to/YourTest.php

3. Database Configuration
Laravel’s testing environment uses an in-memory SQLite database by default, allowing tests to be isolated and perform operations without affecting your development or production databases. You can modify this configuration in config/database.php

'testing' => [
    'driver' => 'sqlite',
    'database' => ':memory:',
    // ...
],
Enter fullscreen mode Exit fullscreen mode

4. Factories and Seeders
Factories and seeders are essential for generating test data. Laravel’s factories help you create test models with predefined attributes. Use the database/factories directory to define your factories and the database/seeders directory to set up your database seeders.

5. PHPUnit Configuration
Customize PHPUnit configurations in the phpunit.xml file in your project root. You can set up code coverage reports, specify test directories, and configure various testing-related options.

6. Testing Traits
Laravel provides testing traits to assist you in writing tests with common functionality. For example, the RefreshDatabase trait automatically resets the database after each test, ensuring a clean slate for every test case.

use Illuminate\Foundation\Testing\RefreshDatabase;
By properly configuring your testing environment, you create a solid foundation for writing tests that provide accurate results and simulate real-world scenarios. In the next sections, we’ll dive into writing unit tests, feature tests, and integration tests to demonstrate how Laravel’s testing framework can be used effectively.


Conclusion
In the world of software development, testing is not just a process; it’s a practice that can significantly elevate the quality and reliability of your Laravel applications. The Laravel framework, equipped with the powerful PHPUnit testing framework, empowers developers to create tests that validate everything from individual components to entire user flows. By embracing a comprehensive testing strategy, you’re investing in the long-term success of your projects.

We explored the fundamental types of tests that Laravel offers: unit tests, feature tests, and integration tests. Each type serves a specific purpose in ensuring your application’s functionality, user interactions, and component integration are thoroughly assessed. Remember, testing isn’t just about catching bugs; it’s about crafting code that’s resilient, maintainable, and adaptable.

We also walked through the process of setting up your testing environment. Properly configuring your environment, leveraging Laravel’s testing traits, and utilizing testing tools like factories and seeders are crucial steps to ensure accurate and efficient testing.

Happy Coding! :)

Top comments (3)

Collapse
 
nataliiapolomkina profile image
nataliiapolomkina

Hey Omar, thank you for this guide. Your clear and concise explanation of unit tests, feature tests, and integration tests is really helpful. I also work with email infrastructure and understand the challenges of setting up testing environments manually. Thankfully, there's an alternative – using a dedicated email testing solution like Mailtrap, which is a popular choice among Laravel developers. You could review the guide on testing in Laravel with Mailtrap here. Hope it can be useful. Best of luck to you!

Collapse
 
respect17 profile image
Kudzai Murimi

Thanks you much, you made it a bit clear with the comprehensive information you provided. l have been struggling to set it up.

Collapse
 
omarmalas profile image
Omar Malas

You're more than welcome, please reach out if you need any help, I'm always happy to help 👍