gRPC Test Automation for Embedded Devices
Automated framework for testing C/C++ SDK on embedded boards via gRPC + JMeter.
Complete Workflow
┌─────────────────────────────────────────────────────────────────┐
│ 输入: 需求文档 + C/C++ SDK (头文件 + 库) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Step 1: 分析 SDK 头文件 │
│ - 提取函数签名 │
│ - 识别错误码枚举 │
│ - 理解数据结构 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Step 2: 编写 C++ gRPC 服务端 │
│ - 创建 Proto 文件 (基于 SDK 接口) │
│ - 实现 gRPC 服务类 (封装 SDK 调用) │
│ - 编写 CMakeLists.txt │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Step 3: 编译生成 │
│ - cmake + make → 生成可执行文件 │
│ - protoc → 生成 proto descriptor (.protobin) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Step 4: 编写 JMeter JMX │
│ - 引用 proto descriptor │
│ - 配置 gRPC Sampler │
│ - 定义测试用例 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Step 5: 串口下发资源到板端 │
│ - 模拟串口通信 (TCP Socket) │
│ - 下发: SDK库 + 服务程序 + Proto │
│ - 挂载到板端目录 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Step 6: 板端拉起服务 │
│ - 设置 LD_LIBRARY_PATH │
│ - 执行 ./grpc_server 8080 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Step 7: JMeter 执行测试 │
│ - jmeter -n -t test.jmx │
│ - 收集响应数据 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Step 8: 生成 Excel 报告 │
│ - 测试概览 │
│ - 测试详情 │
│ - 性能指标 │
│ - 错误详情 │
└─────────────────────────────────────────────────────────────────┘
Input Files
Required
sdk/include/*.h - SDK header files
sdk/lib/*.so or sdk/lib/*.a - SDK libraries
Optional
requirements.md - Interface specifications
test_cases.md - Historical test cases
test_framework/ - Historical framework code
Output Structure
grpc_test/
├── proto/
│ └── service.proto # Generated from SDK analysis
├── server/
│ ├── CMakeLists.txt # Build configuration
│ ├── grpc_server.cpp # gRPC server (wraps SDK)
│ ├── build/ # Build output
│ │ ├── grpc_server # Compiled executable
│ │ └── service.protobin # Proto descriptor for JMeter
│ └── service.pb.h/cc # Generated protobuf code
├── client/
│ └── test_client.cpp # Optional test client
├── jmeter/
│ ├── test_plans/
│ │ └── test.jmx # JMeter test plan
│ ├── results/
│ │ ├── result.jtl # Raw results
│ │ └── report.xlsx # Excel report
│ └── service.protobin # Proto descriptor (copied)
├── scripts/
│ ├── serial_simulator.py # Serial communication simulator
│ ├── deploy_to_board.sh # Deploy resources to board
│ ├── run_server.sh # Start server on board
│ └── run_tests.sh # Execute full test cycle
└── sdk/ # Original SDK (mounted to board)
├── include/
└── lib/
Scripts Usage
1. Analyze SDK Headers
scripts/analyze_sdk.py sdk/include/
Extracts: functions, enums, structs, error codes
2. Generate Proto + Server
scripts/generate_grpc_server.py --sdk sdk/ --output server/
Creates: proto file, server.cpp, CMakeLists.txt
3. Build
cd server/build && cmake .. && make
Generates: grpc_server executable, service.protobin
4. Deploy to Board
scripts/deploy_to_board.sh --board localhost:9999 --sdk sdk/ --server server/build/
5. Run Tests
scripts/run_tests.sh --jmx jmeter/test_plans/test.jmx --output jmeter/results/
Key Implementation Details
SDK Analysis Pattern
// SDK Header
venc_error_t venc_get_device_info(venc_device_info_t *info);
typedef struct { char device_id[64]; ... } venc_device_info_t;
typedef enum { VENC_OK=0, VENC_ERR_PARAM=1001 } venc_error_t;
↓ Analysis ↓
// Proto Definition
service VencService {
rpc GetDeviceInfo(GetDeviceInfoRequest) returns (GetDeviceInfoResponse);
}
message GetDeviceInfoResponse {
string device_id = 1;
ErrorCode error = 2;
}
Server Wrapper Pattern
// gRPC Server wraps SDK calls
Status GetDeviceInfo(ServerContext* ctx,
const GetDeviceInfoRequest* req,
GetDeviceInfoResponse* resp) override {
venc_device_info_t info;
venc_error_t err = venc_get_device_info(&info); // Call SDK
if (err == VENC_OK) {
resp->set_device_id(info.device_id);
return Status::OK;
}
return Status(StatusCode::INTERNAL, "SDK error");
}
Serial Communication Protocol
// Commands
{"command": "MOUNT", "source_path": "/path/to/sdk"}
{"command": "UPLOAD", "filename": "grpc_server", "content": "..."}
{"command": "START_SERVER", "port": 8080}
{"command": "STATUS"}
{"command": "STOP_SERVER"}
See Also
references/sdk-analysis.md - SDK header parsing patterns
references/cpp-server.md - C++ gRPC server implementation
references/serial-protocol.md - Serial communication details
references/jmeter-config.md - JMeter gRPC plugin configuration