发布新日志

  • json schema 测试

    2017-10-24 08:09:53

        最近在开发接口自动化测试工具时,发现restFull接口测试工具中提供了json schema的测试,特意去了解json schema。

        Json schema 于json 类似于xml schema 于 xml,用于定义如何基于 JSON 格式描述 JSON 数据结构的规范,从而可利用此 数据校验、文档生成和接口数据交互控制等。如果接口返回的数据格式是json,那么我们就可以创建json schema来校验接口返回的数据是否满足要求,可校验必需字段是否返回,字段类型是否正确,值是否满足要求如大小、范围或要求包含某些值等。如此,我们便可实现大部分接口测试用例。

        json schema定义的主要关键字如下( draft 4版本):
    关键字描述
    $schemaThe $schema 关键字状态,这种模式被写入草案V4规范。
    title将使用此架构提供一个标题
    description架构的一点描述
    type我们 JSON 数据类型关键字定义的第一个约束条件:它必须是一个JSON对象
    properties定义各个键和它们的值类型,最小和最大值中要使用JSON文件
    required这样可以使所需的属性的列表
    minimum这是约束的值,并代表可接受的最小值
    exclusiveMinimum如果“exclusiveMinimum”的存在,并且具有布尔值true的实例是有效的,如果它是严格的最低限度的值
    maximum这是约束的值被提上表示可接受的最大值
    exclusiveMaximum如果“exclusiveMaximum”的存在,并且具有布尔值true的实例是有效的,如果它是严格的值小于“最大”。
    multipleOf数值实例有效反对“multipleOf”分工的实例此关键字的值,如果结果是一个整数。
    maxLength字符串实例的长度被定义为字符的最大数目
    minLength字符串实例的长度被定义为字符的最小数目
    patternString实例被认为是有效的,如果正则表达式匹配成功实例

        json schema的经典样例如下:
    {
        "$schema": "http://json-schema.org/draft-04/schema#",

        "title": "Product",

        "description": "A product from Acme's catalog",

        "type": "object",

        "properties": {

            "id": {

                "description": "The unique identifier for a product",

                "type": "integer"

            },

            "name": {

                "description": "Name of the product",

                "type": "string"

            },

            "price": {

                "type": "number",

                "minimum": 0,

                "exclusiveMinimum": true

            }

        },
        "required": ["id", "name", "price"]}

        json schema 校验json字符串是否满足要求,则是通过校验关键字去校验,如required,是否必需,maxItems用于校验数组的大小等,详细请见https://datatracker.ietf.org。所以我们要创建好json schema才能根据要求去校验数据,https://jsonschema.net/#/editor可用于生成json schema不过因google被墙可能无法正常使用,亦可搜索其它生成工具。
  • 接口自动化测试工具研发

    2017-10-13 08:07:58

       此前做接口自动化测试用了不少工具,如selenium、robotframwrok+httplib、soapUI、jmeter等,总是在脚本与数据分离、脚本维护、前置数据及结果校验等问题上不能如意。为此,决定自己研发一个接口自动化测试工具以更好地解决以上问题,并实现测试配置的方法实现可以不同环境运行。

       工具主要分前端界面与执行引擎。前端界面采用BS架构,在浏览器上创建项目、接口定义、测试数据、测试配置以及执行计划等,后端主要是执行引擎,可基于HttpClient、okHttp、rest-assured等封装好的http请求组件(不用自己造轮子,而且在多线程处理及性能上往往不如封装好的组件)。执行时,执行引擎读取测试接口及数据构造http请求,然后再根据测试数据中配置的检查点进行检查,从而完成整个测试过程。

       此时,工具的基本框架已完成,解决脚本与数据分离、脚本维护(只需维护接口定义)问题。前置数据即是用例执行前的初始化动作,目前设计是通过三种方式实现。一、通用数据如账号密码那些则通过自定义的配置项传入,并缓存起来供测试过程中调用(如脚本中通过?{#client_id}方式调用),从而实现在不同环境中运行;二、自定义函数,此主要是与业务相关的,如接口测试在审批某个流程,此前的流程在初始化方法中调用自定义函数完成初始化操作或返回数据给测试用例。函数可实现某个业务操作或直接操作数据库(非测试环境可能不允许),但函数都需要在工具中定义(也曾考虑在前端编写函数存入数据库,执行时再调用,但考虑到函数需要调试,直接在工具中编写调试更方便,由此则出现工具与业务混杂的问题。当然也可将业务相关的迁移到另外一个工具中由测试工具调用,没有将工具产品化的计划就不折腾了)。三、执行其它测试用例作为初始化动作或获取相关数据。 目前三种方式基本可解决前置数据或初始化操作的问题,但测试数据中可能会较多的函数调用或参数调用,没那么直观,而且自定义函数需要一定的编码功能才能完成。

       结果校验也有两种方式实现。一、基本校验:如校验http返回状态码,校验返回数据是否存在(如果返回的是json字符串,建议基于rest-assured 实现执行引擎,此组件已封装有不少校验);二、自定义函数:可通过自定义函数进行业务检查或直接查询数据库方式进行验证,如果返回的是json字符串,可实现校验json schema,这个非常方便校验返回的字段及类型。

       此外,再加上查看测试报告、定时执行以及发送测试结果等辅助功能,工具基本成型。目前工具在试用完善中,待实践验证后或可开源出来供大家参考。
  • 使用VBS直接读取loadrunner 结果MDB文件

    2011-04-07 17:09:14

    Dim Conn

    Dim Rst

    set Conn=CreateObject("Adodb.Connection")
    Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\Work\test\result\gdkkx\运行数据查询\运行数据查询.mdb"
    Set Rst=CreateObject("Adodb.RecordSet")

    Rst.Open "Select * from Result",Conn

    Do while not Rst.EOF:
      scenario  = Rst.Fields("Scenario Name").Value
      name      = Rst.Fields("Result Name").Value
      tz        = Rst.Fields("Time Zone").Value / 3600
      startTime = Rst.Fields("Start Time").Value
      endTime   = Rst.Fields("Result End Time").Value
      Rst.MoveNext

    Loop

    Wscript.Echo " "
    Wscript.Echo "  Scenario: %s " & scenario
    Wscript.Echo "    Run ID: %s " &  name
    Wscript.Echo "        TZ: %s " &  tz
    Wscript.Echo "Start Time: %s " &  time.asctime(time.localtime(startTime))
    Wscript.Echo "  End Time: %s " &  time.asctime(time.localtime(endTime))

  • SVN 使用介绍

    2008-10-29 23:11:10

       SVN(SubVersion)是一个自由/开源的版本控制系统。Subversion 的版本库可以通过网络访问,从而使用户可以在不同的电脑上进行操作。从某种程度上来说,允许用户在各自的空间里修改和管理同一组数据可以促进团队协作。因为修改不再是单线进行(单线进行也就是必须一个一个进行),开发进度会进展迅速。于我们测试而言,我们常用它来对测试脚本和各种测试文档进行版本控制。是一个非常好的版本控制系统。
       SVN有服务端与客户端,都需要安装相应的软件。其中服务端现在有可视化的版本及非可视化的版本,客户端则有系统中直接安装的及各类支持插件如Ecplist svn插件。现介绍相关操作如下(基于非可视化服务端及非插件式客户端):
    1>下载安装:开源的免费下载,安装较为容易不再介绍。
    2>建立版本库(Repository)
    运行Subversion服务器需要首先要建立一个版本库(Repository),可以看作服务器上存放数据的数据库,在安装了Subversion服务器之后,可以直接运行,如:svnadmin create E:\svndemo\repository
    就会在目录E:\svndemo\repository下创建一个版本库。

    我们也可以使用TortoiseSVN图形化的完成这一步:
    在目录E:\svndemo\repository下"右键->TortoiseSVN->Create Repository here...“, 然后可以选择版本库模式, 这里使用默认即可, 然后就创建了一系列目录和文件。

    3> 配置用户和权限
    来到E:\svndemo\repository\conf目录,修改svnserve.conf:
    # [general]
    # password-db = passwd
    改为:
    [general]
    password-db = passwd 然后修改同目录的passwd文件,去掉下面三行的注释:
    # [users]
    # harry = harryssecret
    # sally = sallyssecret
    最后变成:
    [users]
    harry = harryssecret
    sally = sallyssecret

    4> 运行独立服务器
    在任意目录下运行:
    svnserve -d -r E:\svndemo\repository 我们的服务器程序就已经启动了。注意不要关闭命令行窗口,关闭窗口也会把svnserve停止。

    5> 初始化导入
    来到我们想要导入的项目根目录,在这个例子里是E:\svndemo\initproject,目录下有一个readme.txt文件:
    右键->TortoiseSVN->Import...
    URL of repository输入“svn://localhost/”
    ok
    完成之后目录没有任何变化,如果没有报错,数据就已经全部导入到了我们刚才定义的版本库中。

    需要注意的是,这一步操作可以完全在另一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22/”。

    6> 基本客户端操作
    取出版本库到一个工作拷贝:
    来到任意空目录下,在本例中是E:\svndemo\wc1,运行右键->Checkout,在URL of repository中输入svn://localhost/,这样我们就得到了一份工作拷贝。
    在工作拷贝中作出修改并提交:
    打开readme.txt,作出修改,然后右键->Commit...,这样我们就把修改提交到了版本库,我们可以运行。
    察看所作的修改:
    readme.txt上右键->TortoiseSVN->Show Log,这样我们就可以看到我们对这个文件所有的提交。在版本1上右键->Compare with working copy,我们可以比较工作拷贝的文件和版本1的区别。
Open Toolbar