自动化测试平台化[v1.0.0][事件的设计与实现]

   日期:2020-08-04     浏览:96    评论:0    
核心提示:事件的基类提供了基本的事件描述及事件逻辑,提供给测试开发人员继承并实现事件的具体逻辑,通常情况下事件描述包括几个方面,事件名称、事件的参数、事件的类型、相关的执行参数、是否需要锁、事件的结果,此外事件还应具备三个能力,事件预处理、事件执行、事件清理

事件描述的基类

事件的基类提供了基本的事件描述及事件逻辑,提供给测试开发人员继承并实现事件的具体逻辑,通常情况下事件描述包括几个方面,事件名称、事件的参数、事件的类型、相关的执行参数、是否需要锁、事件的结果,此外事件还应具备三个能力,事件预处理、事件执行、事件清理

  • 事件名称:用于描述事件的具体行为,它需要测试开发者在实现自己的事件时被重载,应直接使用类变量
  • 事件的参数:通常是测试资源的实例,事件往往都是基于一定的测试对象的,所以需要通过事件参数将测试资源的实例传递给事件
  • 事件类型:一类事件是背景事件,用于模拟一些长时间固定或随机间隔的一些事件;另一类是非背景事件,一般有固定的执行次数,往往用于某个具体的测试点的验证
  • 相关的执行参数:实际执行事件时的参数,例如时间间隔、执行次数等
  • 是否需要锁:对于同一个事件而言,是否需要锁不一定是由这个事件本身决定的,而是执行者决定的,相同的事件既可以在无竞争的环境下执行,也可以在有竞争的环境下执行,因此这个参数必须是可配的
  • 事件的结果:既可以由开发者在实现事件的时候指定,也可以在执行事件流的过程中更改事件的状态
  • 事件预处理:提供给测试开发者实现事件预设条件的检查机制
  • 事件执行:提供给测试开发者重载并实现事件的具体逻辑
  • 事件的清理:事件执行后,不管事件执行是否正常,都需要执行清理操作

代码实例

""" 事件驱动 事件的类定义 """

from abc import ABCMeta, abstractmethod
from core.result.logger import logger
from threading import Lock
from enum import Enum


class EventStatus(Enum):
	""" EventStatus枚举用于描述事件的执行状态 """
    IDlE = "Idle"
    WAITING = "Waiting"
    RUNNING = "Running"
    SUCCESS = "Success"
    FAIL = "Failure"
    ERROR = "Error"


class EventBase(metaclass=ABCMeta):
    """ 事件的基类 """
    # 类变量,因为事件是通过实例化来工作的,所以通过类变量可以在各个实例之间使用一个锁对象
    event_lock = Lock() 
    name = ""

    def __init__(self, description="", **kwargs):
        self.description = description
        self.arguments = dict()
        self.job = None # 用来保存APScheduler生成的job对象
        self.interval = kwargs.get("interval", 0)
        self.result = EventStatus.IDlE
        self.back_ground = False
        self.loop_count = 0
        self.log = kwargs.get("log", logger.register(f"Event_{self.name}"))
        self.need_lock = False
        self.reporter = None

    def run(self):
    	""" run方法会被注册在APScheduler的job中,首先执行pre_check()方法,判断预处理方法是否完成 然后执行action抽象方法,测试开发者通过实现action方法来实现事件的逻辑 final方法用于事件执行的清理,测试开发者可以对其进行重载 """
        if self.need_lock:
            self.lock()
        try:
            if not self.pre_check():
                self.log.error("Pre-check failed")
                self.result = EventStatus.FAIL
                return
            self.action()
        except Exception as ex:
            self.result = EventStatus.ERROR
            self.log.exception(ex)
        finally:
            try:
                self.final()
            except Exception as ex:
                self.log.exception(ex)
            if self.need_lock:
                self.unlock()

    @abstractmethod
    def action(self):
        pass

    def pre_check(self):
        return True

    def final(self):
        pass

    def lock(self):
        self.__class__.event_lock.acquire()

    def unlock(self):
        self.__class__.event_lock.release()

event_lock是类变量

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服