最近在做接口自动化测试,采用的是Robot Framework的框架,个人觉得这个框架很鸡肋,还不如直接使用Python来的巧,不过它也有好的地方,就是支持中文关键字,也就是说只要有人封装好了方法,不懂代码的人员也可做自动化测试哈。

    其实接口的自动化测试并不复杂,我在这里不赘述底层的实现原理,直接上一个例子给大家看看,接口自动化测试说到底就是让你的程序自动发出请求,先看看的请求体,请求方式是post,

[
    {
        "levelType": 1,
        "cnName": "tag_auto",
        "enName": "yuany",
        "tagUsage": "yuany",
        "description": "yuany",
        "compliance": 1,
        "categoryId": "354720323118071809",
        "dataType": null,
        "validValues": null,
        "updatePeriod": null,
        "standardValues": null,
        "calcType": 1,
        "computeLogic": null,
        "filterRule": null,
        "defineMethod": 1,
        "sql": null,
        "factTagRelations": [
            {
                "relationCnName": "商品总表",
                "relationEnName": "sum_goods",
                "relationType": "dim",
                "sourceTableName": "edw_dim_sum_goods",
                "sourceTableId": "347432694500589568",
                "sourceFieldName": "goodno",
                "sourceFieldType": "string"
            }
        ],
        "businessObjectId": "354720317573201920"
    }
]

    这个接口是创建一个标签,业务层面是可以批量创建标签的,所以最外层是数组[],如果数组中又多个字典元素,就可以批量创建标签了。

    再来谈谈怎么样修改这个请求体的内容呢,那我们为什么要修改呢?如果不修改,意味着你每次发的请求都是一样的,创建的标签也就是一样的了,业务层面可能会校验标签的名称不能重复等等,于是你就会失败,改变其实就是要解决依赖,让你的自动化程序独立,尽量不依赖其它的接口和数据,在这个接口里面我们需要解决的依赖主要有:

            第一类: cnName, enName,tagUsage,description,这一类是需要你每次都填写的,直接用python自动生成随机字符串即可,

            第二类:categoryId,businessObjectId,第一个是标签层级,第二个是实体ID,业务需求是,标签需要建在某一个实体的某一级标签层级下,就是说你先要确定标签要创建的路径,思路是这样的,先确定实体,比如就创建在最近更新的实体下,这里就可以用sql查出这个实体ID,在根据实体ID查出该实体有哪些标签层级,再确定一个层级,比如说最近创建的层级,于是乎想要的两个数据都通过sql找到了,

            第三类:

"factTagRelations": [
            {
                "relationCnName": "商品总表",
                "relationEnName": "sum_goods",
                "relationType": "dim",
                "sourceTableName": "edw_dim_sum_goods",
                "sourceTableId": "347432694500589568",
                "sourceFieldName": "goodno",
                "sourceFieldType": "string"
            }
        ],

relation开头的三个通过接口获得的,source开头的四个是通过另一个接口获得的,这两组数据都只能通过接口获得,用sql查询是不方便的,涉及微服务之间的跨库查询且逻辑复杂,所以我们调用接口,然后解析接口返回的数据,再取出我们想要的数据就好了,其它的字段可不填,或者默认值就好了。

    重中之重就是修改请求体,可以这样做,把需要修改的字段放在一个列表中,如KK=["categoryId","businessObjectId","relationCnName","relationEnName","relationType","sourceTableName", "sourceTableId","sourceFieldName", "sourceFieldType"],把对应的值放在另外一个列表中,顺序要对准,VV=["1","2","3","4","5","6","7","8","9"],然后用python定义一个函数去循环修改这个字典至所有字段修改完成,这样每次发出去的请求都是不一样的,最后来看一下该请求对应的python字典,

"新建标签":[{
	"levelType": 1,
	"cnName": "tag_auto"+strTime,
	"enName": "yuany"+strTime,
	"tagUsage": "yuany"+strTime,
	"description": "yuany"+strTime,
	"compliance": 1,
	"categoryId": "354720323118071809",
	"dataType": None,
	"validValues": None,
	"updatePeriod": None,
	"standardValues": None,
	"calcType": 1,
	"computeLogic": None,
	"filterRule": None,
	"defineMethod": 1,
	"sql": None,
	"factTagRelations": [{
		"relationCnName": "商品总表",
		"relationEnName": "sum_goods",
		"relationType": "dim",
		"sourceTableName": "edw_dim_sum_goods",
		"sourceTableId": "347432694500589568",
		"sourceFieldName": "goodno",
		"sourceFieldType": "string"
							}],
	"businessObjectId": "354720317573201920"
	}]

第一次写,整理一下思路,①创建请求json字符串对应的python字典,注意,json中的null对应到Python字典中是None

②确定需要修改的字段以及如何读取(python生成,sql查询,接口返回解析)字段的值,

③自定义函数修改python字典,

④把python字典dumps成json,

⑤把请求发出去,