> 文档中心 > OpenHarmony【兼容性测试套件】【分布式数据】测试套件编写历程

OpenHarmony【兼容性测试套件】【分布式数据】测试套件编写历程


分布式测试框架:

OpenHarmony【兼容性测试套件】【分布式数据】测试框架​​​​​​​

​​​​​​​

一、用例设计思路

sync接口介绍:

sync(deviceIds: string[], mode: SyncMode, delayMs?: number): void

参数:

deviceIds:同一组网环境下,需要同步的设备的deviceId列表。

mode:同步模式,一共有三种同步模式

名称

默认值

说明

PULL_ONLY

0

表示只能从远端拉取数据到本端。

PUSH_ONLY

1

表示只能从本端推送数据到对端。

PUSH_PULL

2

表示从本端推送数据到远端,然后从远端拉取数据到本端。

delayMs:可选参数,允许延时时间,单位:ms(毫秒)。

API9之后sync接口新增了参数Query,表示数据库的查询谓词条件,本文采用sync api7的接口,无需传入该参数

用例设计:

sync的功能是设备之间进行数据同步,同步之后将保持两端设备数据的一致性:

  • 包名一致,数据库名称一致可以进行同步
  • 安全等级为NO_LEVEL的数据库,其数据可以与S0-S4等级的任意数据库同步
  • 安全等级为S0-S4等级的数据库只可以与同安全等级或安全等级为NO_LEVEL的数据库之间进行数据同步
  • 设备默认安全等级为SL1,只可以进行安全等级为S1及以下的数据库进行数据同步
  • 客户端数据同步至服务端后,服务端针对该数据进行修改,之后可以将修改同步回客户端

因此可以针对这些特性设置不同的同步方案:

  1. 数据库名称不一致的情况下可否同步
  2. 不同安全等级的数据库之间的同步情况
  3. 本地数据同步至远端进行修改后再同步回本地

初次之外,还可以针对不同类型的数据进行用例设计

二、用例写作

操作步骤:

  1. 客户端和服务端分别创建数据库
  2. 服务端插入数据
  3. 数据同步
  4. 客户端查询数据

预期结果

  1. 客户端可以正常查询到数据

代码实现:

// 服务端创建数据库await remoteHelpers.getKvStore(TEST_STORE_ID,"NO_LEVEL",false)const options = {    createIfMissing : true,    encrypt : false,    backup : false,    autoSync : true,    kvStoreType : factory.KVStoreType.SINGLE_VERSION,    schema : '',    securityLevel : factory.SecurityLevel.NO_LEVEL,}// 客户端创建数据库await kvManager.getKVStore(TEST_STORE_ID,options).then((store) => {    kvStore = store    console.info(logTag + " get kvStore success")})// 服务端插入数据await remoteHelpers.kvPut(TEST_STRING_KEY, TEST_STRING_VALUE, "String")let result = undefined;// 数据同步kvStore.sync(syncDeviceIds, PULL)// 服务端查询数据kvStore.get(TEST_STRING_KEY,(err, data) => {    console.info(logTag + " Sync complete get data,key is " + TEST_STRING_KEY)    if(err != null){ console.info(logTag + " Sync complete get data error,err: " + err)    }else{ console.info(logTag + " Sycn complete get data success,result is: " + data) result = data    }})console.info(logTag + " get data finish,result is: " + result)expect(result).assertEqual(TEST_STRING_VALUE);

问题点:sync虽然是同步接口,但是数据同步是需要时间的,kvStore.sync(syncDeviceIds, PULL)在执行结束数据同步并未完成,所以此时开始在客户端查询很大概率会导致查询失败

改进一:在sync之后进行sleep等待

kvStore.sync(syncDeviceIds, PULL)await sleep(1000)// 服务端查询数据kvStore.get(TEST_STRING_KEY,(err, data) => {    console.info(logTag + " Sync complete get data,key is " + TEST_STRING_KEY)    if(err != null){ console.info(logTag + " Sync complete get data error,err: " + err)    }else{ console.info(logTag + " Sycn complete get data success,result is: " + data) result = data    }})

        这种方案比较简单,但是在设备在同步时由于受到硬件性能、网络波动等因素的影响,有可能会耗费大量时间,所以这个等待在遇到特殊情况时还是会导致用例失败,并未根本性的解决问题。而且这种方式对同步耗时无法精准把控,为保证用例失败会将等待时间设置较长,最终用例执行时间大大延长

改进二:加入syncComplete监听,在同步完成之后执行相应操作

on(event: 'syncComplete', syncCallback: Callback<Array>): void

该接口可以添加一个listener,在数据同步完成之后执行后续的回调函数,

function call(data) {    console.info("syncComplete: " + data);    kvStore.get(TEST_STRING_KEY,(err, data) => { console.info(logTag + " Sync complete get data,key is " + TEST_STRING_KEY) if(err != null){     console.info(logTag + " Sync complete get data error,err: " + err) }else{     console.info(logTag + " Sycn complete get data success,result is: " + data)     result = data } console.info(logTag + " get data finish,result is: " + result) expect(result).assertEqual(TEST_STRING_VALUE); kvStore.off("syncComplete",call)    })}kvStore.on("syncComplete",call)kvStore.sync(syncDeviceIds, PULL)

        因此将数据查询写在监听到同步完成的回调中,这样就可以保证在查询时数据同步一定是已经完成的状态。

        并且是在监听到同步完成的瞬间就开始查询了,无疑减少了同步操作之后的等待时间。在所有用例全部写成监听回调之后查询的方式之后,100条用例执行时间减少了100s左右。