#星光计划2.0#OpenHarmony 单元测试1: 测试用例指导大全 原创 精华

碼磚民工
发布于 2021-12-21 14:40
浏览
6收藏

【本文正在参与51CTO HarmonyOS技术社区创作者激励计划-星光计划2.0】

该文档演示:L2编写一个动态库libmoduleb_lib.z.so , 然后编写一个测试可执行文件ModuleBTest验证动态库接口的正确性。
@toc

代码目录结构

partB/module编译的是动态库,在子系统sub_example中。
partB的目录结构为//test/example/partB
#星光计划2.0#OpenHarmony  单元测试1: 测试用例指导大全-鸿蒙开发者社区

test目录结构

#星光计划2.0#OpenHarmony  单元测试1: 测试用例指导大全-鸿蒙开发者社区

单元测试文件添加

子系统配置添加

子系统配置文件:
code-v3.0-LTS/OpenHarmony/build/subsystem_config.json
配置文件添加的内容如下:

  ...
  ,
  "sub_example": {
    "project": "hmf/test",
    "path": "test/example",
    "name": "sub_example",
    "dir": "test"
  }

在Hi3516DV300.json中添加partB的配置

Hi3516DV300.json的位置:
productdefine/common/products/Hi3516DV300.json

添加的内容如下:

{
  "product_name": "Hi3516DV300",
  "product_company": "hisilicon",
  "product_device": "hi3516dv300",
  "version": "2.0",
  "type": "standard",
  "product_build_path": "device/hisilicon/build",
  "parts":{
    ...
    "sub_example:partB":{}
  }
}

example/partB/module/include/moduleB.h内容如下

#ifndef MODULE_B_H
#define MODULE_B_H

int Sub(int a, int b); 
int Add(int a, int b);
#endif //MODULE_B_H

example/partB/module/include/moduleB.c内容如下

#include "moduleB.h"
#include <stdio.h>

int Sub(int a, int b)
{
    return a - b;
}

int Add(int a, int b)
{
    return a + b;
}

example/partB/module/BUILD.gn内容如下

import("//build/ohos.gni")

config("moduleb_lib_config") {
  include_dirs = [ "include" ]
}
ohos_shared_library("moduleb_lib") {
  sources = [
    "//test/example/partB/module/include/moduleB.h",
    "//test/example/partB/module/src/moduleB.c"
  ]
  public_configs = [ ":moduleb_lib_config" ]
  part_name = "partB"
  subsystem_name = "sub_example"
}

example/partB/module/test/unittest/module_test/moduleb_test.cpp内容如下

#include <gtest/gtest.h>
#include <cstdio>
extern "C" {
#include "moduleB.h"
}

using namespace testing::ext;

// 继承googletext的Test类
class ModuleBTest : public testing::Test {
public:
    static void SetUpTestCase();
    static void TearDownTestCase();
    void SetUp();
    void TearDown();
};

void ModuleBTest::SetUpTestCase() {}

void ModuleBTest::TearDownTestCase() {}

void ModuleBTest::SetUp()
{
    /**
     * @tc.setup: reset perfStat
     */
    printf("ModuleBTest::SetUp\n");
}

void ModuleBTest::TearDown() {
    printf("ModuleBTest::TearDown\n");
}

/**
 * @tc.name: ModuleBTest001
 * @tc.desc: Test bind start time and end
 * @tc.type: FUNC
 * @tc.require: AR000CUF6O
 */
HWTEST_F(ModuleBTest, ModuleBTest001, TestSize.Level0)
{
    // step 1:调用函数获取结果
    int actual = Sub(4, 1);

    // Step 2:使用断言比较预期与实际结果
    EXPECT_EQ(4, actual);
}

/**
 * @tc.name: ModuleBTest002
 * @tc.desc: invalid end time test
 * @tc.type: FUNC
 * @tc.require: AR000CUF6O
 */
HWTEST_F(ModuleBTest, ModuleBTest002, TestSize.Level0)
{
    // 判断Add函数调用的结果是不是期望的12
    EXPECT_EQ(12, Add(5, 7)); 
}

example/partB/module/test/BUILD.gn内容如下:

import("//build/test.gni")

module_output_path = "sub_example/partB"

ohos_unittest("ModuleBTest") {
  module_out_path = module_output_path

  include_dirs = [
    "//test/example/partB/module/include"
   ]
  cflags = [
    "-Wall",
    "-Werror",
  ]
  sources = [
    "unittest/module_test/moduleb_test.cpp"
  ]

  deps = [
    "//third_party/googletest:gtest_main",
  ]
  external_deps = [ "partB:moduleb_lib", ]
  part_name = "partB"
}

group("unittest") {
  testonly = true
  deps = [ ":ModuleBTest" ]
}

example/ohos.build内容如下

注意:“test_list”,为单元测试添加,把ModuleBTest添加到编译系统中去:

{
    "subsystem": "sub_example",
    "parts": {
        "partB": {
            "module_list": [
                "//test/example/partB/module:moduleb_lib"
            ],
            "inner_kits": [
                {
                    "type": "so",
                    "name": "//test/example/partB/module:moduleb_lib",
                    "header": {
                        "header_files": [
                            "moduleB.h"
                        ],
                        "header_base": "//test/example/partB/module/include"
                    }
                }
            ],
            "system_kits": [],
            "test_list": [
                "//test/example/partB/module/test:unittest"
            ]
        }
    }
}

编译:

重编编译moduleb_lib命令如下:
./build.sh --product-name Hi3516DV300 --ccache --build-target moduleb_lib
编译结果在:out\ohos-arm-release\sub_example\partB
编译ModuleBTest命令如下:
./build.sh --product-name Hi3516DV300 --ccache --build-target ModuleBTest
编译结果在:out\ohos-arm-release\tests\unittest\sub_example\partB

测试运行

参考文档:https://gitee.com/openharmony/test_developertest
这个可以参考编写单元测试用例,按照官网文档运行测试用例失败,如下图所示:
#星光计划2.0#OpenHarmony  单元测试1: 测试用例指导大全-鸿蒙开发者社区
#星光计划2.0#OpenHarmony  单元测试1: 测试用例指导大全-鸿蒙开发者社区

编译成功

编译成功后,可以把编译好的***Test用hdc_std.exe发送到Hi3516DV300开发板中去运行,在串口终端上输出测试用例的测试结果。

修改系统权限,目录能读能写:

mount -o remount,rw /

libmoduleb_lib.z.so 放入开发板/system/lib/的目录下:

hdc_std.exe file send Z:\out\ohos-arm-release\sub_example\partB\libmoduleb_lib.z.so /system/lib

ModuleBTest 放入开发板/data/test目录下。 /data/test是本人在开发板上自建的目录。

hdc_std.exe file send Z:\out\ohos-arm-release\tests\unittest\sub_example\partB\ModuleBTest /data/test

修改成可执行权后:

chmod 0711 /data/test/ModuleBTest

即可运行单元测试用例:

测试全部接口:/data/test/ModuleBTest
测试单个接口:/data/test/ModuleBTest --gtest_filter=ModuleBTest.ModuleBTest001
注意:filter=后面的ModuleBTest和HWTEST_F中第一个参数一致。

#星光计划2.0#OpenHarmony  单元测试1: 测试用例指导大全-鸿蒙开发者社区
如图所示:61行测试结果与预期不符合。
gtest的gmock使用流程参考OpenHarmony 单元测试2:gmock简单使用流程
代码库中的源码相对于文档中的代码有少许调整,基本结构不变:
【源代码】,重点关注example\partB\module目录
按照官网方式运行测试用例报错DeviceError,主要是没有安装xdevicehdc_std.exe系统环境变量配置。可以参考文档:L2 xts测试运行中的安装xdevicehdc_std.exe环境变量配置, 然后再按照官网方式运行测试用例,结果也没有官网那么完美,估计是对L2的支持没有完善。

日志输出记录

标准系统私有日志输出设置,debug日志,:
第一种方式:param set hilog.private.on false
第二种方式:hilog -p off
查看内核日志:
hilog -t kmsg
dmesg -w
cat /proc/kmsg
cat /dev/kmsg
kmsg内核日志落盘:hilog -w start -t kmsg
落盘日志罗盘目录: /data/log/hilog/

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2024-2-19 15:02:34修改
9
收藏 6
回复
举报
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

很完整的流程展示和代码讲解,感谢老师分享

回复
2021-12-21 14:50:10
回复
    相关推荐