首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

HarmonyOS鸿蒙开发实战(5.0)​监听HiLog日志实现测试验证实践

  • 25-03-03 06:42
  • 3872
  • 5530
blog.csdn.net

鸿蒙HarmonyOS开发实战往期必看文章:(持续更新......)

HarmonyOS NEXT应用开发性能实践总结(持续更新......)

HarmonyOS NEXT应用开发案例实践总结合集(持续更新......)

一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!

最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)


介绍

日常中在进行测试用例验证时,会出现部分场景无法通过判断UI的变化来确认用例是否正常运行,我们可以通过监听日志的方式来巧妙的实现这种场景。本示例通过监听hilog日志的回调,判断指定日志是否打印,来确定测试用例的执行结果是成功还是失败。由于ArkTS没有注册日志回调的接口,示例通过Native来注册日志回调,并在Native的自定义日志处理函数中过滤用户传入的日志内容后回调ArkTS端的回调函数。

效果图预览

验证场景测试结果日志打印

验证场景

测试结果

日志打印

使用说明:

  1. 在product工程的ohosTest中启动Ability.test.ets来验证开启日志回调、关闭日志回调两个测试用例是否成功。

实现思路

  1. 在Native中实现注册日志回调函数。

    1. static napi_value SetLogCallback(napi_env env, napi_callback_info info) {
    2. size_t argc = 2;
    3. napi_value args[2] = {nullptr};
    4. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    5. // 解析要过滤的日志
    6. size_t logSize;
    7. napi_get_value_string_utf8(env, args[0], logToFilter, MAX_LOG_LEN, &logSize);
    8. // 解析ArkTS端的回调函数
    9. napi_valuetype valueType = napi_undefined;
    10. napi_typeof(env, args[1], &valueType);
    11. if(valueType != napi_function) {
    12. OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "SetLogCallback fail,param[2] is not a function!");
    13. return nullptr;
    14. }
    15. // 创建ArkTS端回调函数的引用
    16. napi_create_reference(env, args[1], 1, &callbackRef);
    17. g_env = env;
    18. // 注册日志回调接口
    19. OH_LOG_SetCallback(HiLogCallbackFilter);
    20. OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "TestLogCallback SetCallback end");
    21. return nullptr;
    22. }
  2. 在Native中实现自定义日志处理函数。

    1. static void HiLogCallbackFilter(const LogType type, const LogLevel level, const unsigned int domain, const char *tag,
    2. const char *msg) {
    3. std::string strMsg(msg, strlen(msg) + 1);
    4. // TODO: 知识点: 过滤要查找的日志
    5. size_t foundIndex = strMsg.find(logToFilter);
    6. if(foundIndex != -1) {
    7. // ArkTS回调函数
    8. napi_value callback = nullptr;
    9. napi_get_reference_value(g_env, callbackRef, &callback);
    10. // 返回日志内容
    11. napi_value hilogArg;
    12. napi_create_string_utf8(g_env, msg, NAPI_AUTO_LENGTH, &hilogArg);
    13. napi_value ret;
    14. // TODO: 知识点: 调用ArkTS端传入的回调函数
    15. napi_call_function(g_env, nullptr, callback, 1, &hilogArg, &ret);
    16. }
    17. return;
    18. }
  3. 在Native中实现关闭日志回调功能。

    1. static napi_value CancelLogCallback(napi_env env, napi_callback_info info) {
    2. // 关闭日志回调
    3. OH_LOG_SetCallback(nullptr);
    4. OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "TestLogCallback CancelLogCallBack end");
    5. // 删除回调函数引用
    6. napi_delete_reference(env, callbackRef);
    7. return nullptr;
    8. }
  4. 将以上Native的日志回调功能封装成ts接口HiLogMonitorManagement。

    1. import testNapi from 'liblogcallback.so';
    2. export class HiLogMonitorManagement {
    3. // TODO: 知识点: 注册日志回调函数
    4. registerCallback(strLog: string, callBack : Function) : void {
    5. testNapi.setLogCallback(strLog, callBack);
    6. }
    7. // TODO: 知识点: 关闭日志回调
    8. cancelCallback() : void {
    9. testNapi.cancelLogCallback();
    10. }
    11. }
  5. 在product工程中实现测试用例编写。

    1. // ..\product\entry\src\ohosTest\ets\test\Ability.test.ets
    2. /**
    3. * 打开应用,应用启动后注册日志回调
    4. */
    5. it(BUNDLE + '_startAbility', 0, async (done: Function) => {
    6. logger.info(TAG, BUNDLE + '_startAbility start')
    7. let want: Want = {
    8. bundleName: 'com.north.commonappdevelopment',
    9. abilityName: 'EntryAbility'
    10. };
    11. delegator.startAbility(want, (err) => {
    12. logger.info(TAG, 'StartAbility get err ' + JSON.stringify(err));
    13. expect(err).assertNull();
    14. })
    15. logger.info(TAG, BUNDLE + '_startAbility end');
    16. let driver: Driver = Driver.create();
    17. await driver.delayMs(3000);
    18. done();
    19. })
    20. /**
    21. * 注册日志回调,验证保存Rawfile图片到沙箱功能是否运行
    22. */
    23. it('CommonAppDevelopment_nativesavepictosandbox_001', 1, async (done: Function) => {
    24. logger.info(TAG, `${BUNDLE}_nativesavepictosandbox_001 begin`);
    25. let driver: Driver = Driver.create();
    26. await driver.delayMs(1000);
    27. // 进入tab的native页签
    28. let nativeBtn: Component = await driver.findComponent(ON.text('Native'));
    29. await driver.delayMs(500);
    30. await nativeBtn.click();
    31. await driver.delayMs(500);
    32. // 点击进入native保存图片到沙箱场景首页
    33. await driver.swipe(0, 800, 0, 100, 600);
    34. let sandboxBtn: Component = await driver.findComponent(ON.text('native保存图片到沙箱'));
    35. await driver.delayMs(500);
    36. await sandboxBtn.click();
    37. await driver.delayMs(500);
    38. // TODO: 知识点: 注册日志回调, 侦听保存Rawfile图片到沙箱功能
    39. const logMonitor : string = "saveImageOfRawfile Be2gin"; // 要监听的日志内容
    40. let isMonitorLogPrint : Boolean = false; // 监听的日志内容是否打印
    41. let logCallback : string = ""; // 回调返回的日志内容
    42. const hiLogMonitor: HiLogMonitorManagement = new HiLogMonitorManagement();
    43. hiLogMonitor.registerCallback(logMonitor, ((strLog: string) => {
    44. // 判断返回的日志内容是否包含侦听的日志内容
    45. logCallback = strLog;
    46. if (logCallback.indexOf(logMonitor) !== -1) {
    47. isMonitorLogPrint = true;
    48. } else {
    49. isMonitorLogPrint = false;
    50. }
    51. }));
    52. isMonitorLogPrint = false;
    53. // 点击保存Rawfile图片到沙箱
    54. let rawFileBtn: Component = await driver.findComponent(ON.text('保存Rawfile图片'));
    55. logger.info(TAG, 'TestLogCallback registerCallback call begin, isMonitorLogPrint:' + isMonitorLogPrint.toString());
    56. await rawFileBtn.click();
    57. await driver.delayMs(100);
    58. // 验证注册日志回调后,isMonitorLogPrint 为 true
    59. expect(isMonitorLogPrint).assertEqual(true);
    60. // 验证完后关闭侦听
    61. hiLogMonitor.cancelCallback();
    62. logger.info(TAG, 'TestLogCallback registerCallback call end, isMonitorLogPrint:' + isMonitorLogPrint.toString() + ', log: ' + logCallback);
    63. // 退出到首页面
    64. await driver.delayMs(500);
    65. await driver.pressBack();
    66. logger.info(TAG, `${BUNDLE}_nativesavepictosandbox_001 end`);
    67. done();
    68. })

高性能知识点

不涉及

工程结构&模块类型

  1. hilogmonitormanagement // har类型
  2. |---src\main\ets\model\
  3. | |---logCallBack.ets // ArkTS层- ts接口
  4. |---src\main\cpp\
  5. | |---logcallback.cpp // native层-日志回调业务逻辑
  6. ..\product\entry\src\ohosTest // 测试用例工程
  7. |---ets\test\
  8. | |---Ability.test.ets // 测试用例

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线图、学习视频、文档用来跟着学习是非常有必要的。 

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员

鸿蒙 NEXT 全栈开发学习笔记  希望这一份鸿蒙学习文档能够给大家带来帮助~

这份鸿蒙(HarmonyOS NEXT)包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。


鸿蒙(HarmonyOS NEXT)最新学习路线

​

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频学习教程+学习PDF文档

HarmonyOS Next 最新全套视频教程 全球开发者的开源社区,开源代码

  纯血版鸿蒙全套学习文档(面试、文档、全套视频等)  全球开发者的开源社区,开源代码

​​

《鸿蒙大厂面试真题》GitCode - 全球开发者的开源社区,开源代码

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

鸿蒙NEXT全套学习资料
微信名片
注:本文转载自blog.csdn.net的让开,我要吃人了的文章"https://blog.csdn.net/weixin_55362248/article/details/142489638"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top