zoukankan      html  css  js  c++  java
  • 一个自动化框架demo

      之前写过的一个demo,是目前构思框架的极简版本的实现。下面简单介绍下这个demo。

      这是一个基于UI界面的自动化框架,使用的语言是python,实现了核心功能,但还存在不少的限制。

    一、界面说明

        

    pupils是我为工程起的名字,整个界面分为:

      用例列表:仅支持根目录、一级目录和case节点。 

      Unit列表:基本功能点,每个用例都是由多个功能点组合成的,可根据业务需要动态添加。

      Unit说明:每个功能点都有一个说明,方便他人使用。

      before/test/after:共同组成了case的功能,每个模块均为多个unit的组合,通过拖放的方式实现,不同的unit之间可以传递参数。其流程类似testng的@beforetest/@test/@aftertest,区别在于,pupil的after即使某个功能执行失败,其之后的功能也会执行下

      编辑Unit:在将unit拖放到case后,有的case需要输入参数。在before/test/after中,每选中一个unit后,此处都会展示整个unit对应的参数,有默认值,用户也可以定制化修改。

      日志输出:实时输出执行日志。日志本身存放于文件中,此处另起一个线程,实时读取文件的内容,并打印日志。

      其他:右下角有一系列的用例说明,都是取自数据库。

    二、使用方法

      1、创建目录/用例:在用例列表区域,右键->新建目录/新建用例。输入名字即可。 

      2、设计case:在用例列表区域,左键选中需要编辑的case,before/test/after会现实选中case的内容;在unit列表区域,选中需要的功能,拖拽到三个区域之一即可,该功能会自动放置在最下面,可通过上移/下移改变位置;左键选中该unit,在最右侧编辑unit的区域,设置参数;点击其他 case,弹窗提示是否保存,选是即可。

      注:case中,unit之间可以进行参数传递。某个unit需要输出参数,用&VAR的方式表示(&符号不必须,但建议使用,这样可以让其他人知道是出参;VAR为变量名,随便取,只要后面用到时和此处设置的一样即可),比如HTTP请求返回json串,即可使用&json表示返回的内容。某个unit的输入依赖之前unit的输出,则可用$VAR表示($必须,框架读入参时,如果遇到$符号,则自动根据$后的名字获取对应的值),比如校验json串中的数据,则入参为$json,这样即可获取上个unit获取的HTTP响应的内容。还有一种特殊的变量,以 EV_ 开头。这些变量称为框架的环境变量,该变量以json的格式存放在本地,满足每个用户的差异化需求;EV_VAR为key,框架在启动时会先读取变量文件,读取到EV_VAR时,会自动找到对应的value,比如每个人连的测试环境IP等。

      3、 设计unit。如果要增加一个unit,需要修改两处:首先在工程目录下的pupil/utils/definition/UnitDefinition.xml中增加unit的声明,声明功能的名称、对应的文件等:

    1 <group class="基本">
    2         <unit name="设置单个变量" desc="设置单个变量" ref="Common.py" func="set_single_variable">
    3             <param name="变量名(out)" nameInner="varName" nullable="false" desc="即将被赋值的变量名">&amp;foo</param>
    4             <param name="变量类型" nameInner="varType" nullable="false" desc="变量类型,目前只支持string,之后会扩展list、dict、json对象、xml对象等">str</param>
    5             <param name="变量值" nameInner="varValue" nullable="false" desc="给变量名赋予的值,对字符串没有格式要求">bar</param>
    6         </unit>
    7 </group>

    之后在工程目录的pupil/develop/中对应的文件中,进行实现:

     1 # 设置单个变量
     2     def set_single_variable(self):
     3         var_key = self.__tools.get_input_value('varName')
     4         var_type = self.__tools.get_input_value('varType')
     5         var_value = self.__tools.get_input_value('varValue')
     6 
     7         if var_key is None or var_type is None or var_value is None:
     8             logging.error('设置单个变量:必填参数不完整,功能无法执行,请处理。')
     9             raise Exception('unit set_single_variable无法执行')
    10         self.__tools.set_output_value(var_key, var_value)

      4、 case执行:右键用例名称->执行 即可。

    三、设计思路

      1、用例列表/用例说明:放在数据库标tb_case_mng、tb_cases中存储,创建时自动生成caseid、创建者等。用例结构在tb_case_mng中,用例细节在tb_cases中。

      2、Unit列表/unit说明:本地XML文件定义。

      3、用例内容:存放在tb_cases中。每次修改都是一次数据库的更新。

      4、用例执行:采用反射的方式,在新增unit时,已经配置该unit对应的代码块,在执行时,只需要根据配置找到代码即可。在执行时,会先创建一个Tool类的单例,对象中有一个dict,用来存放各种输入输出变量,比如设置HTTP响应为&json时,就会将响应在dict中存放成{"json":"{a=1,b=2}"}的格式;在使用$json时,直接从字典中获取key为json的value。设置变量和获取变量是使用的方法分别为 Tool类中的get_inpu_value  和 set_output_value成员方法。

    四、局限性

       1、执行环境

      所有代码逻辑在本机,所以执行逻辑也只能在本机上,不够灵活。后续考虑做成bs模式,将所有代码从本机移到服务器,代码执行做成rpc调用的模式。

      2、数据同步

      除了远端数据库作为数据共享中心外,本机上还有若干配置文件,这些配置文件的不同步会造成本机unit、EV变量的不同步,很容易引起用例失败,后续考虑放在服务端统一管理。

      3、数据校验

      没办法做基于网状结构的执行结果校验,后面想办法增加此功能。

    写的比较匆忙,暂时也只想起来这么多。

  • 相关阅读:
    一次简单的数据库追溯
    CI(-)框架结构
    网易有毛病,我的账号被锁了,去解锁时候又几把提示不成功,浪费劳资感情啊
    指定360浏览器内核渲染页面
    JS 拼凑字符串
    jQuery.ajax() datatype:“json" 转换失败
    html <base/>标签
    使用JExcel导出excel文件
    Java web 文件下载
    jQuery ajax 传递数组到struts2
  • 原文地址:https://www.cnblogs.com/zxray/p/8048111.html
Copyright © 2011-2022 走看看