Getting Started with PHPUnit

Installation

To begin using PHPUnit, you need to install it. The recommended way is via Composer. If you haven't set up Composer yet, you can do so by following the instructions on the Composer website.

Once Composer is installed, you can include PHPUnit in your project by running:

composer require --dev phpunit/phpunit

This command adds PHPUnit as a development dependency in your composer.json file.

Basic Configuration

After installation, you can create a configuration file named phpunit.xml in the root of your project. This file allows you to customize PHPUnit's behavior. Here’s a simple example:

<?xml version="1.0" encoding="UTF-8" ?>
<phpunit bootstrap="vendor/autoload.php">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

Writing Your First Test

Create a directory named tests in your project root. Inside this directory, create a file named CalculatorTest.php. This file will contain your unit tests for a simple calculator class.

Sample Calculator Class

First, let’s create a simple Calculator class in src/Calculator.php:

<?php

namespace App;

class Calculator
{
    public function add($a, $b)
    {
        return $a + $b;
    }

    public function subtract($a, $b)
    {
        return $a - $b;
    }
}

Writing Tests for the Calculator

Now, let’s write tests for the Calculator class in tests/CalculatorTest.php:

<?php

use PHPUnit\Framework\TestCase;
use App\Calculator;

class CalculatorTest extends TestCase
{
    protected $calculator;

    protected function setUp(): void
    {
        $this->calculator = new Calculator();
    }

    public function testAdd()
    {
        $this->assertEquals(5, $this->calculator->add(2, 3));
        $this->assertEquals(0, $this->calculator->add(-2, 2));
    }

    public function testSubtract()
    {
        $this->assertEquals(1, $this->calculator->subtract(3, 2));
        $this->assertEquals(-4, $this->calculator->subtract(2, 6));
    }
}

Running Your Tests

To run your tests, execute the following command in your terminal:

vendor/bin/phpunit

You should see an output indicating that your tests have passed:

PHPUnit 9.5.0 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 00:00.123, Memory: 10.00 MB

OK (2 tests, 4 assertions)

Best Practices for Unit Testing in PHP

1. Follow Naming Conventions

Naming your test classes and methods clearly helps in understanding what functionality is being tested. A good convention is to name your test classes with the suffix Test, and methods should describe the expected outcome.

Class NameDescription
CalculatorTestTests for the Calculator class
testAddPositiveTests addition with positive numbers

2. Use Data Providers

Data providers allow you to run the same test with different sets of data. This is particularly useful for testing functions with various inputs.

Here’s an example of using a data provider for the add method:

public function additionProvider()
{
    return [
        'adding positive numbers' => [2, 3, 5],
        'adding negative numbers' => [-2, -3, -5],
        'adding zero' => [0, 0, 0],
    ];
}

/**
 * @dataProvider additionProvider
 */
public function testAdd($a, $b, $expected)
{
    $this->assertEquals($expected, $this->calculator->add($a, $b));
}

3. Isolate Tests

Each test should be independent of others. Use the setUp() method to initialize objects required for the tests. This ensures that tests do not rely on the state set by other tests, which can lead to flaky tests.

4. Test for Exceptions

Ensure that your tests also validate that exceptions are thrown when expected. For example, if you modify the Calculator class to throw an exception for division by zero, you can test it as follows:

public function testDivideByZero()
{
    $this->expectException(\DivisionByZeroError::class);
    $this->calculator->divide(5, 0);
}

Conclusion

Unit testing in PHP using PHPUnit is a powerful way to ensure your code is reliable and maintainable. By following best practices and utilizing the features provided by PHPUnit, you can enhance the quality of your applications significantly.

Learn more with useful resources: