进阶之路--从0开始学接口测试(9)--正则表达式的使用

业务流测试(各种功能) 对应的是单接口测试

-业务流本质上还是接口关联

技术1:

-动态数据替换

用if可以实现 但是如果要替换的数据很多的话,就要写很多的if

-正则表达式

正则表达式是通用的编程语言,是一种字符串的模糊匹配技术(基于一个规则去匹配字符串当中的内容),匹配的需要是连在一起的子字符串,只要想在字符串中符合规律的子字符串,基本上都可以使用正则表达式

正则表达式在python中应用,re模块

-基本语法

参数:pattern 表达式(字符串类型)    string 需要匹配的字符串

import re
#需要匹配的字符串,需要连在一起的子字符串
string = "@12abc45"
#基本用法,直接匹配想要的字符串
result = re.search(pattern="abc",string=string)
print(result)

每次匹配到的结果是一个对象

需要用group方法提取匹配的子字符串

re.match:从字符串开头开始匹配,返回的是一个对象

re.search:在字符串中匹配一个符合规则的子字符串,返回的是一个对象

re.findall:在字符串中匹配所有符合规则的子字符串,返回列表

re.finditer:在字符串中匹配所有符合规则的子字符串,返回一个对象,对象里有多个匹配的结果

 需要遍历对象获得每次匹配到的结果

规则:是一个字符串,由一个或者多个(表示字符+表示次数/数量)组成(可用+隔开).表示原字符串里的子字符串需要跟这个规则匹配

如:表示符合规则的11位手机号,第一个数字要匹配1 第二个数字要匹配[]里面的任意一个,之后的是数字,出现次数为9

string = '15301017834'
#匹配手机号
import re
result = re.search(r"1+[35678]+\d{9}",string)
print(result)

表示字符

.  :表示任意字符(\n除外)

在没有边界的情况下,默认匹配第一个

string = "@12abc45"
result = re.search(pattern=".",string=string)
print(result)

 在有特定边界的情况下,匹配边界之间(包括边界字符)的字符(匹配需要是连起来的字符)

string = "@12abc45"
#匹配指定子字符串与它后一个字字符串
result = re.search(pattern="c.",string=string)
print(result)

 [abc] : 匹配a或者b或者c中的一个

string = "@12abc45"
#[abc] 匹配a或者b或者c,只取其中一个
result = re.search(pattern="[abc]",string=string)
print(result)

 \d  :只匹配数字

string = "@12abc45"
result = re.search(pattern="\d",string=string)
print(result)

表示数量/次数

{n}  :表示匹配某种字符n次

匹配数字n次

{n,} :表示匹配某种字符至少n次,到无限次

{m,n} : 表示匹配某种字符串m次或者n次之间(包含m,n)

* : 表示匹配某个字符尽可能少(0次)或者尽可能多(无限次)

string = "aaaa7bc45"
#*: 匹配某个字符0次->无限次
result = re.search(pattern="a*?",string=string)
print(result)

 拓展:python中,*默认开启的是贪婪模式,就是获取尽可能多的次数

非贪婪模式: 获取尽可能少(0次)的次数

匹配任意字符串尽可能多(无限次)的次数

string = "aaaa7bc45"
#python使用正则表达式,默认启用贪婪模式,优先尽可能多的次数
result = re.search(pattern=".*",string=string)
print(result)#结果是整个字符串

 匹配任意字符串尽可能少(0次)的次数

string = "aaaa7bc45"
#开启非贪婪模式(自动化测试需要)
result = re.search(pattern=".*?",string=string)
print(result)#结果为空字符

边界

存在边界,匹配的字符要在边界范围内

-贪婪模式下,要尽可能多地获取两个#号之间的字符

string = '{"member_id":"#pwd#","amount":#money#}'

import re
#存在边界# #,所以要尽可能拿去两个#之间的字符
result = re.search('#.*#',string)
print(result)

这里有4个#号,贪婪模式下尽可能多获取字符,存在边界就是只能匹配边界范围内的,不能超过边界

也就是第一和第四个#号之间

-非贪婪模式下,尽可能少获取两个#号之间的字符(自动化测试)

string = '{"member_id":"#pwd#","amount":#money#}'

import re
#存在边界# #,所以要尽可能拿去两个#之间的字符
result = re.search('#.*?#',string)
print(result)

 非贪婪模式下,只会尽可能少地获取最近的两个#号里面的值,尽可能少也包括0次,但是存在边界值,必须要拿到包括前后#号夹着的字符,就是说最少也要获取最前面两个之间里的字符

分组

在规则字符串中间加( ),表示分组

string = '{"member_id":"#pwd#","amount":#money#}'
result = re.search('#(.*?)#',string)
#.group 正则表达式匹配到的整个结果
print(result.group())
#参数为1,表示第一个括号里的字符
print(result.group(1))

group()默认参数是0,表示匹配到整个相匹配的子字符串

group(1),表示匹配到的整个子字符串中第一个括号里的子字符串

 自动化测试中使用:为了动态提取类/对象的属性

实战演示

把字符串里带有#标记的提取出来,并且动态替换类的属性

string = '{"member_id":"#pwd#","amount":#money#}'

class Data:
    pwd = "123456"
    money = 100

 方法1: if判断

#if
if "#pwd#" in string:
    string = string.replace("#pwd#",Data.pwd)

if "#money#" in string:
    string = string.replace("#money#",str(Data.money))
print(string)

方法2: 正则表达式

#正则表达式
import re
result = re.finditer("#(.*?)#",string)
print(result)

用finditer方法表示找到所有符合规则的子字符串,获取到的结果是一个对象,需要用for循环得到每次匹配的子字符串

 -替换字符串

需要准备好替换的数据:类/实例属性,要跟原字符串的标记名称相同

for el in result:

    old = el.group()#获取匹配字符串  #pwd#
    prop_name = el.group(1) # pwd
    string = string.replace(old,str(getattr(Data,prop_name)))
    #标记的字符串,要跟类/对象的属性名称相同,才能被获取到

思路:

通过断点可以看出,循环第一次,old匹配到的是#pwd#, prop_name的结果是pwd,然后通过动态获取类的属性getarrt(类名,属性名)获取需要替换的属性值,最后通过replace把字符串相应的子字符串替换成属性值

注意:因为是循环,每次的获取的属性名称要不一样,所以需要动态获取,而标记的字符串,要跟类/对象的属性名称相同,才能被获取

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值