OpenHarmony 入门——单元测试UnitTest快速入门

引言

OpenHarmony 的单元测试(UnitTest)是一个关键的软件开发过程,它确保代码的各个部分能够按预期工作,OpenHarmony的测试框架中提供了很多种的单元测试,今天简单介绍下UnitTest 类型的TDD测试。

OpenHarmony 的TDD 测试是支持全自动化测试的,本篇文章介绍的是手动运行测试用例的方式。

一、测试用例的类型和等级

测试用例类型包括功能测试(FUNC)、性能测试(PERF)、可靠性测试(RELI)、安全测试(SECU)等;测试用例等级分为门禁级(Level0)和非门禁级(Level1-Level4),其中 Level1-Level4 等级越低表示功能越重要。

二、 配置编译脚本和bundle.json

单元测试的用例也是需要像普通的功能一样,需要挂靠到对应的子系统上并且在bundle.json中的test 节点下配置触发编译。

typescript 复制代码
#注意区别非单元测试引入的build gn脚本是import("//build/ohos.gni")
import("//build/test.gni")
#编译单元测试可执行文件则是通过ohos_unittest
ohos_unittest("NnrtDeviceServiceTest") {
  module_out_path = module_output_path
  
  sources = [
    "nnrt_device_service_test.cpp",  ]

  configs = [  ]

  external_deps = [
  ]

  deps = [ 
         ]
}

bundle.json则是在"test" 节点下单独配置:

三、编译指令及运行

编译单元测试的所有用例

typescript 复制代码
./build.sh --product-name rk3568 --target-cpu arm64 --device-type tablet --no-prebuilt-sdk --ccache --build-target make_test

单编指定单元测试用例

typescript 复制代码
drivers/peripheral/nnrt/v2_0/test/unittest/BUILD.gn里的group 节点名为unittest
./build.sh --product-name rk3568 --target-cpu arm64 --device-type tablet --no-prebuilt-sdk --ccache --build-target drivers/peripheral/nnrt/v2_0/test/unittest:unittest

然后就会在:

\out\rk3568*tests\unittest *\drivers_peripheral_nnrt下生成单元测试用例可执行文件,CHMOD 赋予可执行权限后就可以直接运行了。

三、单元测试的语法

在 OpenHarmony 的单元测试框架中,SetUpTestCase()、TearDownTestCase()、SetUp() 和 TearDown() 是用于设置和清理测试环境的函数,它们在测试的不同阶段被调用。这些函数对于初始化测试资源、配置测试环境以及在测试结束后进行清理和恢复操作非常重要。

typescript 复制代码
class MyTestCase {
public:
    static void SetUpTestCase() {
        // 测试套件级别的初始化
        HiLog::Info(LABEL, "SetUpTestCase: Initializing test suite environment.");
        // ... 初始化代码
    }

    static void TearDownTestCase() {
        // 测试套件级别的清理
        HiLog::Info(LABEL, "TearDownTestCase: Cleaning up test suite environment.");
        // ... 清理代码
    }

    void SetUp() {
        // 测试用例级别的初始化
        HiLog::Info(LABEL, "SetUp: Initializing test case environment for each test.");
        // ... 初始化代码
    }

    void TearDown() {
        // 测试用例级别的清理
        HiLog::Info(LABEL, "TearDown: Cleaning up test case environment after each test.");
        // ... 清理代码
    }

    void TestFunction1() {
        // ... 测试代码
    }

    void TestFunction2() {
        // ... 测试代码
    }
};

1、SetUpTestCase() 和 TearDownTestCase()

SetUpTestCase() 和 TearDownTestCase() 是测试用例级别的设置和清理函数,它们分别在所有测试用例执行之前和之后执行一次。

  • SetUpTestCase():这个函数在测试套件中的所有测试用例执行之前调用。它用于执行一次性的初始化操作,比如创建测试所需的资源、初始化数据结构、配置系统环境等。这个函数只执行一次,为整个测试套件设置共享的测试环境。
  • TearDownTestCase():这个函数在测试套件中的所有测试用例执行之后调用。它用于执行一次性的清理操作,比如释放资源、关闭文件、恢复系统设置等。这个函数也只执行一次,用于清理测试套件结束后的环境。

2、SetUp() 和 TearDown()

SetUp() 和 TearDown() 是测试用例级别的设置和清理函数。它们分别在每个测试用例执行之前和之后执行。

  • SetUp():这个函数在每个测试用例执行之前调用。它用于为每个测试用例设置特定的测试环境,比如创建临时文件、初始化对象状态、配置测试参数等。每个测试用例在执行前都会调用这个函数,确保每个测试用例都在一个已知的初始状态下开始。
  • TearDown():这个函数在每个测试用例执行之后调用。它用于清理每个测试用例后的资源,比如删除临时文件、恢复对象状态、验证测试结果等。与 SetUp() 相对应,TearDown() 确保测试用例执行后的环境得到妥善处理。
typescript 复制代码
#include "frameworks/native/device_manager.h"
#include <gtest/gtest.h>
#include "nnrt_device_service.h"

namespace OHOS {
namespace HDI {
namespace Nnrt {
namespace V2_0 {
using namespace OHOS::HDI::Nnrt::V2_0;
using namespace testing::ext;
using namespace std;

class NnrtDeviceServiceTest : public testing::Test {
public:
    static void SetUpTestCase();
    static void TearDownTestCase();
    void SetUp();
    void TearDown();
};

void NnrtDeviceServiceTest::SetUpTestCase() {}

void NnrtDeviceServiceTest::TearDownTestCase() {}

void NnrtDeviceServiceTest::SetUp() {}

void NnrtDeviceServiceTest::TearDown() {}

 HWTEST_F(NnrtDeviceServiceTest, get_device_name, TestSize.Level1)
{
    NnrtDeviceService iDevice = NnrtDeviceService();
    std::string deviceName;
    iDevice.GetDeviceName(deviceName);

    EXPECT_EQ("MOCK-NNRT", deviceName);
} 
} // V2_0
} // Nnrt
} // HDI
} // OHOS

更多详情参照开发自测试执行框架

相关推荐
surfirst15 小时前
举例说明 .Net Core 单元测试中 xUnit 的 [Theory] 属性的用法
单元测试·.netcore·xunit
安冬的码畜日常19 小时前
【玩转 JS 函数式编程_006】2.2 小试牛刀:用函数式编程(FP)实现事件只触发一次
开发语言·前端·javascript·函数式编程·tdd·fp·jasmine
回眸&啤酒鸭1 天前
【回眸】Tessy 单元测试软件使用指南(四)常见报错及解决方案与批量初始化的经验
单元测试·tessy
Iam傅红雪2 天前
mock数据,不使用springboot的单元测试
spring boot·后端·单元测试
月光code2 天前
SLF4J报错log4j又报错
单元测试·log4j
编程经验分享3 天前
Spring Boot 基于 Mockito 单元测试
spring boot·后端·单元测试
神即道 道法自然 如来3 天前
测试面试题:请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试
单元测试·集成测试
友恒3 天前
C#单元测试(一):用 NUnit 和 .NET Core 进行单元测试
单元测试·c#·.netcore
王伯爵4 天前
TDD(时分双工 Time Division Duplexing)和FDD(频分双工 Frequency Division Duplexing)
5g·信息与通信·信号处理·tdd
进击的横打4 天前
【车载开发系列】ParaSoft单元测试环境配置(四)
c语言·单元测试