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<[string, number]>>): 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左右。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值