| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- <?php
- namespace App\Module\AppGame\Tests;
- /**
- * 测试环境配置加载器
- *
- * 独立于代码的环境变量管理,从.env.testing文件加载配置
- */
- class TestEnvironment
- {
- /**
- * 环境变量缓存
- */
- private static array $envCache = [];
- /**
- * 是否已加载环境变量
- */
- private static bool $loaded = false;
- /**
- * 加载测试环境变量
- */
- public static function load(): void
- {
- if (self::$loaded) {
- return;
- }
- $envFile = __DIR__ . '/.env.testing';
-
- if (!file_exists($envFile)) {
- throw new \RuntimeException("测试环境配置文件不存在: {$envFile}");
- }
- $lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
-
- foreach ($lines as $line) {
- $line = trim($line);
-
- // 跳过注释行
- if (empty($line) || strpos($line, '#') === 0) {
- continue;
- }
-
- // 解析环境变量
- if (strpos($line, '=') !== false) {
- list($key, $value) = explode('=', $line, 2);
- $key = trim($key);
- $value = trim($value);
-
- // 移除引号
- if (preg_match('/^"(.*)"$/', $value, $matches)) {
- $value = $matches[1];
- } elseif (preg_match("/^'(.*)'$/", $value, $matches)) {
- $value = $matches[1];
- }
-
- self::$envCache[$key] = $value;
-
- // 同时设置到系统环境变量
- if (!getenv($key)) {
- putenv("{$key}={$value}");
- }
- }
- }
-
- self::$loaded = true;
- }
- /**
- * 获取环境变量值
- */
- public static function get(string $key, $default = null)
- {
- self::load();
-
- // 优先从系统环境变量获取
- $value = getenv($key);
- if ($value !== false) {
- return self::parseValue($value);
- }
-
- // 从缓存获取
- if (isset(self::$envCache[$key])) {
- return self::parseValue(self::$envCache[$key]);
- }
-
- return $default;
- }
- /**
- * 解析环境变量值
- */
- private static function parseValue($value)
- {
- if ($value === 'true' || $value === 'TRUE') {
- return true;
- }
-
- if ($value === 'false' || $value === 'FALSE') {
- return false;
- }
-
- if ($value === 'null' || $value === 'NULL') {
- return null;
- }
-
- if (is_numeric($value)) {
- return strpos($value, '.') !== false ? (float)$value : (int)$value;
- }
-
- return $value;
- }
- /**
- * 获取测试服务器URL
- */
- public static function getTestUrl(): string
- {
- return self::get('UNITTEST_URL', 'http://localhost:8000');
- }
- /**
- * 获取测试用户配置
- */
- public static function getTestUser(): array
- {
- return [
- 'user_id' => self::get('TEST_USER_ID', 1),
- 'password' => self::get('TEST_USER_PASSWORD', 'test123456'),
- 'username' => self::get('TEST_USER_USERNAME', 'test_user'),
- 'email' => self::get('TEST_USER_EMAIL', 'test@example.com'),
- ];
- }
- /**
- * 获取除虫测试配置
- */
- public static function getPesticideConfig(): array
- {
- return [
- 'land_id' => self::get('TEST_PESTICIDE_LAND_ID', 1),
- 'item_id' => self::get('TEST_PESTICIDE_ITEM_ID', 101),
- 'success_rate' => self::get('TEST_PESTICIDE_SUCCESS_RATE', 80),
- ];
- }
- /**
- * 获取除草测试配置
- */
- public static function getWeedicideConfig(): array
- {
- return [
- 'land_id' => self::get('TEST_WEEDICIDE_LAND_ID', 2),
- 'item_id' => self::get('TEST_WEEDICIDE_ITEM_ID', 102),
- 'success_rate' => self::get('TEST_WEEDICIDE_SUCCESS_RATE', 75),
- ];
- }
- /**
- * 获取浇水测试配置
- */
- public static function getWateringConfig(): array
- {
- return [
- 'land_id' => self::get('TEST_WATERING_LAND_ID', 3),
- 'item_id' => self::get('TEST_WATERING_ITEM_ID', 103),
- 'success_rate' => self::get('TEST_WATERING_SUCCESS_RATE', 90),
- ];
- }
- /**
- * 获取播种测试配置
- */
- public static function getSowConfig(): array
- {
- return [
- 'land_id' => self::get('TEST_SOW_LAND_ID', 10),
- 'seed_id' => self::get('TEST_SOW_SEED_ID', 201),
- 'seed_name' => self::get('TEST_SOW_SEED_NAME', '测试种子'),
- ];
- }
- /**
- * 获取收获测试配置
- */
- public static function getHarvestConfig(): array
- {
- return [
- 'land_id' => self::get('TEST_HARVEST_LAND_ID', 11),
- 'crop_id' => self::get('TEST_HARVEST_CROP_ID', 301),
- ];
- }
- /**
- * 获取施肥测试配置
- */
- public static function getFertilizerConfig(): array
- {
- return [
- 'land_id' => self::get('TEST_FERTILIZER_LAND_ID', 12),
- 'item_id' => self::get('TEST_FERTILIZER_ITEM_ID', 401),
- 'item_name' => self::get('TEST_FERTILIZER_ITEM_NAME', '有机肥料'),
- ];
- }
- /**
- * 获取宠物测试配置
- */
- public static function getPetConfig(): array
- {
- return [
- 'pet_id' => self::get('TEST_PET_ID', 1001),
- 'pet_name' => self::get('TEST_PET_NAME', '测试宠物'),
- 'food_id' => self::get('TEST_PET_FOOD_ID', 601),
- 'skill_id' => self::get('TEST_PET_SKILL_ID', 701),
- ];
- }
- /**
- * 获取商店测试配置
- */
- public static function getShopConfig(): array
- {
- return [
- 'item_id' => self::get('TEST_SHOP_ITEM_ID', 1201),
- 'price' => self::get('TEST_SHOP_ITEM_PRICE', 100),
- 'currency_type' => self::get('TEST_SHOP_CURRENCY_TYPE', 1),
- ];
- }
- /**
- * 获取好友测试配置
- */
- public static function getFriendConfig(): array
- {
- return [
- 'friend_user_id' => self::get('TEST_FRIEND_USER_ID', 2001),
- 'friend_username' => self::get('TEST_FRIEND_USERNAME', 'friend_user'),
- 'apply_id' => self::get('TEST_FRIEND_APPLY_ID', 2101),
- ];
- }
- /**
- * 获取性能测试配置
- */
- public static function getPerformanceConfig(): array
- {
- return [
- 'request_count' => self::get('TEST_PERFORMANCE_REQUEST_COUNT', 10),
- 'max_response_time' => self::get('TEST_PERFORMANCE_MAX_RESPONSE_TIME', 5000),
- ];
- }
- /**
- * 获取并发测试配置
- */
- public static function getConcurrentConfig(): array
- {
- return [
- 'request_count' => self::get('TEST_CONCURRENT_REQUEST_COUNT', 5),
- 'max_wait_time' => self::get('TEST_CONCURRENT_MAX_WAIT_TIME', 10),
- ];
- }
- /**
- * 获取概率测试配置
- */
- public static function getProbabilityConfig(): array
- {
- return [
- 'attempts' => self::get('TEST_PROBABILITY_ATTEMPTS', 20),
- 'error_margin' => self::get('TEST_PROBABILITY_ERROR_MARGIN', 30),
- ];
- }
- /**
- * 获取调试配置
- */
- public static function getDebugConfig(): array
- {
- return [
- 'enabled' => self::get('TEST_DEBUG_ENABLED', true),
- 'dump_requests' => self::get('TEST_DEBUG_DUMP_REQUESTS', true),
- 'dump_responses' => self::get('TEST_DEBUG_DUMP_RESPONSES', true),
- 'measure_time' => self::get('TEST_DEBUG_MEASURE_TIME', true),
- ];
- }
- /**
- * 检查是否为调试模式
- */
- public static function isDebugMode(): bool
- {
- return self::get('TEST_DEBUG_ENABLED', true);
- }
- /**
- * 获取所有环境变量
- */
- public static function getAll(): array
- {
- self::load();
- return self::$envCache;
- }
- /**
- * 重新加载环境变量
- */
- public static function reload(): void
- {
- self::$loaded = false;
- self::$envCache = [];
- self::load();
- }
- }
|