接口测试平台代码实现79: 多接口用例-19

简介: 接口测试平台代码实现79: 多接口用例-19

上节中,我搞定了提取数据的持久化。

所以现在我们来测试一下:

准备俩个步骤接口,第一个仍然是昨天例子那个可以通的x度接口。第二个可以不通,不是真接口,主要验证在url/header/body中 是否能成功接收并代入第一个接口的返回值qid和en:

微信图片_20220625121128.png注意上图,我在其中6处加上了替换的占位符。

但是保存的时候出现了问题~:

微信图片_20220625121153.png

因为我们这种替换规则,静态检查会误报header不符合规范,所以我们先暂时删除header的前端验证:

然后刷新页面,再次按上图保存:

微信图片_20220625121201.png

保存成功后:

我们要在代码中加上一些输出,以便后续我们判断请求数据是否正常:

微信图片_20220625121208.png

## 输出请求数据
print('【host】:',api_host)
print('【url】:',api_url)
print('【header】:',api_header )
print('【method】:',api_method)
print('【body_method】:',api_body_method)
print('【body】:',api_body)

测试结果为:

微信图片_20220625121216.png很显然,失败了~


显然,第一个步骤中,正常存储且提取出来了。

但是,第二个步骤中,却无法提取,说没有这个self.qid类变量。


这是为什么呢?其实这是我上节故意埋下的一个坑,原因是想让大家深刻的知道一个unittest的特性,就是各个test小用例函数之间是无法通过类变量或其他局部变量 互通数据的,这样也保证了各个小用例的独立性,符合高内聚/低耦合的价值观。

   这点是和我们自己写的普通类,各个子函数之间用类变量互通数据是完全不一样的。这个问题,我在很久之前写过专门的博客来曝光,但是不少同学印象不深刻,所以在这里我埋了这个坑。

博客地址:

https://blog.csdn.net/qq_22795513/article/details/90053507?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160618375319725225008257%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=160618375319725225008257&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-1-90053507.pc_v1_rank_blog_v1&utm_term=unittest&spm=1018.2118.3001.4450

微信图片_20220625121222.png

那么我们现在知道了问题所在,要怎么修复呢?其实很简单,既然类变量不行,我们弄成全局变量总可以了吧~


所以按照下面方法改这俩处:

微信图片_20220625121230.png

也就是我们放弃使用self. 的类变量形式,转而用全局变量来存储。


然后我们重启服务,再次运行看看结果:

微信图片_20220625121235.png

仍然报错了,不过这次的问题变了,不再是找不到qid和en了,这就说明,我们用全局变量保存提取结果的设计成功了。但是现在面临的新报错是什么意思呢?


上面说,replace函数不能去替换int整形,它只能把字符串塞进去。


因为我们前面提取的时候,用过路径法,而我特意提取了一个整形的en。

而在第二个步骤接口替换的过程中,url,header,body等地方 都是作为字符串出场的,然后替换也是完全按照字符串替换,所以导致了这次报错,而我们先在应该知道,url中,实际上应该全是字符串才对。

   而header和body中,需要对其进行符合原本类型的替换,那就绝对不能简简单单用replace函数来替换了。

   所以,替换代码这里我们要 大改!


首先是url,我们全部强制变成str字符串,然后我们输出,看看结果:

微信图片_20220625121241.png

微信图片_20220625121247.png

可以看到,替换成功了。


接下来是header:

header和url一样,值只能是字符串,所以如下改:

微信图片_20220625121252.png

下面实际请求代码块这里要进行一个兼容性的设计:

微信图片_20220625121256.png

最后就是body了,body这里比较复杂,我们的参数进行替换的时候,类型也要保持住不能丢失。


但是这里就要进行一个细分了,因为请求体类型有多种, 我的例子中的是这样form-data,这种情况的请求体参数值基本只是字符串,所以无论我们输入什么都会被当作字符串:

比如 :使用者输入的是avc

微信图片_20220625121301.png

那么最终的请求体这个参数的值应该是:"avc" 才对。

如果 使用者输入的是'abc',带了引号。

微信图片_20220625121307.png

  那么请求体最终参数值应该是:"'avc'" 才对。 一切输入都会被当作字符串的一部分。

不信的可以去用postman试试看。那么我们代码中要怎么处理呢?

form-data这种,都要忠实的把全部内容拿过来当作字符串值才对。并且是强行转变成字符串。  后面的x-www....和raw的,处理方式都不一样。我们这里之后会按顺序一个一个研究如何实现。


所有的测试用例 预期,我们必须保证和postman一摸一样的效果才可以。

这里大家可以多研究下postman的发送代码。


本节就到此结束了。最后发一下这个demo函数目前进度的完整代码:

 def demo(self,step):
        time.sleep(3)
        # 提取所有请求数据
        api_method = step.api_method
        api_url = step.api_url
        api_host = step.api_host
        api_header = step.api_header
        api_body_method = step.api_body_method
        api_body = step.api_body
        get_path = step.get_path
        get_zz = step.get_zz
        assert_zz = step.assert_zz
        assert_qz = step.assert_qz
        assert_path = step.assert_path
        ## 检查是否需要进行替换占位符的
        rlist_url = re.findall(r"##(.*?)##",api_url)
        for i in rlist_url:
            api_url = api_url.replace("##"+i+"##",str(eval(i)))
        rlist_header = re.findall(r"##(.*?)##",api_header)
        for i in rlist_header:
            api_header = api_header.replace("##"+i+"##",repr(str(eval(i))))
        if api_body_method == 'none':
            pass
        elif api_body_method == 'form-data':
            rlist_body = re.findall(r"##(.*?)##",api_body)
            for i in rlist_body:
                api_body = api_body.replace("##"+i+"##",str(eval(i)))
            print(api_body)
        ## 输出请求数据
        print('【host】:',api_host)
        print('【url】:',api_url)
        print('【header】:',api_header )
        print('【method】:',api_method)
        print('【body_method】:',api_body_method)
        print('【body】:',api_body)
        ## 实际发送请求
        try:
            header = json.loads(api_header)  # 处理header
        except:
            header = eval(api_header)
        # 拼接完整url
        if api_host[-1] == '/' and api_url[0] == '/':  # 都有/
            url = api_host[:-1] + api_url
        elif api_host[-1] != '/' and api_url[0] != '/':  # 都没有/
            url = api_host + '/' + api_url
        else:  # 肯定有一个有/
            url = api_host + api_url
        if api_body_method == 'none' or api_body_method=='null':
            response = requests.request(api_method.upper(), url, headers=header, data={})
        elif api_body_method == 'form-data':
            files = []
            payload = {}
            for i in eval(api_body):
                payload[i[0]] = i[1]
            response = requests.request(api_method.upper(), url, headers=header, data=payload, files=files)
        elif api_body_method == 'x-www-form-urlencoded':
            header['Content-Type'] = 'application/x-www-form-urlencoded'
            payload = {}
            for i in eval(api_body):
                payload[i[0]] = i[1]
            response = requests.request(api_method.upper(), url, headers=header, data=payload)
        else:  # 这时肯定是raw的五个子选项:
            if api_body_method == 'Text':
                header['Content-Type'] = 'text/plain'
            if api_body_method == 'JavaScript':
                header['Content-Type'] = 'text/plain'
            if api_body_method == 'Json':
                header['Content-Type'] = 'text/plain'
            if api_body_method == 'Html':
                header['Content-Type'] = 'text/plain'
            if api_body_method == 'Xml':
                header['Content-Type'] = 'text/plain'
            response = requests.request(api_method.upper(), url, headers=header, data=api_body.encode('utf-8'))
        response.encoding = "utf-8"
        res = response.text
        # 对返回值res进行提取:
        # # 路径法提取:
        if get_path != '': #说明有设置
            for i in get_path.split('\n'):
                key = i.split('=')[0].rstrip()
                path = i.split('=')[1].lstrip()
                py_path = ""
                for j in path.split('/'):
                    if j !='':
                        if j[0] != '[':
                            py_path += '["%s"]'%j
                        else:
                            py_path += j
                value = eval("%s%s" % (json.loads(res), py_path))
                exec('global %s\n%s = value '%(key,key))
        # # 正则法提取:
        if get_zz != '': #说明又设置
            for i in get_zz.split('\n'):
                key = i.split('=')[0].rstrip()
                zz = i.split('=')[1].lstrip()
                value = re.findall(zz,res)[0]
                exec('global %s\n%s = "%s" '%(key,key,value))
        # 对返回值res进行断言:


相关文章
|
1月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
40 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
11天前
|
监控 安全 测试技术
构建高效的精准测试平台:设计与实现指南
在软件开发过程中,精准测试是确保产品质量和性能的关键环节。一个精准的测试平台能够自动化测试流程,提高测试效率,缩短测试周期,并提供准确的测试结果。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
47 1
|
29天前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
46 2
|
11天前
|
监控 安全 测试技术
构建高效精准测试平台:设计与实现全攻略
在软件开发过程中,精准测试是确保产品质量的关键环节。一个高效、精准的测试平台能够自动化测试流程,提高测试覆盖率,缩短测试周期。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
33 0
|
7天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
36 3
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
59 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
239 7
Jmeter实现WebSocket协议的接口测试方法
|
2月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
247 3
快速上手|HTTP 接口功能自动化测试
|
1月前
|
JavaScript 前端开发 API
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
40 0
|
2月前
|
JavaScript 前端开发 测试技术
ChatGPT与接口测试
ChatGPT与接口测试,测试通过
48 5