跟著小白一起學(xué)鴻蒙(三)—手寫一個(gè)測(cè)試用例
??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??
開源鴻蒙測(cè)試初識(shí)
這一節(jié)我們著重查看如何編寫測(cè)試套件,編譯并測(cè)試。
1、目錄結(jié)構(gòu)
//目錄位置:[鴻蒙代碼]/test
.
├── arkXtest //js測(cè)試框架和ui測(cè)試框架
│ ├── jsunit
│ └── uitest
├── developertest //開發(fā)測(cè)試組件
│ ├── aw
│ ├── config
│ ├── examples
│ ├── src
│ └── third_party
├── wukong //穩(wěn)定性測(cè)試工具,冒煙測(cè)試
│ ├── common
│ ├── component_event
│ ├── input_factory
│ ├── report
│ ├── shell_command
│ └── test_flow
├── xdevice //測(cè)試框架核心,提供執(zhí)行用例的相關(guān)服務(wù)
│ ├── BUILD.gn
│ ├── extension
│ ├── src
└── xts //兼容性測(cè)試套件
├── acts //應(yīng)用兼容性測(cè)試套件
├── dcts //分布式兼容性測(cè)試套件
├── hats //硬件兼容性測(cè)試套件
└── tools
2、測(cè)試套件結(jié)構(gòu)
我們選取比較簡(jiǎn)單的應(yīng)用兼容性測(cè)試套件為例:
.
├── BUILD.gn //編譯腳本
├── comm.gni //編譯配置
├── src
│ ├── ActsLibuvTestSuite.cpp //具體測(cè)試套件源文件
│ ├── ActsLibuvTestSuite.h //具體測(cè)試套件頭文件
└── Test.json //測(cè)試套件執(zhí)行配置
- 測(cè)試套件編譯腳本-BUILD.gnimport("http://test/xts/tools/build/suite.gni")。
? import("http://test/xts/acts/graphic/libuv/comm.gni")
ohos_moduletest_suite("ActsLibuvTestSuite”) {
sources = [
"src/ActsLibuvTestSuite.cpp",
]
include_dirs = [ "http://test/xts/acts/graphic/libuv/src" ]
cflags = [ "-Wno-error" ]}
BUILD.gn主要編寫格式如下:
sources = [
"源文件",
]
include_dirs = [
"頭文件目錄",
],
deps = [
"依賴庫路徑:依賴庫名稱",
]
configs = [
"配置文件路徑:配置文件名稱"
]
具體解釋如下:
- sources:對(duì)應(yīng)的就是需要編譯的源文件。
- include_dirs:對(duì)應(yīng)的就是編譯中的頭文件的路徑。
- deps:對(duì)應(yīng)的此程序依賴的其他的庫,比如引入hilog,則增加 “//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog”。
- configs: 對(duì)應(yīng)編譯的flags或者宏定義,如:
config("XX_config") {
cflags_cc = [
"-Wno-conversion",
"-Wno-unused-function",
]
defines = deqp_common_defines
defines += [
"_XOPEN_SOURCE=600"
]
}
編譯配置文件-comm.gni。
import("http://test/xts/tools/build/suite.gni")
common_include = [
"http://test/xts/acts/graphic/libuv/src",
]
common_depends = [
"http://third_party/libuv:uv_static",
]
編譯配置文件可以將共同的BUILD.gn內(nèi)容放置在此,供其他gn文件或者gni文件使用。
具體測(cè)試套件源文件:
#include <gtest/gtest.h>
#include "ActsLibuvTestSuite.h"
namespace OHOS {
using namespace std;
using namespace testing::ext;
// Preset action of the test suite, which is executed before the first test case
void ActsLibuvTestSuite::SetUpTestCase(void)
{
}
// Test suite cleanup action, which is executed after the last test case
void ActsLibuvTestSuite::TearDownTestCase(void)
{
}
// Preset action of the test case
void ActsLibuvTestSuite::SetUp()
{
}
// Cleanup action of the test case
void ActsLibuvTestSuite::TearDown()
{
}
HWTEST_F(ActsLibuvTestSuite, testLibuvTestCase001, Function | MediumTest | Level2)
{
printf("------start ActsLibuvTestSuite------\n");
EXPECT_TRUE(true);
printf("------end ActsLibuvTestSuite------\n");
}
HWTEST_F(ActsLibuvTestSuite, testLibuvTestCase002, Function | MediumTest | Level2)
{
printf("------start ActsLibuvTestSuite------\n");
EXPECT_TRUE(false);
printf("------end ActsLibuvTestSuite------\n");
}
}
我們選取的此測(cè)試套件是模塊測(cè)試套件,所以使用gtest測(cè)試框架進(jìn)行測(cè)試。
gtest測(cè)試框架采用TestSuite + TestCase的組成方式,所以我們定義了ActsLibuvTestSuite作為測(cè)試Suite,然后添加兩個(gè)testLibuvTestCase001,testLibuvTestCase002作為測(cè)試Case。
判斷一個(gè)測(cè)試是否通過可以用EXPECT_TRUE(true),EXPECT_TRUE(false)進(jìn)行驗(yàn)證,其他還可以使用的斷言如下:
- EXPECT_TRUE(condition)
- EXPECT_FALSE(condition)
- EXPECT_EQ(val1, val2)
- EXPECT_NE(val1, val2)
- EXPECT_LE(val1, val2)
- EXPECT_LT(val1, val2)
- EXPECT_GE(val1, val2)
- EXPECT_GT(val1, val2)
- EXPECT_STREQ(val1, val2)
- EXPECT_STRNE(s1, s2)
- EXPECT_STRCASEEQ(s1, s2)
- EXPECT_STRCASENE(s1, s2)
- EXPECT_FLOAT_EQ(val1, val2)
- EXPECT_DOUBLE_EQ(val1, val2)
具體測(cè)試套件頭文件:
#ifndef LIBUV_TESTCASE_H
#define LIBUV_TESTCASE_H
#include <gtest/gtest.h>
namespace OHOS {
class ActsLibuvTestSuite : public testing::Test {
public:
protected:
// Preset action of the test suite, which is executed before the first test case
static void SetUpTestCase(void);
// Test suite cleanup action, which is executed after the last test case
static void TearDownTestCase(void);
// Preset action of the test case
virtual void SetUp();
// Cleanup action of the test case
virtual void TearDown();
};
} // namespace OHOS
#endif // LIBUV_TESTCASE_H
測(cè)試套件執(zhí)行配置文件:
{
"description": "Config for ActsLibuvTestSuite test cases",
"driver": {
"module-name": "ActsLibuvTestSuite",
"native-test-timeout": "120000",
"native-test-device-path": "/data/local/tmp",
"runtime-hint": "100s",
"type": "CppTest"
},
"kits": [
{
"pre-push" : [
],
"post-push" : [
"chmod -R 777 /data/local/tmp/*"
],
"push": [
"ActsLibuvTestSuite->/data/local/tmp/ActsLibuvTestSuite"
],
"type": "PushKit"
},
{
"type": "ShellKit",
"run-command": [
"remount",
"mkdir /data/test",
"cd /data/local/tmp"
]
}
]
}
測(cè)試套件配置文件是伴隨測(cè)試套件運(yùn)行的文件,在執(zhí)行測(cè)試套件的時(shí)候,xdevice根據(jù)配置文件的具體命令執(zhí)行測(cè)試用例,詳細(xì)說明如下:
- “description”:測(cè)試套件的文字說明
- “driver”: 測(cè)試套件執(zhí)行驅(qū)動(dòng)配置
- “module-name”: 配置測(cè)試套件名稱
- “native-test-timeout”: 套件超時(shí)設(shè)置
- “native-test-device-path”: 套件運(yùn)行目錄
- “runtime-hint”: 套件執(zhí)行時(shí)間預(yù)估
- “type”: 套件類型
- “kits”: 測(cè)試套件工具配置
- “PushKit”:傳送工具
- “pre-push”:從上位機(jī)推送到設(shè)備前的準(zhǔn)備工作;
- “push”: 從上位機(jī)推送到設(shè)備的動(dòng)作;
- “post-push”: 上位機(jī)推送后需要做的動(dòng)作;
- “ShellKit”:運(yùn)行工具
- “run-command”: 執(zhí)行測(cè)試套件前需要配置的命令
3、編譯測(cè)試套件
上面寫的測(cè)試用例需要有一個(gè)入口進(jìn)行加載,在此文章我們選取graphic的gn進(jìn)行依賴添加路徑:
路徑:test/xts/acts/graphic/BUILD.gn
import("http://build/ohos_var.gni")
group("graphic") {
testonly = true
if (is_standard_system) {
deps = [
"webGL:webGL_hap_test",
"windowStage:ActsWindowStageTest",
"windowstandard:window_hap_test",
#增加下面這行引入依賴
"libuv:ActsLibuvTestSuite",
]
} else {
deps = [
"appaccount:appaccount_hap",
"osaccount:osaccount_hap",
]
}
}
同**《#跟著小白一起學(xué)鴻蒙# [一]運(yùn)行OpenHarmony》**一樣,在鴻蒙代碼根目錄執(zhí)行以下命令:
./build.sh --product-name rk3568 --gn-args build_xts=true --build-target "acts" --gn-args is_standard_system=true
深入技巧:我們會(huì)發(fā)現(xiàn)每次編譯都會(huì)消耗大量時(shí)間,這里我們淺論下鴻蒙的編譯方式。
- build.sh: 源碼路徑下的編譯腳本,其主要目標(biāo)就是找vender目錄和productdefine目錄下對(duì)應(yīng)的編譯目標(biāo),然后對(duì)其目標(biāo)進(jìn)行g(shù)n編譯。
- gn編譯:根據(jù)目標(biāo)的build.gn文件生成build.ninja文件,總的build.ninja位于out/product目錄下。
- ninja:根據(jù)目標(biāo)的build.ninja編譯生成產(chǎn)出問題件。
總結(jié):所以如果不改動(dòng)gn文件,但是改動(dòng)源文件或者頭文件的情況下,我們可以不用build.sh腳本生成代碼,而是直接用ninja命令進(jìn)行編譯,如 ninja -C out/rk3568 uv_static。
4、執(zhí)行測(cè)試套件
同**《#跟著小白一起學(xué)鴻蒙# [一]運(yùn)行OpenHarmony》**一樣,在鴻蒙代碼根目錄/out/rk3568/suites/acts執(zhí)行以下命令:
//此命令的前提是:
//1, 開發(fā)板和上位機(jī)進(jìn)行建立連接,沒有配置網(wǎng)絡(luò)的時(shí)候建議usb連接
//上位機(jī)執(zhí)行:hdc_std shell (此命令可以進(jìn)入開發(fā)板的shell,進(jìn)行后續(xù)命令輸入)
//2, 開發(fā)板的hdcd服務(wù)配置完協(xié)議類型和端口
//板上執(zhí)行:param set persist.hdc.mode all
//板上執(zhí)行:param set persist.hdc.port 10178
//板上執(zhí)行:pkill hdcd (用來重啟hdcd以便使用新配置)
//3, 開發(fā)板配置ip地址,并確認(rèn)網(wǎng)絡(luò)
//板上查看ip地址命令:ifconfig
//如果沒有eth0則需要執(zhí)行: ifconfig eth0 up
//如果有eth0則可以配置ip地址:ifconfig eth0 192.168.137.105
//檢驗(yàn)網(wǎng)絡(luò)是否通暢:ping 上位機(jī)IP地址
python -m xdevice
5、查看測(cè)試套件執(zhí)行結(jié)果
在鴻蒙代碼根目錄/out/rk3568/suites/acts/reports內(nèi)可以看到最新時(shí)間戳的目錄即為剛才運(yùn)行的測(cè)試記錄。
.
├── 2022-08-16-14-15-25.zip
├── details_report.html //詳細(xì)測(cè)試用例
├── log
│ ├── device_hilog_192.168.137.105_10178.log //系統(tǒng)hilog日志
│ └── task_log.log //測(cè)試用例輸出日志
├── result
│ └── ActsLibuvTestSuite.xml //測(cè)試結(jié)果匯總
├── summary.ini
├── summary_report.hash
├── summary_report.html //測(cè)試報(bào)告大綱
├── summary_report.xml
測(cè)試報(bào)告。
測(cè)試報(bào)告詳情。