📡 You're offline — showing cached content
New version available!
Quick Access
Tutorials PHPUnit Testing Database Testing

Database Testing

6 min read
Test DB operations with SQLite in-memory, transaction rollback, or fixture-seeded test databases.

Database Testing Patterns

// Option 1: In-memory SQLite
protected function createDatabase(): PDO {
    $pdo = new PDO("sqlite::memory:");
    $pdo->exec(file_get_contents("schema.sql"));
    return $pdo;
}

// Option 2: Test transactions (rollback after each test)
class TransactionalTestCase extends TestCase {
    protected PDO $pdo;

    protected function setUp(): void {
        $this->pdo = Database::connect();
        $this->pdo->beginTransaction();
    }

    protected function tearDown(): void {
        $this->pdo->rollBack();
    }
}

// Option 3: Fixtures — pre-defined test data
class UserRepositoryTest extends TestCase {
    private function seedUsers(): void {
        $this->pdo->exec("INSERT INTO users (name,email) VALUES
            ("Alice","alice@test.com"),
            ("Bob","bob@test.com")");
    }

    public function testFindByEmail(): void {
        $this->seedUsers();
        $user = (new UserRepository($this->pdo))->findByEmail("alice@test.com");
        $this->assertEquals("Alice", $user["name"]);
    }
}