Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Dbunit Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require --dev phpunit/dbunit
    

    Add to phpunit.xml:

    <extensions>
        <extension class="PHPUnit_Extensions_DbUnit_TestCaseDataSet" />
    </extensions>
    
  2. 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'));
        }
    }
    
  3. Data Setup: Create a data/users.xml:

    <dataset>
        <users id="1" name="John" />
    </dataset>
    

Implementation Patterns

Workflows

  1. Data-Driven Tests: Use YamlDataSet or XmlDataSet for structured test data:

    protected function getDataSet() {
        return new YamlDataSet(dirname(__FILE__) . '/data/users.yml');
    }
    
  2. Database State Management:

    • Setup: Load data before each test (setUp()).
    • Teardown: Clear tables after each test (tearDown()):
      public function tearDown() {
          $this->getConnection()->getConnection()->exec('TRUNCATE TABLE users');
      }
      
  3. Assertions:

    • Row counts:
      $this->assertEquals(1, $this->getConnection()->getRowCount('users'));
      
    • Table comparisons:
      $this->assertDataSetsEqual($expectedDataSet, $this->getConnection()->createFlatXMLDataSet('SELECT * FROM users'));
      
  4. Partial Data Updates: Use replaceDataSet() to update specific tables mid-test:

    $this->replaceDataSet($this->createFlatXMLDataSet('data/users_updated.xml'));
    

Integration Tips

  • Laravel-Specific: Override getConnection() to use Laravel’s DB:
    protected function getConnection() {
        return $this->createDefaultDBConnection(
            app('db')->connection()->getPdo()
        );
    }
    
  • Fixtures: Combine with Laravel’s DatabaseMigrations or DatabaseTransactions for hybrid testing.

Gotchas and Tips

Pitfalls

  1. Deprecated Package:

  2. XML/YAML Parsing:

    • Large datasets may fail silently. Debug with:
      $dataSet = $this->createFlatXMLDataSet('data/large.xml');
      if (!$dataSet->valid()) {
          throw new \RuntimeException($dataSet->getErrorMessage());
      }
      
  3. Connection Handling:

    • Reuse connections across tests to avoid overhead:
      private $connection;
      protected function getConnection() {
          if (!$this->connection) {
              $this->connection = $this->createDefaultDBConnection(app('db')->connection()->getPdo());
          }
          return $this->connection;
      }
      
  4. Transaction Conflicts:

    • DbUnit may interfere with Laravel’s transactions. Use:
      public function tearDown(): void {
          DB::rollBack(); // Explicit rollback if needed
      }
      

Debugging

  • Query Logging: Enable PDO logging in phpunit.xml:
    <php>
        <server name="PDO_LOGGING" value="1"/>
    </php>
    
  • DataSet Validation: Compare datasets visually:
    $actual = $this->getConnection()->createFlatXMLDataSet('SELECT * FROM users');
    file_put_contents('debug/actual.xml', $actual->toString());
    

Extension Points

  1. 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
        }
    }
    
  2. Dynamic Data: Generate datasets programmatically:

    protected function getDataSet() {
        $data = ['users' => [['id' => 1, 'name' => 'John']]];
        return new ArrayDataSet($data);
    }
    
  3. Laravel Events: Trigger events in tests:

    public function testUserCreated() {
        $this->assertEventFired('user.created');
        // Assert database state
    }
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport