测试数据管理方法

为什么要做自动化测试数据管理

在游戏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

posted on 2017-08-03 10:38  yanzilove  阅读(226)  评论(0)    收藏  举报