TestEnvironment.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <?php
  2. namespace App\Module\AppGame\Tests;
  3. /**
  4. * 测试环境配置加载器
  5. *
  6. * 独立于代码的环境变量管理,从.env.testing文件加载配置
  7. */
  8. class TestEnvironment
  9. {
  10. /**
  11. * 环境变量缓存
  12. */
  13. private static array $envCache = [];
  14. /**
  15. * 是否已加载环境变量
  16. */
  17. private static bool $loaded = false;
  18. /**
  19. * 加载测试环境变量
  20. */
  21. public static function load(): void
  22. {
  23. if (self::$loaded) {
  24. return;
  25. }
  26. $envFile = __DIR__ . '/.env.testing';
  27. if (!file_exists($envFile)) {
  28. throw new \RuntimeException("测试环境配置文件不存在: {$envFile}");
  29. }
  30. $lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  31. foreach ($lines as $line) {
  32. $line = trim($line);
  33. // 跳过注释行
  34. if (empty($line) || strpos($line, '#') === 0) {
  35. continue;
  36. }
  37. // 解析环境变量
  38. if (strpos($line, '=') !== false) {
  39. list($key, $value) = explode('=', $line, 2);
  40. $key = trim($key);
  41. $value = trim($value);
  42. // 移除引号
  43. if (preg_match('/^"(.*)"$/', $value, $matches)) {
  44. $value = $matches[1];
  45. } elseif (preg_match("/^'(.*)'$/", $value, $matches)) {
  46. $value = $matches[1];
  47. }
  48. self::$envCache[$key] = $value;
  49. // 同时设置到系统环境变量
  50. if (!getenv($key)) {
  51. putenv("{$key}={$value}");
  52. }
  53. }
  54. }
  55. self::$loaded = true;
  56. }
  57. /**
  58. * 获取环境变量值
  59. */
  60. public static function get(string $key, $default = null)
  61. {
  62. self::load();
  63. // 优先从系统环境变量获取
  64. $value = getenv($key);
  65. if ($value !== false) {
  66. return self::parseValue($value);
  67. }
  68. // 从缓存获取
  69. if (isset(self::$envCache[$key])) {
  70. return self::parseValue(self::$envCache[$key]);
  71. }
  72. return $default;
  73. }
  74. /**
  75. * 解析环境变量值
  76. */
  77. private static function parseValue($value)
  78. {
  79. if ($value === 'true' || $value === 'TRUE') {
  80. return true;
  81. }
  82. if ($value === 'false' || $value === 'FALSE') {
  83. return false;
  84. }
  85. if ($value === 'null' || $value === 'NULL') {
  86. return null;
  87. }
  88. if (is_numeric($value)) {
  89. return strpos($value, '.') !== false ? (float)$value : (int)$value;
  90. }
  91. return $value;
  92. }
  93. /**
  94. * 获取测试服务器URL
  95. */
  96. public static function getTestUrl(): string
  97. {
  98. return self::get('UNITTEST_URL', 'http://localhost:8000');
  99. }
  100. /**
  101. * 获取测试用户配置
  102. */
  103. public static function getTestUser(): array
  104. {
  105. return [
  106. 'user_id' => self::get('TEST_USER_ID', 1),
  107. 'password' => self::get('TEST_USER_PASSWORD', 'test123456'),
  108. 'username' => self::get('TEST_USER_USERNAME', 'test_user'),
  109. 'email' => self::get('TEST_USER_EMAIL', 'test@example.com'),
  110. ];
  111. }
  112. /**
  113. * 获取除虫测试配置
  114. */
  115. public static function getPesticideConfig(): array
  116. {
  117. return [
  118. 'land_id' => self::get('TEST_PESTICIDE_LAND_ID', 1),
  119. 'item_id' => self::get('TEST_PESTICIDE_ITEM_ID', 101),
  120. 'success_rate' => self::get('TEST_PESTICIDE_SUCCESS_RATE', 80),
  121. ];
  122. }
  123. /**
  124. * 获取除草测试配置
  125. */
  126. public static function getWeedicideConfig(): array
  127. {
  128. return [
  129. 'land_id' => self::get('TEST_WEEDICIDE_LAND_ID', 2),
  130. 'item_id' => self::get('TEST_WEEDICIDE_ITEM_ID', 102),
  131. 'success_rate' => self::get('TEST_WEEDICIDE_SUCCESS_RATE', 75),
  132. ];
  133. }
  134. /**
  135. * 获取浇水测试配置
  136. */
  137. public static function getWateringConfig(): array
  138. {
  139. return [
  140. 'land_id' => self::get('TEST_WATERING_LAND_ID', 3),
  141. 'item_id' => self::get('TEST_WATERING_ITEM_ID', 103),
  142. 'success_rate' => self::get('TEST_WATERING_SUCCESS_RATE', 90),
  143. ];
  144. }
  145. /**
  146. * 获取播种测试配置
  147. */
  148. public static function getSowConfig(): array
  149. {
  150. return [
  151. 'land_id' => self::get('TEST_SOW_LAND_ID', 10),
  152. 'seed_id' => self::get('TEST_SOW_SEED_ID', 201),
  153. 'seed_name' => self::get('TEST_SOW_SEED_NAME', '测试种子'),
  154. ];
  155. }
  156. /**
  157. * 获取收获测试配置
  158. */
  159. public static function getHarvestConfig(): array
  160. {
  161. return [
  162. 'land_id' => self::get('TEST_HARVEST_LAND_ID', 11),
  163. 'crop_id' => self::get('TEST_HARVEST_CROP_ID', 301),
  164. ];
  165. }
  166. /**
  167. * 获取施肥测试配置
  168. */
  169. public static function getFertilizerConfig(): array
  170. {
  171. return [
  172. 'land_id' => self::get('TEST_FERTILIZER_LAND_ID', 12),
  173. 'item_id' => self::get('TEST_FERTILIZER_ITEM_ID', 401),
  174. 'item_name' => self::get('TEST_FERTILIZER_ITEM_NAME', '有机肥料'),
  175. ];
  176. }
  177. /**
  178. * 获取宠物测试配置
  179. */
  180. public static function getPetConfig(): array
  181. {
  182. return [
  183. 'pet_id' => self::get('TEST_PET_ID', 1001),
  184. 'pet_name' => self::get('TEST_PET_NAME', '测试宠物'),
  185. 'food_id' => self::get('TEST_PET_FOOD_ID', 601),
  186. 'skill_id' => self::get('TEST_PET_SKILL_ID', 701),
  187. ];
  188. }
  189. /**
  190. * 获取商店测试配置
  191. */
  192. public static function getShopConfig(): array
  193. {
  194. return [
  195. 'item_id' => self::get('TEST_SHOP_ITEM_ID', 1201),
  196. 'price' => self::get('TEST_SHOP_ITEM_PRICE', 100),
  197. 'currency_type' => self::get('TEST_SHOP_CURRENCY_TYPE', 1),
  198. ];
  199. }
  200. /**
  201. * 获取好友测试配置
  202. */
  203. public static function getFriendConfig(): array
  204. {
  205. return [
  206. 'friend_user_id' => self::get('TEST_FRIEND_USER_ID', 2001),
  207. 'friend_username' => self::get('TEST_FRIEND_USERNAME', 'friend_user'),
  208. 'apply_id' => self::get('TEST_FRIEND_APPLY_ID', 2101),
  209. ];
  210. }
  211. /**
  212. * 获取性能测试配置
  213. */
  214. public static function getPerformanceConfig(): array
  215. {
  216. return [
  217. 'request_count' => self::get('TEST_PERFORMANCE_REQUEST_COUNT', 10),
  218. 'max_response_time' => self::get('TEST_PERFORMANCE_MAX_RESPONSE_TIME', 5000),
  219. ];
  220. }
  221. /**
  222. * 获取并发测试配置
  223. */
  224. public static function getConcurrentConfig(): array
  225. {
  226. return [
  227. 'request_count' => self::get('TEST_CONCURRENT_REQUEST_COUNT', 5),
  228. 'max_wait_time' => self::get('TEST_CONCURRENT_MAX_WAIT_TIME', 10),
  229. ];
  230. }
  231. /**
  232. * 获取概率测试配置
  233. */
  234. public static function getProbabilityConfig(): array
  235. {
  236. return [
  237. 'attempts' => self::get('TEST_PROBABILITY_ATTEMPTS', 20),
  238. 'error_margin' => self::get('TEST_PROBABILITY_ERROR_MARGIN', 30),
  239. ];
  240. }
  241. /**
  242. * 获取调试配置
  243. */
  244. public static function getDebugConfig(): array
  245. {
  246. return [
  247. 'enabled' => self::get('TEST_DEBUG_ENABLED', true),
  248. 'dump_requests' => self::get('TEST_DEBUG_DUMP_REQUESTS', true),
  249. 'dump_responses' => self::get('TEST_DEBUG_DUMP_RESPONSES', true),
  250. 'measure_time' => self::get('TEST_DEBUG_MEASURE_TIME', true),
  251. ];
  252. }
  253. /**
  254. * 检查是否为调试模式
  255. */
  256. public static function isDebugMode(): bool
  257. {
  258. return self::get('TEST_DEBUG_ENABLED', true);
  259. }
  260. /**
  261. * 获取所有环境变量
  262. */
  263. public static function getAll(): array
  264. {
  265. self::load();
  266. return self::$envCache;
  267. }
  268. /**
  269. * 重新加载环境变量
  270. */
  271. public static function reload(): void
  272. {
  273. self::$loaded = false;
  274. self::$envCache = [];
  275. self::load();
  276. }
  277. }