Flutter跨平台鸿蒙自动化测试服务node_test_server使用指南
摘要:node_test_server是一个基于Node.js的Flutter鸿蒙应用自动化测试组件,提供测试执行、日志解析和Excel报告生成功能。支持Flutter 2.19.6+和OpenHarmony API 9+环境,通过简洁API实现批量测试和定时执行。主要功能包括:自动更新Flutter SDK、执行集成测试(如path_provider、key_input等)、结构化日志解析和生成

1. 插件介绍
node_test_server是一个专为Flutter鸿蒙应用开发的自动化测试服务组件,基于Node.js构建,提供完整的测试执行、结果处理和报告生成功能。该组件能够:
- 自动化执行Flutter集成测试
- 实时捕获和解析测试日志
- 生成结构化Excel测试报告
- 支持批量测试和定时执行
- 与OpenHarmony设备无缝集成
本组件适用于需要进行大规模自动化测试的Flutter鸿蒙应用开发团队,能够显著提高测试效率和质量。
2. 环境要求
在使用node_test_server之前,您需要确保满足以下环境要求:
| 环境依赖 | 版本要求 | 说明 |
|---|---|---|
| Node.js | v14.0+ | 运行测试服务 |
| Flutter | 2.19.6+ | 执行Flutter测试 |
| Dart | 2.19.6+ | Flutter依赖 |
| OpenHarmony | API 9+ | 测试目标设备 |
| ExcelJS | ^4.4.0 | 生成Excel报告 |
3. 依赖引入
3.1 安装Node.js依赖
在项目根目录下执行以下命令安装必要的Node.js依赖:
npm install
3.2 配置Flutter项目依赖
在您的Flutter项目的pubspec.yaml文件中添加以下依赖配置(以path_provider为例):
dependencies:
path_provider:
git:
url: "https://atomgit.com/flutter/packages"
path: "packages/path_provider/path_provider"
sqflite:
git:
url: "https://atomgit.com/flutter/plugins"
path: "packages/sqflite/sqflite"
4. API使用
4.1 基本用法
node_test_server提供了简洁的API接口,用于执行测试和生成报告:
// 引入必要的模块
const fs = require('fs');
const path = require('path');
const Excel = require('exceljs');
const exec = require("child_process").exec;
// 创建日志目录
function createFolder(dirName) {
try {
if (!fs.existsSync(path.resolve(__dirname, dirName))) {
fs.mkdirSync(path.resolve(__dirname, dirName), { recursive: true });
}
} catch (err) {
console.error(err);
}
}
// 执行命令
function runCmd(cmd) {
return new Promise(function (resolve, reject) {
exec(cmd, {
maxBuffer: 1024 * 2000
}, function (err, stdout, stderr) {
if (err) {
console.log(err);
reject(err);
} else if (stderr.length > 0) {
reject(new Error(stderr.toString()));
} else {
console.log(stdout);
resolve();
}
});
});
}
4.2 执行测试
使用runCmd函数执行Flutter集成测试:
async function main() {
// 更新Flutter SDK
await runCmd(`for /f "delims=" %i in ('where flutter') do @cd /d "%~dpi" && git pull`);
// 执行path_provider测试
await runCmd(`cd ..\automated_testing_demo && flutter test .\integration_test\path_provider_test_10000.dart --machine > ..\node_test_server\logs_10000\path_provider_test.txt`);
// 执行key_input测试
await runCmd(`cd ..\automated_testing_demo && flutter test .\integration_test\key_input_test_10000.dart --machine > ..\node_test_server\logs_10000\key_input_test.txt`);
// 执行sqflite测试
await runCmd(`cd ..\automated_testing_demo && flutter test .\integration_test\sqflite_test_10000.dart --machine > ..\node_test_server\logs_10000\sqflite_test.txt`);
// 生成Excel报告
createXlsx();
}
4.3 生成测试报告
使用createXlsx函数生成结构化的Excel测试报告:
function createXlsx() {
var time = new Date();
var dirName = (time.getMonth() + 1) + '' + doubleStr(time.getDate());
createFolder(dirName)
const workbook = new Excel.Workbook();
files.forEach(async item => {
var fileStr = fs.readFileSync(fileUrl + '/' + item, 'utf8');
const result = fomateTxt(fileStr)
const sheet = workbook.addWorksheet(item);
sheet.columns = [
{ header: '测试项', key: 'testName', width: 20 },
{ header: '结果', key: 'result', width: 10 },
{ header: '运行时间(ms)', key: 'difference', width: 10 },
{ header: '打印值', key: 'message', width: 50 },
{ header: '路径', key: 'testUrl', width: 50 },
];
result.forEach(item => {
sheet.addRow(item)
})
})
workbook.xlsx.writeFile(dirName + '/' + doubleStr(time.getHours()) + '-' + doubleStr(time.getMinutes()) + '.xlsx');
}
4.4 解析测试日志
使用fomateTxt函数解析测试日志并提取关键信息:
function fomateTxt(data) {
let result = [];
let resultMap = new Map();
data.split('\n').forEach(item => {
if (/^\{.*\}$/.test(item)) {
const itemJson = JSON.parse(item);
if (itemJson.type === 'testStart') {
resultMap.set(itemJson.test.id, { ...itemJson, messageList: [] });
}
if (itemJson.testID) {
const newItem = resultMap.get(itemJson.testID);
newItem.difference = itemJson.time - newItem.time
if (itemJson.type === 'testDone') {
newItem.result = itemJson.result;
} else if (itemJson.type === 'print') {
newItem.messageList.push(itemJson.message);
}
resultMap.set(itemJson.testID, newItem)
}
}
})
for (let [key, mapValue] of resultMap) {
mapValue.testName = mapValue.test.name
mapValue.testUrl = mapValue.test.url
mapValue.message = mapValue.messageList.join('\n');
result.push(mapValue);
}
return result;
}
5. 批量测试配置
node_test_server提供了批处理脚本,方便您快速执行测试任务:
5.1 使用bat脚本执行测试
# pathProvideTest.bat
cd ..
exceljs index_10000.js
5.2 自定义测试命令
您可以根据需要自定义测试命令,例如:
# 执行特定测试
node index_10000.js --test path_provider
# 执行所有测试
node index_10000.js --test all
# 生成报告
node index_10000.js --report only
6. 测试报告示例
生成的Excel报告包含以下信息:
| 测试项 | 结果 | 运行时间(ms) | 打印值 | 路径 |
|---|---|---|---|---|
| path_provider_test | success | 1234 | “Directory: /data/user/0/…” | integration_test/path_provider_test_10000.dart |
| key_input_test | success | 5678 | “Key pressed: A” | integration_test/key_input_test_10000.dart |
| sqflite_test | failed | 9012 | “Database error: table not found” | integration_test/sqflite_test_10000.dart |
7. 常见问题与解决方案
7.1 测试执行失败
问题:测试命令执行失败,显示"flutter command not found"
解决方案:确保Flutter环境变量已正确配置,或在命令中指定Flutter的完整路径。
7.2 报告生成失败
问题:Excel报告生成失败,显示"Cannot write to file"
解决方案:确保目标目录存在且具有写入权限,或检查ExcelJS依赖是否正确安装。
7.3 测试日志解析错误
问题:测试日志解析失败,显示"Invalid JSON format"
解决方案:确保测试命令使用了--machine参数,以生成机器可读的JSON格式日志。
8. 总结
node_test_server是一个功能强大的Flutter鸿蒙应用自动化测试服务组件,能够帮助开发团队:
- 提高测试效率,减少人工测试成本
- 确保测试结果的准确性和一致性
- 提供清晰的测试报告,便于问题定位和分析
- 支持持续集成和持续部署流程
通过使用node_test_server,开发团队可以更专注于应用功能开发,而将测试工作交给自动化系统处理,从而加快开发周期,提高产品质量。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐



所有评论(0)