Learn how to use PHPUnit assertions to write effective unit tests in PHP. Understand key assertions, when to use them, and improve test reliability.
Introduction
Assertions in PHPUnit are the core building blocks of unit tests. They validate that expected results match actual outcomes, ensuring that functions behave correctly under different conditions.
By mastering assertions, you can:
- Write reliable and precise tests
- Verify data types, values, and exceptions
- Detect errors before they cause major issues
- Improve test coverage and software quality
This guide covers:
- The most commonly used PHPUnit assertions
- When and how to use assertions effectively
- Writing tests with multiple assertions
- Debugging test failures using assertion errors
1. What Are Assertions in PHPUnit?
An assertion is a statement that verifies whether a condition is true. If the assertion fails, PHPUnit reports an error.
Example: Basic Assertion in PHPUnit
$this->assertEquals(10, 5 + 5);
This assertion passes because 5 + 5
equals 10
. If the values don’t match, PHPUnit fails the test and reports an error.
2. Commonly Used PHPUnit Assertions
PHPUnit provides a variety of assertion methods to test different conditions.
2.1 Checking Value Equality: assertEquals() and assertNotEquals()
These assertions compare expected and actual values.
$this->assertEquals(10, 5 + 5); // Passes
$this->assertNotEquals(10, 5 + 4); // Passes
Use assertEquals()
when expecting an exact value. Use assertNotEquals()
when the values should not match.
2.2 Checking Boolean Values: assertTrue() and assertFalse()
Use these assertions to verify boolean conditions.
$this->assertTrue(is_int(10)); // Passes
$this->assertFalse(empty([1, 2, 3])); // Passes
Use assertTrue()
for conditions that must be true and assertFalse()
for conditions that must be false.
2.3 Checking Data Types: assertIsType()
This assertion ensures a value is of a specific data type.
$this->assertIsInt(100); // Passes
$this->assertIsString("Hello"); // Passes
$this->assertIsArray([1, 2, 3]); // Passes
Use this assertion when validating function return types.
2.4 Checking If a Value Is Null: assertNull() and assertNotNull()
These assertions verify whether a value is null or not null.
$this->assertNull(null); // Passes
$this->assertNotNull("PHPUnit"); // Passes
Use assertNull()
when a function is expected to return null
.
2.5 Checking If an Array Contains a Value: assertContains()
This assertion verifies if a value exists inside an array.
$fruits = ['apple', 'banana', 'cherry'];
$this->assertContains('banana', $fruits); // Passes
$this->assertNotContains('grape', $fruits); // Passes
Use this assertion when validating array elements.
2.6 Checking If a String Matches a Pattern: assertStringContainsString()
$this->assertStringContainsString('PHP', 'PHP is great!'); // Passes
$this->assertStringNotContainsString('Java', 'PHP is great!'); // Passes
Use this assertion to check if a substring exists in a string.
2.7 Checking Object Instance: assertInstanceOf()
This assertion verifies whether an object belongs to a specific class.
class User {}
$user = new User();
$this->assertInstanceOf(User::class, $user); // Passes
Use assertInstanceOf()
when testing object-oriented PHP applications.
3. Handling Exceptions and Errors in PHPUnit
3.1 Testing if a Function Throws an Exception
Use expectException()
to ensure a function throws an expected exception.
public function testExceptionIsThrown()
{
$this->expectException(InvalidArgumentException::class);
throw new InvalidArgumentException("Invalid input");
}
Use this when testing error handling in PHP applications.
3.2 Testing for Warnings and Errors
Use expectWarning()
when a function should generate a warning.
public function testWarning()
{
$this->expectWarning();
fopen('/invalid/path', 'r');
}
4. Writing Effective Unit Tests with Assertions
4.1 Use Multiple Assertions in a Single Test
Instead of writing multiple small tests, use multiple assertions within a single test method.
public function testUserCreation()
{
$user = new User("John Doe", "john@example.com");
$this->assertEquals("John Doe", $user->name);
$this->assertStringContainsString("@example.com", $user->email);
$this->assertInstanceOf(User::class, $user);
}
4.2 Separate Concerns in Different Tests
Keep tests focused on one functionality per test method.
public function testAddition()
{
$this->assertEquals(5, 2 + 3);
}
public function testSubtraction()
{
$this->assertEquals(3, 5 - 2);
}
5. Debugging PHPUnit Assertion Failures
When an assertion fails, PHPUnit provides detailed error messages.
Example Failure Output:
1) CalculatorTest::testAddition
Failed asserting that 6 matches expected 5.
How to Fix It:
- Check the expected and actual values carefully.
- Use
var_dump()
inside the test to debug values. - Run tests with
--debug
for more details:
vendor/bin/phpunit --debug tests
6. Running Tests with Different Data Using Data Providers
Data providers allow running the same test with multiple inputs.
Using a Data Provider in PHPUnit
/**
* @dataProvider additionProvider
*/
public function testAddition($a, $b, $expected)
{
$this->assertEquals($expected, $a + $b);
}
public function additionProvider()
{
return [
[2, 3, 5],
[1, 1, 2],
[0, 5, 5]
];
}
Why Use Data Providers?
- Avoids duplicate test methods
- Improves test readability and maintainability
7. Best Practices for Using Assertions in PHPUnit
- Use precise assertions (
assertEquals()
instead ofassertTrue()
) - Test both valid and invalid inputs
- Write self-explanatory test names
- Use data providers for multiple test cases
- Keep assertions relevant to the function being tested
Conclusion
PHPUnit assertions help ensure code correctness, catch errors early, and improve software reliability.
This guide covered:
- Commonly used PHPUnit assertions
- Handling exceptions and error testing
- Using data providers for efficient testing
- Debugging assertion failures
By mastering PHPUnit assertions, you can write precise, reliable, and maintainable unit tests for PHP applications.