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的功能是设备之间进行数据同步,同步之后将保持两端设备数据的一致性:
因此可以针对这些特性设置不同的同步方案:
初次之外,还可以针对不同类型的数据进行用例设计
操作步骤:
预期结果
代码实现:
// 服务端创建数据库
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
该接口可以添加一个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左右。