一。数据结构:列表,数据字典,json串
二。文件:txt文件 csv文件 excel文件
三。数据库DDT:数据库连接 数据库提取
四。参数化 @pytest.mark.parametrize @pytest.fixture
一。数据结构
数据字典;
# 字典读取 # 方法1:读取key for key in userinfo.keys(): print(key) # 方法2:读取value for val in userinfo.values(): print(val) # 方法3:读取所有内容 for k in userinfo: print(k,userinfo[k])
json串
# 例子:json文件操作 import json # 读取json文件,用json.load()方法转换成字典格式,再去读取.如果json文件里面有汉字,记得该编码为encoding='utf-8'否则乱码 jsonfile=open('interface.json','r',encoding='utf-8') # print(jsonfile) # print(type(jsonfile)) # 转换数据类型 jsondict=json.load(jsonfile) #print(type(jsondict)) # 提取json文件中的内容 # 目标找到item里面的内容 for data in jsondict['item']: # print(data['name']) # 对于多层级的内容,逐层去找 for d in data['request']['body']['formdata']: # print(d) for key in d: print(key,d[key])
二,文件
2.1 txt文件的读取
打开文件: file=open('文件名.txt','r',encoding='uft-8')
读取文件内容:con=file.read()
写入文件内容:file.write('写入的内容')
关闭文件:file.close
处理完文件后,有2中方法可以进行DDT技术
2.1.1.DDT技术和@pytest.mark.parametrize参数化结合
2.1.2.DDT技术和conftest.py结合
DDT方法2种不要混用。要么import+@pytest.mark.parametrize参数化:可以设置一个单独的数据驱动层,存放数据文件和数据驱动。团队成员需要数据时,直接import 然后使用
要么:使用conftest.py+@pytedt.fixture。conftest.py原理是,运行pytest项目之前,默认优先执行同级目录下的conftest.py文件,数据处理完后,加上固件
举例1:parametrize。从txt文件读取内容,处理后用第一种@pytest.mark.parametrize参数化
import pytest # txt参数化举例 # 定义一个方法专门处理字符串 def get_list(): f1=open('eg.ext','r',encoding='utf8') content=f1.read() # 对读取的字符串进行处理,去掉头的[和尾的],然后按照,分割.按自己需求弄 autholist=[] result=content[1:-1].split(', ') # 分割好的字符串append()放入列表待用 for i in result: autholist.append(i) # 返回列表autolist方便接下来的@pytest.mark.parametrize参数化传入 return autholist class Test_parametirize_practice(): # 将函数名get_list传入,返回值传入。这里是txt参数化处理得到的列表 @pytest.mark.parametrize('parameter1',get_list) def test_practice1(self): print(get_list())
举例2:conftest.py。pytest有更方便的管理数据驱动方法的办法:conftest.py
conftest.py特点:
1.conftest.py名字固定的,不可以修改
2.conftest.py文件所在目录必须存在__init__py文件
3.conftest.py文件不能被其他文件导入
4.所有同目录测试文件运行前都会执行conftest.py文件
conftest.py一般和@pytest.fixture()固件放在一起使用
conftest原理是,运行pytest项目之前,默认优先执行当前层的conftest.py文件,数据处理完后,加上固件赋予直接传参的能力.注意;如果想conftest.py对所有文件都生效的话,一般建在根目录下
DDT和pytest融合几种方式分别是
1.同一py文件中,2.不同py文件中,3.公共数据层,这三种需要使用参数parametrize,或者import
4.conftest.py需要使用固件fixture
2.2 csv文件的读取,DDT
导入类库 import csv
打开csv文件 file=open('文件名','r',)
读取csv文件的内容 readers=csv.reader(csvfile)
写入csv文件的内容 file=open("文件名.csv",'w')
writers=csv.writer(file)
关闭文件 file.close()
直接粘贴小试验,包含文件的读,写,以及结合DDT参数化传参.
import csv import pytest def get_data(): datalist=[] file=open('../DDT_test/testcase.csv','r') # 读文件 result=csv.reader(file) # 跳过首行 result.__next__() for row in result: # 将字符串类型转化为字典类型 a=eval(row[2]) datalist.append(a) print(datalist) # print(type(datalist)) return datalist class Test_file_operate(): # 使用参数化方法,把得到的数据传入 @pytest.mark.parametrize('userinfo',get_data()) def test_file_read(self,userinfo): print(userinfo['username']) print(userinfo['password']) print(userinfo['state']) # 写文件 # 把文件读取,然后写入'testreport.csv'文件中去 def write_csv(): # newline=''可以去除行之间的空格 file2=open('testreport.csv','w',newline='') writer=csv.writer(file2) file=open('../DDT_test/testcase.csv','r') readers=csv.reader(file) for row in readers: # 每行结尾添加’测试结果‘,然后把读到的内容写到文件里面 row.append('测试结果') writer.writerow(row) # 操作完后一定记得关闭文件 file2.close() file.close()
2.3 excel文件读取+Pandas结合
导入类库 import pandas as pd
读取excel df=pd.read_excel('文件名.xlsx')
提取对应行的内容 row=df.loc[1,3].values
提取对应列的内容 colum=df['输入参数'].values
首先需要下载pandas和xlrd库,才可以读取xlsx文件,但是pycharm默认的下载源是国外,经常超时下载失败,所以换源下载,如下,飞快
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install xlrd==1.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
新版的xlrd读取文件失败了,所以下载1.2.0的版本,确定稳定没问题
# 试验:excel文件操作
import pandas as pd
import pytest
def get_data():
df=pd.read_excel('testcase.xlsx')
# 取行:读取第0行的值。但是得注意,0表示第二行,默认不读取第一行标题行
#取多行,例如loc[[0,2]],就是取第0 行和第二行,记得是2个中括号
row=df.loc[0].values
# 取标题为‘输入参数’的列
cloum=df['输入参数'].values
#取出的值 cloum的类型是pandas自己的类型numpy.ndarray,不是字典或者字符串,需要转化
#使用tolist()方法可以直接转化为列表
listdata=cloum.tolist()
return listdata
class Test_practice_xlsx():
@pytest.mark.parametrize('userinfo',get_data())
def test_002(self,userinfo):
# 使用eval()方法将字符串转化为字典格式
dd=eval(userinfo)
print(dd['username'])
print(dd['password'])
2.4.DDT数据库的读取
待续,
好累,今天先睡了。。。