baseUrl=env('UNITTEST_URL','http://localhost:8000'); $this->client = new Client([ 'base_uri' => $this->baseUrl, 'timeout' => 5.0, 'http_errors' => false, 'verify' => false // 禁用 SSL 验证 ]); Log::info('测试开始,设置客户端配置', [ 'base_uri' => $this->baseUrl ]); } /** * 测试 Hello 模块的 AreYouOk 请求 */ public function testHelloAreYouOk() { Log::info('准备 Hello/AreYouOk 测试数据'); // 1. 准备 Protobuf 请求数据 $areYouOk = new Request\RequestHello\ResponseHelloAreYouOk(); $areYouOk->setMsg("你好".uniqid()); $areYouOk->setTimes(time()); $requestData = $areYouOk->serializeToString(); Log::info('序列化请求数据完成', [ 'data_length' => strlen($requestData) ]); // 2. 发送真实的 HTTP 请求 Log::info('发送 HTTP 请求'); $response = $this->client->post('/api/protobuf', [ 'body' => $requestData, 'headers' => [ 'Content-Type' => 'application/x-protobuf', 'Accept' => 'application/x-protobuf' ] ]); Log::info('收到 HTTP 响应', [ 'status_code' => $response->getStatusCode(), 'headers' => $response->getHeaders() ]); // 3. 验证 HTTP 响应状态码 $this->assertEquals(200, $response->getStatusCode()); // 4. 解析响应数据 $responseContent = $response->getBody()->getContents(); Log::info('获取响应内容', [ 'content_length' => strlen($responseContent) ]); $protoResponse = new Response(); $protoResponse->mergeFromString($responseContent); // 5. 验证基本响应字段 $this->assertEquals(RESPONSE_CODE::OK, $protoResponse->getCode()); $runUnid = $protoResponse->getRunUnid(); $this->assertNotEmpty($runUnid); $this->assertGreaterThanOrEqual(0, $protoResponse->getRunMs()); // 6. 验证请求日志记录 $requestLog = RequestLog::where('request_unid', $runUnid)->first(); $this->assertNotNull($requestLog); $this->assertEquals('api/protobuf', $requestLog->path); $this->assertEquals('POST', $requestLog->method); $this->assertNotEmpty($requestLog->headers); $this->assertNotEmpty($requestLog->ipaddress); $this->assertNotEmpty($requestLog->host); $this->assertEquals($protoResponse->serializeToJsonString(), $requestLog->response); $this->assertEquals($protoResponse->getRunMs(), $requestLog->run_ms); // 6. 验证业务响应数据 $this->assertTrue($protoResponse->hasHello()); $helloResponse = $protoResponse->getHello(); $this->assertTrue($helloResponse->hasAreYouOk()); $areYouOkResponse = $helloResponse->getAreYouOk(); $this->assertStringStartsWith( $areYouOk->getMsg(),$areYouOkResponse->getMsg()); $this->assertEquals($request->getHello()->getAreYouOk()->getTimes(), $areYouOkResponse->getTimes()); Log::info('测试完成'); } /** * 测试 Hello 模块的 AreYouOk 请求, Validation错误 */ public function testHelloAreYouOk1() { Log::info('准备 Hello/AreYouOk 测试数据'); // 1. 准备 Protobuf 请求数据 $areYouOk = new Request\RequestHello\RequestHelloAreYouOk(); $areYouOk->setMsg("你好".uniqid()); $areYouOk->setTimes(1); $hello = new Request\RequestHello(); $hello->setAreYouOk($areYouOk); $request = new Request(); $request->setHello($hello); $requestData = $request->serializeToString(); Log::info('序列化请求数据完成', [ 'data_length' => strlen($requestData) ]); // 2. 发送真实的 HTTP 请求 Log::info('发送 HTTP 请求'); $response = $this->client->post('/api/protobuf', [ 'body' => $requestData, 'headers' => [ 'Content-Type' => 'application/x-protobuf', 'Accept' => 'application/x-protobuf' ] ]); Log::info('收到 HTTP 响应', [ 'status_code' => $response->getStatusCode(), 'headers' => $response->getHeaders() ]); // 3. 验证 HTTP 响应状态码 $this->assertEquals(200, $response->getStatusCode()); // 4. 解析响应数据 $responseContent = $response->getBody()->getContents(); Log::info('获取响应内容', [ 'content_length' => strlen($responseContent) ]); $protoResponse = new Response(); $protoResponse->mergeFromString($responseContent); Log::info('解析响应数据完成', [ 'response_code' => $protoResponse->getCode(), 'run_ms' => $protoResponse->getRunMs(), 'json'=>$protoResponse->serializeToJsonString() ]); // 5. 验证基本响应字段 $this->assertEquals(RESPONSE_CODE::VALIDATE_ERROR, $protoResponse->getCode()); // 6. 验证错误日志记录 $requestLog = RequestLog::where('request_unid', $protoResponse->getRunUnid())->first(); $this->assertNotNull($requestLog); $this->assertNotEmpty($requestLog->error); Log::info('测试完成'); } /** * 测试msg不存在数值 * @return void * @throws \GuzzleHttp\Exception\GuzzleException */ public function testHelloAreYouOk2() { Log::info('准备 Hello/AreYouOk 测试数据'); // 1. 准备 Protobuf 请求数据 $areYouOk = new Request\RequestHello\RequestHelloAreYouOk(); $areYouOk->setTimes(100); $hello = new Request\RequestHello(); $hello->setAreYouOk($areYouOk); $request = new Request(); $request->setHello($hello); $requestData = $request->serializeToString(); Log::info('序列化请求数据完成', [ 'data_length' => strlen($requestData) ]); // 2. 发送真实的 HTTP 请求 Log::info('发送 HTTP 请求'); $response = $this->client->post('/api/protobuf', [ 'body' => $requestData, 'headers' => [ 'Content-Type' => 'application/x-protobuf', 'Accept' => 'application/x-protobuf' ] ]); Log::info('收到 HTTP 响应', [ 'status_code' => $response->getStatusCode(), 'headers' => $response->getHeaders() ]); // 3. 验证 HTTP 响应状态码 $this->assertEquals(200, $response->getStatusCode()); // 4. 解析响应数据 $responseContent = $response->getBody()->getContents(); Log::info('获取响应内容', [ 'content_length' => strlen($responseContent) ]); $protoResponse = new Response(); $protoResponse->mergeFromString($responseContent); Log::info('解析响应数据完成', [ 'response_code' => $protoResponse->getCode(), 'run_ms' => $protoResponse->getRunMs(), 'json'=>$protoResponse->serializeToJsonString() ]); // 5. 验证基本响应字段 $this->assertEquals(RESPONSE_CODE::VALIDATE_ERROR, $protoResponse->getCode()); // 6. 验证错误日志记录 $requestLog = RequestLog::where('request_unid', $protoResponse->getRunUnid())->first(); $this->assertNotNull($requestLog); $this->assertNotEmpty($requestLog->error); Log::info('测试完成'); } /** * 测试无效的请求数据 */ public function testInvalidRequest() { Log::info('开始测试无效请求'); // 1. 发送无效数据 $response = $this->client->post('/api/protobuf', [ 'body' => 'invalid data', 'headers' => [ 'Content-Type' => 'application/x-protobuf' ] ]); Log::info('收到无效请求响应', [ 'status_code' => $response->getStatusCode() ]); // 2. 验证 HTTP 响应状态码 $this->assertEquals(200, $response->getStatusCode()); // 3. 解析响应数据 $protoResponse = new Response(); $protoResponse->mergeFromString($response->getBody()->getContents()); // 4. 验证错误响应 $this->assertEquals(RESPONSE_CODE::SERVER_ERROR, $protoResponse->getCode()); // 5. 验证错误日志记录 $requestLog = RequestLog::where('request_unid', $protoResponse->getRunUnid())->first(); $this->assertNotNull($requestLog); $this->assertNotEmpty($requestLog->error); Log::info('无效请求测试完成'); } /** * 测试空请求数据 */ public function testEmptyRequest() { Log::info('开始测试空请求'); // 1. 发送空数据 $response = $this->client->post('/api/protobuf', [ 'body' => '', 'headers' => [ 'Content-Type' => 'application/x-protobuf' ] ]); Log::info('收到空请求响应', [ 'status_code' => $response->getStatusCode() ]); // 2. 验证 HTTP 响应状态码 $this->assertEquals(200, $response->getStatusCode()); // 3. 解析响应数据 $protoResponse = new Response(); $protoResponse->mergeFromString($response->getBody()->getContents()); // 4. 验证错误响应 $this->assertEquals(RESPONSE_CODE::SERVER_ERROR, $protoResponse->getCode()); // 5. 验证错误日志记录 $requestLog = RequestLog::where('request_unid', $protoResponse->getRunUnid())->first(); $this->assertNotNull($requestLog); $this->assertNotEmpty($requestLog->error); Log::info('空请求测试完成'); } /** * 测试未知模块 */ public function testUnknownModule() { Log::info('开始测试未知模块请求'); // 1. 准备一个空的请求对象 $request = new Request(); $requestData = $request->serializeToString(); // 2. 发送请求 $response = $this->client->post('/api/protobuf', [ 'body' => $requestData, 'headers' => [ 'Content-Type' => 'application/x-protobuf' ] ]); Log::info('收到未知模块响应', [ 'status_code' => $response->getStatusCode() ]); // 3. 验证 HTTP 响应状态码 $this->assertEquals(200, $response->getStatusCode()); // 4. 解析响应数据 $protoResponse = new Response(); $protoResponse->mergeFromString($response->getBody()->getContents()); // 5. 验证错误响应 $this->assertEquals(RESPONSE_CODE::SERVER_ERROR, $protoResponse->getCode()); // 6. 验证错误日志记录 $requestLog = RequestLog::where('request_unid', $protoResponse->getRunUnid())->first(); $this->assertNotNull($requestLog); $this->assertNotEmpty($requestLog->error); Log::info('未知模块测试完成'); } }