phpunit/dbunit
PHPUnit extension for database interaction testing. Provides DbUnit helpers for setting up database fixtures and asserting database state in tests. Install via Composer (dev) or PHAR. Note: this package is no longer maintained.
Installation:
composer require --dev phpunit/dbunit
Add to phpunit.xml:
<extensions>
<extension class="PHPUnit_Extensions_DbUnit_TestCaseDataSet" />
</extensions>
First Test Case:
use PHPUnit_Extensions_DbUnit_TestCaseDataSet;
use PHPUnit_Extensions_DbUnit_DataSet_YamlDataSet;
class UserTest extends TestCaseDataSet {
protected function getDataSet() {
return $this->createFlatXMLDataSet(dirname(__FILE__) . '/data/users.xml');
}
protected function getConnection() {
return $this->createDefaultDBConnection($this->createPDOConnection('mysql:host=localhost;dbname=test', 'user', 'pass'));
}
public function testUserCount() {
$this->assertEquals(1, $this->getConnection()->getRowCount('users'));
}
}
Data Setup:
Create a data/users.xml:
<dataset>
<users id="1" name="John" />
</dataset>
Data-Driven Tests:
Use YamlDataSet or XmlDataSet for structured test data:
protected function getDataSet() {
return new YamlDataSet(dirname(__FILE__) . '/data/users.yml');
}
Database State Management:
setUp()).tearDown()):
public function tearDown() {
$this->getConnection()->getConnection()->exec('TRUNCATE TABLE users');
}
Assertions:
$this->assertEquals(1, $this->getConnection()->getRowCount('users'));
$this->assertDataSetsEqual($expectedDataSet, $this->getConnection()->createFlatXMLDataSet('SELECT * FROM users'));
Partial Data Updates:
Use replaceDataSet() to update specific tables mid-test:
$this->replaceDataSet($this->createFlatXMLDataSet('data/users_updated.xml'));
getConnection() to use Laravel’s DB:
protected function getConnection() {
return $this->createDefaultDBConnection(
app('db')->connection()->getPdo()
);
}
DatabaseMigrations or DatabaseTransactions for hybrid testing.Deprecated Package:
laravel-database-factories or pest-plugin-database for Laravel.XML/YAML Parsing:
$dataSet = $this->createFlatXMLDataSet('data/large.xml');
if (!$dataSet->valid()) {
throw new \RuntimeException($dataSet->getErrorMessage());
}
Connection Handling:
private $connection;
protected function getConnection() {
if (!$this->connection) {
$this->connection = $this->createDefaultDBConnection(app('db')->connection()->getPdo());
}
return $this->connection;
}
Transaction Conflicts:
public function tearDown(): void {
DB::rollBack(); // Explicit rollback if needed
}
phpunit.xml:
<php>
<server name="PDO_LOGGING" value="1"/>
</php>
$actual = $this->getConnection()->createFlatXMLDataSet('SELECT * FROM users');
file_put_contents('debug/actual.xml', $actual->toString());
Custom DataSet Classes:
Extend PHPUnit_Extensions_DbUnit_DataSet_DefaultDataSet for custom formats (e.g., JSON):
class JsonDataSet extends DefaultDataSet {
public function __construct($filename) {
$data = json_decode(file_get_contents($filename), true);
// Implement logic to convert JSON to dataset
}
}
Dynamic Data: Generate datasets programmatically:
protected function getDataSet() {
$data = ['users' => [['id' => 1, 'name' => 'John']]];
return new ArrayDataSet($data);
}
Laravel Events: Trigger events in tests:
public function testUserCreated() {
$this->assertEventFired('user.created');
// Assert database state
}
How can I help you explore Laravel packages today?