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及以下的数据库进行数据同步
- 客户端数据同步至服务端后,服务端针对该数据进行修改,之后可以将修改同步回客户端
因此可以针对这些特性设置不同的同步方案:
- 数据库名称不一致的情况下可否同步
- 不同安全等级的数据库之间的同步情况
- 本地数据同步至远端进行修改后再同步回本地
初次之外,还可以针对不同类型的数据进行用例设计
二、用例写作
操作步骤:
- 客户端和服务端分别创建数据库
- 服务端插入数据
- 数据同步
- 客户端查询数据
预期结果
- 客户端可以正常查询到数据
代码实现:
// 服务端创建数据库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左右。