Python 接口测试之处理转义字符的参数和编码问题

2024-03-29 23:04

本文主要是介绍Python 接口测试之处理转义字符的参数和编码问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

笔者,在非常繁忙的工作之余,决定抽时间记录一下在测试接口时所遇到的问题,以便日后参考,也可以提供给那些正在学习的接口测试的伙伴参考,避免走弯路。如果对您有帮忙,点个赞,谢谢。

今天这篇文章主要是讲接口测试中请求参数包含转义字符的和返回参数包含转义字符的处理,之前关于接口测试方法

处理入参有转义字符的接口

1、首先,看一下我的接口中入参的数据样式:

 这个body中的参数有两个“body”和“method”,整个data变量是一个字典,但是“body”是个字符串,并且是包含转义字符,整个就是一个转义字符串。这种参数写代码里面是没问题的,但是作为接口请求时,有时候无法被json解析,最终导致接口请求失败。

这种参数,不处理,直接去请求,就像下图所示:

 2、目标已经确定,接下来就是处理了,我先将data数据反转义,其实很简单,用的是json的一个方法loads(),如图:

在用这个方法时,还要提前处理一下data,因为该方法支持类型有限制,如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,

        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):

    """Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance

    containing a JSON document) to a Python object.

    ``object_hook`` is an optional function that will be called with the

    result of any object literal decode (a ``dict``). The return value of

    ``object_hook`` will be used instead of the ``dict``. This feature

    can be used to implement custom decoders (e.g. JSON-RPC class hinting).

    ``object_pairs_hook`` is an optional function that will be called with the

    result of any object literal decoded with an ordered list of pairs.  The

    return value of ``object_pairs_hook`` will be used instead of the ``dict``.

    This feature can be used to implement custom decoders that rely on the

    order that the key and value pairs are decoded (for example,

    collections.OrderedDict will remember the order of insertion). If

    ``object_hook`` is also defined, the ``object_pairs_hook`` takes priority.

    ``parse_float``, if specified, will be called with the string

    of every JSON float to be decoded. By default this is equivalent to

    float(num_str). This can be used to use another datatype or parser

    for JSON floats (e.g. decimal.Decimal).

    ``parse_int``, if specified, will be called with the string

    of every JSON int to be decoded. By default this is equivalent to

    int(num_str). This can be used to use another datatype or parser

    for JSON integers (e.g. float).

    ``parse_constant``, if specified, will be called with one of the

    following strings: -Infinity, Infinity, NaN.

    This can be used to raise an exception if invalid JSON numbers

    are encountered.

    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``

    kwarg; otherwise ``JSONDecoder`` is used.

    The ``encoding`` argument is ignored and deprecated.

    """

我先将data转成str,如图:

之所以贴个报错的截图,这里有个知识点,教给大家。

python字符串是有层次的,比如使用''' '''和" "和‘ ’,所以不能像上图那样使用两个" "。

修改之后,执行调用接口程序:

 这个返回结果就是我想要的。

入参的转义讲完,那么出参的呢? 留给大家思考。

编码处理

很多时候返回的数据中,有中文和二进制数据,先看一下接口返回的未处理的数据,显示如下:

 这种数据,第一不方便查看,第二很难找到自己想要的值。

1

print(r2.content.decode(),end=' ')

运行脚本:

1

UnicodeEncodeError: 'gbk' codec can't encode character '\xe2' in position 15788: illegal multibyte sequence

这句话说的是gbk无法encode编码,但是我代码编码是utf-8,显然不是代码问题。错误位置在'\xe2'是无法被解码。加一下标准输出代码:

1

2

3

import io

import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')         #改变标准输出的默认编码

再次执行程序,结果显示成功:

 需要注意的是,如果gb18030不行的话,就用utf-8,如:

1

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

还可以改成:

1

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gbk')

下面是一些中文对应的编码表格:

编码名称用途
utf8所有语言
gbk简体中文
gb2312简体中文
gb18030简体中文
big5繁体中文
big5hkscs繁体中文

原因说明:对于Unicode字符,需要print出来的话,由于本地系统是Windows中的cmd,默认codepage是CP936,即GBK的编码,所以python解释器需要先将上述的Unicode字符编码为GBK,然后再在cmd中显示出来。但是由于该Unicode字符串中包含一些GBK中无法显示的字符,导致此时提示“’gbk’ codec can’t encode”的错误的。其实print()函数的局限就是Python默认编码的局限,因为系统是windows的,python的默认编码不是'utf-8',改一下python的默认编码成'utf-8'就行了。

  接口请求方式

引言中已经说过,如果对requests请求不了解,可以参考我的这篇文章Python 接口测试requests.post方法中data与json参数区别。这篇文章讲过post请求的两种数据类型data和json,那么针对body数据中有转义字符的数据,如何同时使用这两种参数类型请求呢?在讲之前,先复习一下知识点:

1

2

3

4

5

6

7

resp.text返回的是Unicode型的数据。

resp.content返回的是bytes型的数据。

resp.json()返回的是json格式数据

#备注:

#如果你想取文本,可以通过r.text。

#如果想取图片,文件,则可以通过r.content。

#如果想要dict类型的数据,则可以通过r.json()。

具体脚本:

结果如下:

不管你选择data类型和json类型,只要传参的类型对应上就完全没问题。这里没有直接贴脚本代码,也是让初学者自己动手敲,不能直接Copy用,这样对自己编码提升会有阻碍。

提取报文中参数

如何取出返回结果中的key对应的values,比如这个接口我是要获取warehouseName这个字段的值,如图:

从数据上看,返回的数据类型是字典,而我要获取的字典warehouseName是在字典中data里,data 是字典,里面还有个列表,列表中也有个字典,等于嵌套了4层,如何取出4层的中里面值呢?这要分两步操作,具体请看代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

# 取出字典中的key对应的值

a = r.json()

b =a['data']['wimslist']

# print(type(dict(b)))

c = json.dumps(b, ensure_ascii=False)

# 方法1

for item in b:print (item['warehouseName'],end=' ')

# 方法2

# 获取list中字典的key值

list_result = []

for in b:

    list_result.append(i['warehouseName'])

print(list_result)

from common.loggers import Log

loggger = Log()

输出结果如下:

附录

1、这里贴出关于(字符串前面u,r,b)的知识点,加深印象,如果没有了解过,就当学习一下,以后自然会用到。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

1、字符串前加 u

例:u"我是含有中文字符组成的字符串。"

作用:

后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。

2、字符串前加 r

例:r"\n\n\n\n”  # 表示一个普通生字符串 \n\n\n\n,而不表示换行了。

作用:

去掉反斜杠的转义机制。

(特殊字符:即那些,反斜杠加上对应字母,表示对应的特殊含义的,比如最常见的”\n”表示换行,”\t”表示Tab等。 )

应用:

常用于正则表达式,对应着re模块。

3、字符串前加 b

例: response = b'<h1>Hello World!</h1>' # b' ' 表示这是一个 bytes 对象

作用:

b" "前缀表示:后面字符串是bytes 类型。

用处:

网络编程中,服务器和浏览器只认bytes 类型数据。

如:send 函数的参数和 recv 函数的返回值都是 bytes 类型

附:

在 Python3 中,bytes 和 str 的互相转换方式是

str.encode('utf-8')

bytes.decode('utf-8')

2、关于python编码基础知识,字符串和字节流之间转换如下图:

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

 

这篇关于Python 接口测试之处理转义字符的参数和编码问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/859883

相关文章

Spring Boot 处理带文件表单的方式汇总

《SpringBoot处理带文件表单的方式汇总》本文详细介绍了六种处理文件上传的方式,包括@RequestParam、@RequestPart、@ModelAttribute、@ModelAttr... 目录方式 1:@RequestParam接收文件后端代码前端代码特点方式 2:@RequestPart接

JAVA Calendar设置上个月时,日期不存在或错误提示问题及解决

《JAVACalendar设置上个月时,日期不存在或错误提示问题及解决》在使用Java的Calendar类设置上个月的日期时,如果遇到不存在的日期(如4月31日),默认会自动调整到下个月的相应日期(... 目录Java Calendar设置上个月时,日期不存在或错误提示java进行日期计算时如果出现不存在的

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

浅析python如何去掉字符串中最后一个字符

《浅析python如何去掉字符串中最后一个字符》在Python中,字符串是不可变对象,因此无法直接修改原字符串,但可以通过生成新字符串的方式去掉最后一个字符,本文整理了三种高效方法,希望对大家有所帮助... 目录方法1:切片操作(最推荐)方法2:长度计算索引方法3:拼接剩余字符(不推荐,仅作演示)关键注意事

Nginx错误拦截转发 error_page的问题解决

《Nginx错误拦截转发error_page的问题解决》Nginx通过配置错误页面和请求处理机制,可以在请求失败时展示自定义错误页面,提升用户体验,下面就来介绍一下Nginx错误拦截转发error_... 目录1. 准备自定义错误页面2. 配置 Nginx 错误页面基础配置示例:3. 关键配置说明4. 生效

python版本切换工具pyenv的安装及用法

《python版本切换工具pyenv的安装及用法》Pyenv是管理Python版本的最佳工具之一,特别适合开发者和需要切换多个Python版本的用户,:本文主要介绍python版本切换工具pyen... 目录Pyenv 是什么?安装 Pyenv(MACOS)使用 Homebrew:配置 shell(zsh

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示