测试数据管理方法
为什么要做自动化测试数据管理
在游戏UI自动化测试用例中,经常用到的数据是登陆账号,如果是同一个账号,在本地运行是没有问题,但是游戏中一个账号同时在多个手机中登陆是互斥的,所有登陆相关的测试用例 ,如果在自动化测试平台运行的时候,数据的处理比较重要
数据的格式
目前采用的json格式来存储数据user_info.json
{ "data": [ { "user": "15022902641", "password": "123456", "status": "unuse" }, { "user": "13079931836", "password": "123456", "status": "unuse" } ] }
数据处理方法
在自动化测试平台,每次执行的UI自动化测试都是属于一个任务,每个任务,都是共享一份测试数据的。
+数据读取:需要获取数据的时候,先遍历数据,看是否有status状态为unuse的数据,如果有,则锁定json文件,读取数据,并将status置为use,解锁文件
+数据释放:数据读取完成后,释放数据,将status置为unuse
数据来源
目前数据来源有2个:
- 使用者平台输入账号
- 编写用例的人,在执行用例的时候使用到的账号
所以这里将数据文件在配置文件中保存路径,默认使用的编写用例的路径,如果在平台执行的话,则使用平台传的路径(平台中目前定义的路径为非必填)
代码实现
文件锁 filelock.py
调用锁定方法的时候,采用的with方法,这里定义一个上下文管理器
import os
import time
import errno
class FileLockException(Exception):
pass
class FileLock(object):
def __init__(self, file_name, timeout=60*2, delay=.05):
self.is_locked = False
self.lockfile = os.path.join(os.getcwd(), "%s.lock" % file_name)
print self.lockfile
self.file_name = file_name
self.timeout = timeout
self.delay = delay
def acquire(self):
start_time = time.time()
while True:
try:
#独占式打开文件
self.fd = os.open(self.lockfile, os.O_CREAT|os.O_EXCL|os.O_RDWR)
break;
except OSError as e:
if e.errno != errno.EEXIST:
raise
if (time.time() - start_time) >= self.timeout:
raise FileLockException("Timeout occured.")
time.sleep(self.delay)
self.is_locked = True
def release(self):
#关闭文件,删除文件
if self.is_locked:
os.close(self.fd)
os.unlink(self.lockfile)
self.is_locked = False
def __enter__(self):
if not self.is_locked:
self.acquire()
return self
def __exit__(self, type, value, traceback):
if self.is_locked:
self.release()
def __del__(self):
self.release()
解锁和锁定user_util.py
获取账号
def gimme_afree_account():
free_user = None
# 通过with方法,调用,获取锁
with FileLock(USER_DATA_PATH) as fl:
# work with the file as it is now locked
print("Lock acquired.")
fipath = unicode(fl.file_name)
# fd = open(fl.file_name)
fd = open(fipath)
user_data = fd.read()
fd.close()
user_account_array = json.loads(user_data, object_pairs_hook=OrderedDict)
users = user_account_array['data']
for u in users:
if u['status'] == 'unuse':
free_user = u.copy()
u['status'] = 'use'
break
if free_user:
with open(USER_DATA_PATH, 'w') as f:
f.write(json.dumps(user_account_array, indent=2))
实际用例中调用
def get_user(self):
global user_info
user_info = user_util.gimme_afree_account()
while user_info ==None:
time.sleep(5)
user_info = user_util.gimme_afree_account()
return user_info
浙公网安备 33010602011771号