initialize(); // ---------------------------------------------------------------------------- // 2. 从 .env 读取连接参数,组装测试库连接配置 // 复用开发库同实例的连接参数(hostname/hostport/username/password/charset/prefix), // 仅将 database 名替换为测试库名({原库名}_test)。 // ---------------------------------------------------------------------------- $envHostname = \think\facade\Env::get('database.hostname'); $envHostport = \think\facade\Env::get('database.hostport'); $envUsername = \think\facade\Env::get('database.username'); $envPassword = \think\facade\Env::get('database.password'); $envCharset = \think\facade\Env::get('database.charset'); $envPrefix = \think\facade\Env::get('database.prefix'); $envDatabase = \think\facade\Env::get('database.database'); // 测试库名策略:原库名 + _test 后缀(如 ulthon_admin → ulthon_admin_test) $testDatabase = is_string($envDatabase) && $envDatabase !== '' ? $envDatabase . '_test' : 'ulthon_admin_test'; // ---------------------------------------------------------------------------- // 3. config 级覆盖 connections.main 指向测试库 // 覆盖目标 = connections.main(本项目 config/database.php 默认连接是 main)。 // 保留框架自定义 query 类与其它运行时选项,只改"指向哪个库"的部分。 // ---------------------------------------------------------------------------- $dbConfig = \think\facade\Config::get('database'); if (!is_array($dbConfig)) { $dbConfig = []; } $dbConfig['default'] = 'main'; if (!isset($dbConfig['connections']) || !is_array($dbConfig['connections'])) { $dbConfig['connections'] = []; } if (!isset($dbConfig['connections']['main']) || !is_array($dbConfig['connections']['main'])) { $dbConfig['connections']['main'] = []; } $dbConfig['connections']['main'] = array_merge( $dbConfig['connections']['main'], [ 'type' => 'mysql', 'hostname' => is_string($envHostname) && $envHostname !== '' ? $envHostname : '127.0.0.1', 'hostport' => is_string($envHostport) && $envHostport !== '' ? $envHostport : '3306', 'database' => $testDatabase, 'username' => is_string($envUsername) && $envUsername !== '' ? $envUsername : 'root', 'password' => is_string($envPassword) ? $envPassword : '', 'charset' => is_string($envCharset) && $envCharset !== '' ? $envCharset : 'utf8mb4', 'prefix' => is_string($envPrefix) && $envPrefix !== '' ? $envPrefix : 'ul_', 'fields_cache' => false, ], // 必须保留框架自定义 query 类,否则 ORM 行为异常。 ['query' => \app\common\provider\db\Query::class], ); \think\facade\Config::set($dbConfig, 'database'); // ---------------------------------------------------------------------------- // 4. 早期安全护栏:在任何测试运行前,确认解析出的库名含 "test" // (TestCaseBase.setUp 会再校验一次;这里更早触发,防患于未然) // ---------------------------------------------------------------------------- $resolvedDb = \think\facade\Config::get('database.connections.main.database'); if (!is_string($resolvedDb) || stripos($resolvedDb, 'test') === false) { throw new \RuntimeException('Test bootstrap refusing non-test database: ' . $resolvedDb); }