How to perform integration testing in PHP?

Basically the way to go is to implement besides unit tests also mock tests which are not solely testing a single unit more like a group of units bunched together and you see them as a logical unit which should behave in a certain way while handing in some input or calling methods.

One possible library for this is yaymock in the google code repository. Its a php5 mock library.

Further integration tests are more or less only tests which test the complete system behavior. The basic thing is setting a test environment up and deploy your application afterwards. You can do this kind of testing also with a unit test framework or a mock library. As you wish. Integration tests in detail in your case are http requests, based on some data in your database and an expected possible "html" output.

To automate this you can use some continous integration frameworks... either Hudson, Arbit or phpUnderControl. For setting up php with hudson and some nice testing plugins there is a pretty good tutorial. It mentions also some useful plugins like Code-Coverage checks, etc ... which could be integrated inside the environment.


Many years later... there's Codeception framework now that you can use to do Unit, Integration and Functional tests.

Codeception uses PHPUnit as a backend for running it's tests. Thus, any PHPUnit test can be added to a Codeception test suite.

In unit tests, you would mock database access, file system, HTTP Requests and other components to isolate code and make it faster.
Integration tests doesn’t require the code to be executed in isolation, that means you will be using those components for real and check the output/results for what was expected.

To ilustrate, take a look at this integration test example from Codeception DOC:

<?php
function testSavingUser()
{
    $user = new User();
    $user->setName('Miles');
    $user->setSurname('Davis');
    $user->save();
    $this->assertEquals('Miles Davis', $user->getFullName());
    $this->tester->seeInDatabase('users', ['name' => 'Miles', 'surname' => 'Davis']);
}