基础练习
- 定义一个函数,生成一个随机的姓名。
📎fristname.txt 所有的姓
📎name.txt 名字、
自动化测试的应用场景: 在做接口测试时 申请贷款接口需要人名。随机生成一个姓名。
思路:
将文件中内容读取(解析)出来,放到列表中,通过随机函数随机选择一个。
# 集合数据 有去重功能with open('name.txt',mode='r',encoding='utf8') as f:data = f.readlines()# 转换为集合data = set(data)# print(data)# 循环处理strname = ""for name in data:if name != "\n":name=name.replace(',\n',',')# print(name)strname= strname+name# 字符串去掉空格strname = strname.strip()# str 转换为listnamelist = strname.split(',')# print(namelist)with open('fristname.txt', mode='r', encoding='utf8') as f:data = f.readlines()# print(data)first_names = []for firstnames in data:fnames = firstnames.strip()fn = fnames.split(',')# print(fn)first_names.extend(fn)# print(first_names)import randomf = random.choice(first_names)n = random.choice(namelist)print(f+n)
随机生成电话号码。
def generate_phone():"""生成一个随机的 11位手机号码:return:"""#确定前两位手机pre_2 =["13","15","17","18"]# 随机选择一个元素p2 = random.choice(pre_2)# 生成9位随机数字l9 = ""for i in range(9):# 每次循环生成一个随机数字n = random.randint(0,9)l9 = l9+str(n) # 将数字转换为字符串之后进行拼接return p2+l9
随机生成身份证号。
def generate_id():"""生成一个随机的身份证号 并返回:return:"""# 拿到项目根目录root = get_project_root()# 拼接csv文件file_csv = os.path.join(root,'gb2260.csv')# 通过解析csv文件获取所有的地区编码all_code = parse_csv(file_csv)# print(all_code)# 随机选择一个列表code = random.choice(all_code)# print(code)# 列表转换为字符串p6 = ''.join(code)#print(p6)# 设置出生年月日year = random.randint(1960,2020)month = random.randint(1,12)# 闰年 2月份 29天if year%4==0 and month == 2:day=random.randint(1,29)# 31天elif month in [1,3,5,7,8,10,12]:day = random.randint(1,31)elif month in [4,6,9,11]:day = random.randint(1,30)# 平年的2月 28天else:day = random.randint(1,28)# month ,day 小于10 前面补0if month<10:month = f'0{month}'if day <10:day = f'0{day}'# 合并年月日 转换为字符串ymd = f'{year}{month}{day}'# print(ymd)# 获取最后4位 最后一位Xl3 = ""for i in range(3):n = random.randint(0,9)# 数字转换字符串 拼接l3 = l3+str(n)l1 = list(range(10))l1.append("X") # [0,1,2,3,4,5,6,7,8,9,"X"]# print(l1)l = random.choice(l1) # 最后1位l4 = l3 + str(l) # 最后4位return f'{p6}{ymd}{l4}'
自动化练习
参数化练习
使用pytest+requests+csv 进行单接口的参数化测试
数据文件:📎home_topics.csv
import requestsimport pytest# 编写代码,读取csv文件中的内容,读取成功之后将数据赋值给home_data 能够让这个测试用例跑起来@pytest.mark.parametrize("tab,limit,expect_tab,expect_limit",home_data)def test_home_page(tab,limit,expect_tab,expect_limit):url = "http://47.100.175.62:3000/api/v1/topics"querydata = {"tab":tab,"limit":limit}r = requests.get(url,params=querydata)#断言tab值for topic in r.json()["data"]:assert topic["tab"] == expect_tab# 断言limitassert len(r.json()["data"]) == expect_limit
参考:https://gitee.com/imzack/auto_aptest/blob/master/testcases/test_cnode_each_api.py
import requestsimport pytest# 编写代码,读取csv文件中的内容,读取成功之后将数据import csvhome_data = []# 解析csv文件中的内容with open('home_topics.csv',mode='r',encoding='utf8') as f:data = csv.reader(f)# 第一行数据不需要next(data) # 去掉第一行# 从第二行数据开始迭代for line in data:print(line)# 将数据追加到listhome_data.append(tuple(line))print("data",home_data)@pytest.mark.parametrize("tab,limit,expect_tab,expect_limit",home_data)def test_home_page(tab,limit,expect_tab,expect_limit):url = "http://47.100.175.62:3000/api/v1/topics"querydata = {"tab":tab,"limit":int(limit) # csv文件中读出来的时候时 字符串,将字符串转换为int}r = requests.get(url,params=querydata)#断言tab值for topic in r.json()["data"]:assert topic["tab"] == expect_tab# 断言limitassert len(r.json()["data"]) == int(expect_limit) # 从csv文件中读取出来的时候为字符串类型,转换格式为int数字。
上下游传参+参数化
需要对两个接口进行参数化测试
- 搜索商品接口
- 添加购物车

做这两个接口的前提条件是 用户已经成功登录,获取到token值。
通过使用 pytest的脚手架功能 @pytest.fixture 将登录操作放进来生成token值。
'''新丰商城 单接口测试'''import pytestfrom common.utils import generate_phoneimport requeststestdata={"token":"","goodsid":0 # 商品的id}base_url = "http://49.233.108.117:28019"# 注册,登录使用的是同一个手机号码 定义变量phone = generate_phone()#scope="module" 模块级别, 整个python文件运行之前和之后的操作 整个文件运行之前生成1个token@pytest.fixture(scope="module",autouse=True)def token():# 脚手架中注册并登录一个账号# 注册用户url = base_url+"/api/v1/user/register"body_data = {"loginName": phone,"password": "123456"}# 发送请求requests.post(url,json=body_data)# 登录用户url = base_url + "/api/v1/user/login"body_data = {"loginName": phone,"passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"}r = requests.post(url, json=body_data)# 设置 token# 提取变量值 tokentestdata["token"] = r.json()["data"]# 运行之前的所有操作print("已经成功获取一个token值",r.json()["data"])yieldsearch_data=['iphone','小米','华为']@pytest.mark.parametrize("key",search_data)def test_search(key):url = base_url+'/api/v1/search'header={"token": testdata["token"]}query_data={"keyword":key}# 搜索条件为 iphoner = requests.get(url, params=query_data, headers=header)# 断言# 所有搜索结果中都包含iphone# 拿到所有的商品信息allgoods = r.json()["data"]["list"]# 循环所有商品的时候for good in allgoods:print(good)# 拿到每个商品的名称goodname = good["goodsName"]# print('商品的名称', goodname) # 因为返回结果中有大小写字母混合的场景。使用字符串转换大写方法assert key.upper() in goodname.upper() # upper 将字符串转为大写# 提取商品id 给下游接口testdata["goodsid"] = good["goodsId"]print("传递的参数数据",testdata["goodsid"])#商品的id 从搜索接口中获取cart_data = [(0,0),("${goodsid}",0), # ${goodsid} 表示具体的商品id("${goodsid}",1),("${goodsid}",10)]@pytest.mark.parametrize("goodsId,count",cart_data)def test_add_cart(goodsId,count):if goodsId =="${goodsid}":goodsId = testdata["goodsid"] # 替换为具体的值url = base_url+"/api/v1/shop-cart"body_data ={"goodsCount": count,"goodsId": goodsId}header = {"token": testdata["token"]}print("加入购物车数据",body_data)r = requests.post(url,json=body_data,headers=header)print("购物车返回结果",r.json())
运行可以看到执行的结果
