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

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐