想了解更多内容,请访问:
51CTO和华为官方合作共建的鸿蒙技术社区
https://harmonyos.51cto.com
该文档演示:编写一个动态库libmoduleb_lib.z.so , 然后编写一个测试可执行文件ModuleBTest验证动态库接口的正确性。
代码目录结构
partB/module编译的是动态库,在子系统sub_example中。
partB的目录结构为//test/example/partB
test目录结构
单元测试文件添加
子系统配置添加
子系统配置文件:
code-v3.0-LTS/OpenHarmony/build/subsystem_config.json
配置文件添加的内容如下:
...
,
"sub_example": {
"project": "hmf/test",
"path": "test/example",
"name": "sub_example",
"dir": "test"
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
在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":{}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
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;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
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"
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
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));
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
example/partB/module/test/BUILD.gn内容如下:
import("//build/ohos.gni")
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" ]
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
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"
]
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
编译:
重编编译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
这个可以参考编写单元测试用例,按照官网文档运行测试用例失败,如下图所示:
编译成功
编译成功后,可以把编译好的***Test用hdc_std.exe发送到Hi3516DV300开发板中去运行,在串口终端上输出测试用例的测试结果。
修改文件权限,重新替换文件:
mount -o remount,rw /
- 1.
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
- 1.
ModuleBTest 放入开发板/data/test目录下。 /data/test是本人在开发板上自建的目录。
hdc_std.exe file send Z:\out\ohos-arm-release\tests\unittest\sub_example\partB\ModuleBTest /data/test
- 1.
修改成可执行权后:
chmod 0711 /data/test/ModuleBTest
- 1.
即可运行单元测试用例:
/data/test/ModuleBTest
- 1.
如图所示:61行测试结果与预期不符合。
想了解更多内容,请访问:
51CTO和华为官方合作共建的鸿蒙技术社区
https://harmonyos.51cto.com