redis在自动化测试中的运用
一、数据类型
redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)
string
设置值:set name dawei
获取值:get name
hash
设置值:hset userinfo name dawei age 18
获取值:hgetall userinfo #获取全部的数据
hget userinfo name
list
设置值:lpush teachers xiaom xiaobai xiaohon
获取值:lrange teachers
set
设置值:sadd language java python php
获取值:smember language
zset
设置值:zadd students 4 xueyuan4 3 xuanyuan3
获取值:zrange students 0 -1
二、python操作redis
1、下载redis库
pip install redis -i https://pipy.doubanio.com /simple
2、操作redis
用python操作redis时,需要先创建一个redis数据库连接对象,然后进行连接
import redis
pool = redis.ConnectionPool(
host = 'localhost',
port = 6379,
decode_responses = False
)
r = redis.Redis(connection_pool=pool)
3、创建一个类进行redis数据库的操作
需要先定义一个类,初始化方法是对连接进行定义,再定一个方法对redis进行操作,练习的项目是把java对象做了序列化存储后的数据,需要借助第三方库转成python中的对象,才能进行解析,javaobj-py3
#立即购买业务,存在redis里面的数据是一个字符串
import javaobj
import redis
class RedisUtil:
def __init__(self,host,pwd=None,port=6379,decode_responses=False):
self.pool = redis.ConnectionPool(
host=host,
password=pwd,
port=port,
decode_responses=decode_responses
)
self.r = redis.Redis(connection_pool=self.pool)
def get(self,key):
data_type = self.r.type(key)
if data_type == b"string" or data_type == "string":
return self.r.get(key)
elif data_type == b"hash" or data_type == "hash":
return self.r.hgetall(key)
elif data_type == b"list" or data_type == "list":
return self.r.lrange(key,0,-1)
elif data_type == b"set" or data_type == "set":
return self.r.smembers(key)
elif data_type == b"zset" or data_type == "zset":
return self.r.zrange(key,0,-1)
else:
raise BaseException(f"{key}的数据类型不支持")
if __name__ == '__main__':
redis_util = RedisUtil(
host='',
port=6379,
pwd='mtx',
decode_responses=False
)
res = redis_util.get('{BUY_NOW_ORIGIN_DATA_PREFIX}_69415')
print(res)
res_object = javaobj.loads(res)
print(res_object)
print(type(res_object))
buy_now_object = res_object[0]
#dir这个对象可以看buy_now_object有哪些信息
print(dir(buy_now_object))
sku_id = buy_now_object.skuId
num = buy_now_object.num
print(num,sku_id)
解析hash
#订单确认参数存储在redis数据库里面的是一个hash,对应python里面的字典,所以我们可以通过遍历的方式拿到里面的数据
#订单确认参数缓存数据解析,收货地址,支付方式,送货时间
res = redis_util.get("{CHECKOUT_PARAM_ID_PREFIX}_59")
print(type(res))
for key,value in res.items():
key = javaobj.loads(key)
if value == b"":
value = ""
else:
value = javaobj.loads(value)
if key == "paymentType":
print(dir(value))
value = value.constant
print(f"{key}:{value}")
三、运用在测试用例里面
import javaobj
from redis_study.redis_util import RedisUtil
from requests_study.mtxshop_apis import buy_now
class TestBuyNow:
def test_buy_now(self,buyer_login_fixture,redis_init):
resp = buy_now(sku_id=541,num=1)
assert resp.status_code == 200
# redis_util = RedisUtil(
# host='',
# port=6379,
# pwd='mtx',
# decode_responses=False
# )
res = redis_init.get("{BUY_NOW_ORIGIN_DATA_PREFIX}_69415")
res_object = javaobj.loads(res)
buy_now_object = res_object[0]
skuId = buy_now_object.skuId
num = buy_now_object.num
assert skuId == 541
assert num == 1
import javaobj
from redis_study.redis_util import RedisUtil
from requests_study.mtxshop_apis import set_addressid
class TestSetAddressId:
def test_set_addressId(self,buyer_login_fixture,redis_init):
resp = set_addressid(address_id=13290)
# redis_util = RedisUtil(
# host='',
# port=6379,
# pwd='mtx',
# decode_responses=False
# )
uid = buyer_login_fixture
res = redis_init.get(f"{{CHECKOUT_PARAM_ID_PREFIX}}_{uid}")
print(type(res))
for key,value in res.items():
key = javaobj.loads(key)
if value == b"":
value = ""
else:
value = javaobj.loads(value)
if key == "addressId":
assert value == 13290
四、很多用例都需要用到redis连接,可以在fixture里面进行前置处理
@pytest.fixture(scope='session',autouse=False)
def redis_init():
redis_util = RedisUtil(
host='',
port=6379,
pwd='mtx',
decode_responses=False
)
yield redis_util