基于PHPUnit 5、DBUnit 2.0.3和Phinx 0.8.2搭建SQLite内存数据库测试咨询
针对你用PHPUnit 5、DBUnit 2.0.3和Phinx 0.8.2搭建SQLite内存数据库测试的需求,我把你给出的抽象类代码完善并优化了,同时补充了Phinx迁移集成的关键细节,这样你的测试就能拥有干净的内存数据库环境,还能自动执行表结构迁移:
完善后的ApiTest抽象类实现
abstract class ApiTest extends PHPUnit_Extensions_Database_TestCase { protected $pdo; /** * 获取DBUnit数据库连接 * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection */ public function getConnection() { // SQLite内存库没有实际数据库名,第二个参数填任意标识即可 return $this->createDefaultDBConnection($this->pdo, 'memory_test_db'); } /** * 获取测试数据集 * @return PHPUnit_Extensions_Database_DataSet_IDataSet */ public function getDataSet() { // 用__DIR__替代dirname(__FILE__),路径更直观易维护 return $this->createFlatXMLDataSet(__DIR__ . '/DataSets/TestDataSet.xml'); } protected function setUp() { // 必须调用父类setUp,保证DBUnit的初始化流程正常执行 parent::setUp(); // 初始化SQLite内存库PDO连接,开启错误抛出方便调试 $this->pdo = new PDO('sqlite::memory:'); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 执行Phinx迁移,自动创建测试所需的表结构 $this->runPhinxMigrations(); } /** * 集成Phinx迁移:用当前内存库连接执行迁移 */ protected function runPhinxMigrations() { // 加载Phinx配置文件(请根据你的项目路径调整) $phinxConfig = \Phinx\Config\Config::fromYamlFile(__DIR__ . '/../../phinx.yml'); // 覆盖环境配置,让Phinx复用我们已经创建的内存库PDO连接 $devEnvConfig = $phinxConfig->getEnvironment('development'); $devEnvConfig['pdo'] = $this->pdo; $phinxConfig->setEnvironment('development', $devEnvConfig); // 静默执行迁移(如果需要看日志,可替换为ConsoleOutput) $output = new \Symfony\Component\Console\Output\NullOutput(); $migrationManager = new \Phinx\Migration\Manager($phinxConfig, $output); // 执行所有迁移到最新版本 $migrationManager->migrate('development'); } protected function tearDown() { parent::tearDown(); // 释放PDO连接,让SQLite内存库资源被回收 $this->pdo = null; } }
关键细节说明
- SQLite内存库生命周期:每个测试方法都会触发
setUp,所以每次测试都会得到一个全新的内存数据库,完美符合单元测试的隔离性要求 - DBUnit连接配置:
createDefaultDBConnection的第二个参数只是数据库标识,SQLite内存库不需要实际的数据库名,随便填就行 - Phinx集成要点:必须让Phinx复用我们创建的PDO连接,否则Phinx会新建一个内存库连接,导致测试时找不到表
- 调试优化:开启PDO的错误抛出模式,能快速定位数据库操作的异常;如果数据集加载失败,检查
TestDataSet.xml的格式(根节点必须是<dataset>,子节点对应表名,属性对应字段和值)
内容的提问来源于stack exchange,提问作者GluePear
相关产品推荐
相关产品推荐

