在正式分享接口自动化测试实战的内容之前,你们可以跟着我的思路思考下这些问题:
-
如何实现单个接口请求的测试?
-
如何实现登录的Excel文件测试用例的参数化?
-
如何实现登录的MySQL数据库测试用例参数化?
-
添加购物车的登录状态该如何处理?
-
测试用例中的字段该如何使用?
-
如何“优雅”的实现添加购物车的测试用例?
一、PyMySQL原生结合fixture实现参数化测试--环境
-
创建并命名新的工程
pip list
-
编写数据库工具模块
作用:包含用于操作数据库的方法,例如连接数据库、执行查询——其他模块将依赖于这些数据库操作的方法。
前后关系:
-
定义
get_sql_connection
方法,用于连接数据库。 -
定义
get_mqsql_case_data
方法,通过连接数据库执行 SQL 查询,获取测试数据。
代码示例:
#在本py文件中书写的全部都是能够很方便地操作数据库的方法
import pymysql
def get_sql_connection():
db_info = {
"host":"***********",
"user":"root",
"password":"********",
"database":"school_manage_sys",
"charset":"utf8"
}
conn = pymysql.connect(**db_info)
return conn
def get_mqsql_case_data(interface_type):
conn = get_sql_connection()
sql = "select * from mumu where interface_type = '{}'".format(interface_type)
cursor = conn.cursor()
cursor.execute(sql)
result = cursor.fetchall()
return result
-
编写测试用例模块
作用:包含了测试用例和 Fixture 的定义,主要负责实际的测试逻辑,测试用例和 Fixture 使用了数据库工具模块中的方法——这个模块中的测试用例依赖于数据库操作。
前后关系:
-
在文件中通过
import requests
导入了requests
模块,用于发送 HTTP 请求。 -
通过
from utils.mqsql_utils import get_mqsql_case_data
导入了get_mqsql_case_data
方法,用于从数据库获取测试数据。 -
定义
get_mysql_login_data
Fixture,通过参数化的方式获取数据库中的测试数据。 -
定义
test_mysql_login1
测试用例,通过 Fixture 获取的测试数据进行实际的测试操作。
代码示例:
#使用数据库原生集合fixture 进行参数化(即不用pandas)
import pytest
import requests
#导入get_mqsql_case_data方法的两种方式
from utils.mysql_utils import get_mqsql_case_data
#import utils.mqsql_utils as um
#借助一个工具方法,帮助获取数据库中的数据
@pytest.fixture(params=get_mqsql_case_data("登录"))
def get_mysql_login_data(request):
return request.param
def test_mysql_login1(get_mysql_login_data):
print(get_mysql_login_data)
-
编写测试入口模块
作用:作为测试的入口文件,执行 pytest.main(["-vs"])
启动测试。
前后关系:这个文件主要负责启动整个测试框架,调用 pytest 运行测试。
代码示例:
import pytest
if name == '__main__':
pytest.main(["-vs"])
二、PyMySQL原生结合fixture实现参数化测试--代码
-
导入所需的库和模块
包括 pytest
、requests
、json
,以及从 utils.mysql_utils
模块中导入了 get_mqsql_case_data
方法。
-
定义
url1
变量
该变量存储了被测试的服务器地址。
-
创建参数化fixture
使用 PyTest 的 @pytest.fixture
装饰器创建了一个参数化的 fixture get_mysql_login_data
,该 fixture 使用了 get_mqsql_case_data("登录")
方法获取登录接口的测试数据。
-
定义测试函数
定义一个测试函数 test_mysql_login1
,该函数使用了 get_mysql_login_data
这个 fixture,通过参数获取了测试数据。
-
发送HTTP请求
在测试函数中,通过 requests
发送 HTTP 请求,根据测试数据中的 method
字段判断使用 GET 还是 POST 请求。
根据测试数据中的 data_type
字段判断数据格式,如果是 "form",则使用 data
参数发送 form 数据;如果是 "json",则使用 json
参数发送 JSON 数据。
-
对响应进行断言
判断状态码和期望结果是否符合测试数据中的期望值。
代码示例:
import pytest
import requests
import json
#导入get_mqsql_case_data方法的两种方式
from utils.mysql_utils import get_mqsql_case_data
#import utils.mqsql_utils as um
url1 = "http://*************"
#借助一个工具方法,帮助获取数据库中的数据
@pytest.fixture(params=get_mqsql_case_data("登录"))
def get_mysql_login_data(request):
return request.param
def test_mysql_login1(get_mysql_login_data):
print(get_mysql_login_data)
id = get_mysql_login_data[0]
case_id = get_mysql_login_data[1]
title = get_mysql_login_data[2]
interface_type = get_mysql_login_data[3]
url = get_mysql_login_data[4]
input_data = get_mysql_login_data[5]
data_type = get_mysql_login_data[6]
method = get_mysql_login_data[7]
if_login = get_mysql_login_data[8]
expect = get_mysql_login_data[9]
if method == "get":
response = requests.get(url1 + url,json.loads(input_data))
assert 200 == response.status_code
print(json.loads(response.text))
assert int(expect) == json.loads(response.text)["status"]
elif method == "post":
if data_type == "form":
response = requests.post(url1 + url,data=json.loads(input_data))
elif data_type == "json":
response = requests.post(url1 + url,json=json.loads(input_data))
assert 200 == response.status_code
assert int(expect) == json.loads(response.text)['status']
三、PyMySQL结合Pandas&fixture实现登录自动化测试
-
建立 MySQL 数据库的连接
get_sql_connection()
函数:用于建立与 MySQL 数据库的连接。
通过配置数据库连接信息,使用 pymysql.connect() 方法创建一个数据库连接对象,并返回该对象。
-
获取数据库中特定接口类型的数据
get_mysql_case_data(interface_type)
函数:用于获取数据库中特定接口类型的数据。函数中通过 get_sql_connection()
获取数据库连接,执行 SQL 查询语句,获取结果,最后返回查询结果。
-
使用pandas库读取对象
get_mysql_case_data_for_pandas(interface_type)
函数:类似于 get_mysql_case_data(interface_type)
,不同之处在于该函数使用 pandas 库的 pd.read_sql
方法,将 SQL 查询结果直接读取为一个 DataFrame 对象。然后,它将 DataFrame 对象转换为一个字典列表,每个字典表示一个接口数据记录。最终,返回这个字典列表。
代码示例:
import pandas as pd
import pymysql
def get_sql_connection():
db_info = {
"host":"192.168.21.101",
"user":"root",
"password":"123456",
"database":"school_manage_sys",
"charset":"utf8"
}
conn = pymysql.connect(**db_info)
return conn
def get_mysql_case_data(interface_type):
conn = get_sql_connection()
sql = "select * from mumu where interface_type = '{}'".format(interface_type)
cursor = conn.cursor()
cursor.execute(sql)
result = cursor.fetchall()
return result
#声明一个工具函数
def get_mysql_case_data_for_pandas(interface_type):
conn = get_sql_connection()
sql = "select * from mumu where interface_type = '{}'".format(interface_type)
interface_type_data = pd.read_sql(sql,conn)
#数据格式的转换和解析
final_data = []
#print(interface_type_data)
for i in interface_type_data.index:
inner_data = {}
for d in interface_type_data.iloc[[i]]:
inner_data[d] = interface_type_data[d][i]
final_data.append(inner_data)
#return interface_type_data
return final_data
四、Excel参数化实现登录自动化测试
-
创建接口自动化测试用例文件夹
接下来需要从一个 Excel 文件中读取测试用例数据,根据指定的请求接口类别(interface_type
)筛选出相关的测试用例数据,并将其以字典的形式存储在一个列表中返回。
-
导入 pandas 模块
import pandas as pd
-
定义
get_excel_case_data
函数
def get_excel_case_data(interface_type):
-
读取 Excel 文件数据
data = pd.read_excel('./case_data/第三章接口测试用例.xlsx')
这里使用 pd.read_excel
函数读取指定路径下的 Excel 文件中的数据,并将其存储在 data
变量中。
-
筛选指定接口类型的数据
interface_type_data = data[data['请求接口类别'] == interface_type]
使用 Pandas 的数据筛选功能,根据指定的请求接口类别从整个数据集中筛选出相关的数据。
-
数据格式的转换和解析
final_data = []
for i in interface_type_data.index:
inner_data = {}
for d in interface_type_data.iloc[[i]]:
inner_data[d] = interface_type_data[d][i]
final_data.append(inner_data)
遍历筛选出的数据集,将每一行数据转换为字典,并添加到 final_data
列表中。这样,最终 final_data
中存储的是一个字典列表,每个字典代表一个测试用例。
-
返回最终数据
return final_data
将处理好的测试用例数据返回给调用者。
通过以上步骤,利用 Pandas 提供的数据处理功能,从 Excel 文件中提取特定接口类型的测试用例数据,并以适合测试框架使用的格式返回。
代码示例:
import pandas as pd
def get_excel_case_data(interface_type):
data = pd.read_excel('./case_data/慕慕生鲜接口测试用例.xlsx')
interface_type_data = data[data['请求接口类别']==interface_type]
final_data = []
# print(interface_type_data)
for i in interface_type_data.index:
inner_data = {}
for d in interface_type_data.iloc[[i]]:
inner_data[d] = interface_type_data[d][i]
final_data.append(inner_data)
# return interface_type_data
return final_data
接下来,将使用 Pytest 的 @pytest.mark.parametrize
装饰器,结合从 Excel 文件中读取的测试用例数据,对登录接口进行了参数化测试,具体思路如下:
-
装饰器参数
@pytest.mark.parametrize(['case_id', 'title', 'interface_type', 'url', 'input_data', 'data_type', 'method', 'if_login', 'expect'], ue.get_excel_case_data("登录"))
-
@pytest.mark.parametrize
装饰器用于参数化测试,允许将多组参数传递给测试函数。 -
装饰器的参数包含了测试函数中需要使用的参数名列表,以及通过调用
ue.get_excel_case_data("登录")
获取的测试数据。
-
测试函数
def test_excel_data_login(case_id, title, interface_type, url, input_data, data_type, method, if_login, expect):
-
定义了一个测试函数,参数列表与装饰器中的参数名一一对应。
-
测试逻辑
if method == "get":
response = requests.get(url1 + url, json.loads(input_data))
assert 200 == response.status_code
print(json.loads(response.text))
assert int(expect) == json.loads(response.text)["status"]
elif method == "post":
if data_type == "form":
response = requests.post(url1 + url, data=json.loads(input_data))
elif data_type == "json":
response = requests.post(url1 + url, json=json.loads(input_data))
assert 200 == response.status_code
assert int(expect) == json.loads(response.text)['status']
-
根据测试数据中的请求方式 (
method
) 进行不同的 HTTP 请求,然后验证响应的状态码和预期结果。
通过以上代码的参数化测试的方式,使用 Excel 文件中的测试数据对登录接口进行多次测试,确保接口在不同情况下的行为符合预期。
五、Excel参数化实现添加购物车自动化测试-前置环境
-
创建config、const 和 conftest配置文件
这三个文件的创建和使用,有助于将配置信息、常量和共享的 fixtures 组织得更加清晰,并提高代码的可维护性,这三个文件的具体作用如下:
-
config 文件:
config
文件用于存放项目的配置信息,例如接口地址、数据库连接信息等。这样,你可以将这些配置信息集中存放,方便统一管理和修改。通过这个文件,你可以轻松地修改项目的配置而无需在代码中硬编码配置信息。
-
const 文件:
const
文件通常用于存放项目中的常量,例如一些固定的字符串、特定的数值等。在自动化测试中,常常会用到一些固定的值,例如接口地址、特定的用户名、密码等。将这些常量存放在 const
文件中,有助于提高代码的可维护性和可读性。
代码示例:
URL="http://*************"
-
conftest 文件:
conftest
文件是 pytest 测试框架的一个特殊文件,用于存放在整个测试项目中共享的 fixtures(夹具)和配置。在你的测试过程中,可能有一些操作是在多个测试用例之间共享的,例如获取登录 token、初始化测试数据等。将这些操作定义为 fixtures 并存放在 conftest
文件中,可以使得它们在整个测试项目中都可用,而不需要在每个测试文件中都进行重复定义。
#获取全局token
import pytest
import requests
import json
from config.const import URL
@pytest.fixture(scope="session",autouse=True)
def get_login_token():
login_url = "/loginWithJwt"
login_data = {
"userName":"******",
"password":"12345678"
}
login_response = requests.get(URL+login_url,
login_data)
data = json.loads(login_response.text)
jwt_token = data['data']
return jwt_token
-
导入依赖模块
使用
import
语句导入了pytest
、requests
、json
以及一些自定义的模块,包括config.const
、utils.mysql_utils
和utils.excel_utils
。这些模块包含了项目的配置信息、数据库操作的工具函数以及 Excel 操作的工具函数。
import pytest
import requests
import json
from config.const import URL
import utils.mysql_utils as um
import utils.excel_utils as ue
-
定义 fixtures
-
使用
@pytest.fixture()
装饰器定义了两个 fixtures,分别是get_token
和get_params
。 -
get_token
用于获取登录 token,依赖于名为get_login_token
的另一个 fixture。这样,每个测试用例在执行前都会先获取登录 token。 -
get_params
用于获取购物车测试用例的参数,通过调用ue.get_excel_case_data("购物车")
从 Excel 表格中读取购物车测试数据。
代码示例:
@pytest.fixture()
def get_token(get_login_token):
return get_login_token
@pytest.fixture()
def get_params():
return ue.get_excel_case_data("购物车")
-
测试用例函数
-
定义了一个测试用例函数
test_excel_cart_add
,接受两个参数get_token
和get_params
,分别是前面定义的 fixtures。 -
在测试用例函数中,首先获取了购物车测试数据
params
和登录 tokenjwt_token
。 -
打印了获取到的购物车测试数据。
代码示例:
def test_excel_cart_add(get_token,get_params):
params = get_params
jwt_token = get_token
print(params)
这段代码的主要目的是为了测试购物车添加功能,其中使用了 pytest 的 fixtures 来方便地管理测试用例的前置条件。通过 fixtures,可以在测试用例中灵活地获取所需的数据或执行所需的操作。在这个例子中,get_token
和 get_params
fixtures 提供了测试用例执行所需的登录 token 和购物车测试数据。
六、Excel参数化实现添加购物车自动化测试-代码
-
导入必要的模块
pytest、requests、json 模块以及自定义的模块 config.const
、utils.mysql_utils
和 utils.excel_utils。
-
定义两个 fixtures
-
get_token
获取登录 token,依赖于名为get_login_token
的另一个 fixture。 -
get_params
从 Excel 表格中读取购物车测试数据。
-
编写测试用例函数
test_excel_cart_add
接受两个参数 get_token
和 get_params
-
获取购物车测试数据
params
和登录 tokenjwt_token
代码示例:
def test_excel_cart_add(get_token,get_params):
params = get_params
jwt_token = get_token
for request_data in params:
print(request_data)
case_id = request_data['用例编号']
title = request_data['用例标题']
interface_type = request_data['请求接口类别']
url = request_data['请求地址']
input_data = request_data['输入数据']
data_type = request_data['数据格式']
method = request_data['请求方式']
if_login = request_data['是否需要登录']
expect = request_data['期望结果']
-
遍历购物车测试数据,对每组数据执行以下操作
-
提取测试数据中的各项参数。
-
根据测试数据中的登录标志
if_login
判断是否需要携带登录 token。 -
发送相应的请求,并根据响应进行断言验证。
代码示例:
if if_login == 1:
headers = {
"jwt_token":jwt_token
}
if method == "get":
response = requests.get(URL+url,
data=input_data,
headers=headers)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
elif method == "post":
if data_type == "form":
response = requests.post(URL+url,
data=input_data,
headers=headers)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
elif data_type == "json":
if data_type == "form":
response = requests.post(URL+url,
json=input_data,
headers=headers)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
elif if_login == 0:
if method == "get":
response = requests.get(URL+url,
data=input_data)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
elif method == "post":
if data_type == "form":
response = requests.post(URL+url,
data=input_data)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
elif data_type == "json":
if data_type == "form":
response = requests.post(URL+url,
json=input_data)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
总体来说,这段代码可以用于执行购物车接口测试的自动化测试脚本:
通过 fixtures 和测试用例的参数化,实现了对购物车接口的批量测试,并根据测试数据中的登录标志选择是否携带登录 token。
七、课程总结与思考
-
学习框架
-
学习思考
除了接口测试自动化测试,Python还可以做什么?
在正式分享接口自动化测试实战的内容之前,你们可以跟着我的思路思考下这些问题:
-
如何实现单个接口请求的测试?
-
如何实现登录的Excel文件测试用例的参数化?
-
如何实现登录的MySQL数据库测试用例参数化?
-
添加购物车的登录状态该如何处理?
-
测试用例中的字段该如何使用?
-
如何“优雅”的实现添加购物车的测试用例?
之前有陆陆续续跟着看我学习笔记的宝子肯定知道,以上这6个问题的理论知识点在之前的系列笔记中都有讲过,还没看过的记得倒回去补补课呐!不然今天这篇文章你也会跟不上的
一、PyMySQL原生结合fixture实现参数化测试--环境
-
创建并命名新的工程
-
检查python环境配置
pip list
-
编写数据库工具模块
作用:包含用于操作数据库的方法,例如连接数据库、执行查询——其他模块将依赖于这些数据库操作的方法。
前后关系:
-
定义
get_sql_connection
方法,用于连接数据库。 -
定义
get_mqsql_case_data
方法,通过连接数据库执行 SQL 查询,获取测试数据。
代码示例:
#在本py文件中书写的全部都是能够很方便地操作数据库的方法
import pymysql
def get_sql_connection():
db_info = {
"host":"***********",
"user":"root",
"password":"********",
"database":"school_manage_sys",
"charset":"utf8"
}
conn = pymysql.connect(**db_info)
return conn
def get_mqsql_case_data(interface_type):
conn = get_sql_connection()
sql = "select * from mumu where interface_type = '{}'".format(interface_type)
cursor = conn.cursor()
cursor.execute(sql)
result = cursor.fetchall()
return result
-
编写测试用例模块
作用:包含了测试用例和 Fixture 的定义,主要负责实际的测试逻辑,测试用例和 Fixture 使用了数据库工具模块中的方法——这个模块中的测试用例依赖于数据库操作。
前后关系:
-
在文件中通过
import requests
导入了requests
模块,用于发送 HTTP 请求。 -
通过
from utils.mqsql_utils import get_mqsql_case_data
导入了get_mqsql_case_data
方法,用于从数据库获取测试数据。 -
定义
get_mysql_login_data
Fixture,通过参数化的方式获取数据库中的测试数据。 -
定义
test_mysql_login1
测试用例,通过 Fixture 获取的测试数据进行实际的测试操作。
代码示例:
#使用数据库原生集合fixture 进行参数化(即不用pandas)
import pytest
import requests
#导入get_mqsql_case_data方法的两种方式
from utils.mysql_utils import get_mqsql_case_data
#import utils.mqsql_utils as um
#借助一个工具方法,帮助获取数据库中的数据
@pytest.fixture(params=get_mqsql_case_data("登录"))
def get_mysql_login_data(request):
return request.param
def test_mysql_login1(get_mysql_login_data):
print(get_mysql_login_data)
-
编写测试入口模块
作用:作为测试的入口文件,执行 pytest.main(["-vs"])
启动测试。
前后关系:这个文件主要负责启动整个测试框架,调用 pytest 运行测试。
代码示例:
import pytest
if name == '__main__':
pytest.main(["-vs"])
二、PyMySQL原生结合fixture实现参数化测试--代码
-
导入所需的库和模块
包括 pytest
、requests
、json
,以及从 utils.mysql_utils
模块中导入了 get_mqsql_case_data
方法。
-
定义
url1
变量
该变量存储了被测试的服务器地址。
-
创建参数化fixture
使用 PyTest 的 @pytest.fixture
装饰器创建了一个参数化的 fixture get_mysql_login_data
,该 fixture 使用了 get_mqsql_case_data("登录")
方法获取登录接口的测试数据。
-
定义测试函数
定义一个测试函数 test_mysql_login1
,该函数使用了 get_mysql_login_data
这个 fixture,通过参数获取了测试数据。
-
发送HTTP请求
在测试函数中,通过 requests
发送 HTTP 请求,根据测试数据中的 method
字段判断使用 GET 还是 POST 请求。
根据测试数据中的 data_type
字段判断数据格式,如果是 "form",则使用 data
参数发送 form 数据;如果是 "json",则使用 json
参数发送 JSON 数据。
-
对响应进行断言
判断状态码和期望结果是否符合测试数据中的期望值。
代码示例:
import pytest
import requests
import json
#导入get_mqsql_case_data方法的两种方式
from utils.mysql_utils import get_mqsql_case_data
#import utils.mqsql_utils as um
url1 = "http://*************"
#借助一个工具方法,帮助获取数据库中的数据
@pytest.fixture(params=get_mqsql_case_data("登录"))
def get_mysql_login_data(request):
return request.param
def test_mysql_login1(get_mysql_login_data):
print(get_mysql_login_data)
id = get_mysql_login_data[0]
case_id = get_mysql_login_data[1]
title = get_mysql_login_data[2]
interface_type = get_mysql_login_data[3]
url = get_mysql_login_data[4]
input_data = get_mysql_login_data[5]
data_type = get_mysql_login_data[6]
method = get_mysql_login_data[7]
if_login = get_mysql_login_data[8]
expect = get_mysql_login_data[9]
if method == "get":
response = requests.get(url1 + url,json.loads(input_data))
assert 200 == response.status_code
print(json.loads(response.text))
assert int(expect) == json.loads(response.text)["status"]
elif method == "post":
if data_type == "form":
response = requests.post(url1 + url,data=json.loads(input_data))
elif data_type == "json":
response = requests.post(url1 + url,json=json.loads(input_data))
assert 200 == response.status_code
assert int(expect) == json.loads(response.text)['status']
三、PyMySQL结合Pandas&fixture实现登录自动化测试
-
建立 MySQL 数据库的连接
get_sql_connection()
函数:用于建立与 MySQL 数据库的连接。
通过配置数据库连接信息,使用 pymysql.connect() 方法创建一个数据库连接对象,并返回该对象。
-
获取数据库中特定接口类型的数据
get_mysql_case_data(interface_type)
函数:用于获取数据库中特定接口类型的数据。函数中通过 get_sql_connection()
获取数据库连接,执行 SQL 查询语句,获取结果,最后返回查询结果。
-
使用pandas库读取对象
get_mysql_case_data_for_pandas(interface_type)
函数:类似于 get_mysql_case_data(interface_type)
,不同之处在于该函数使用 pandas 库的 pd.read_sql
方法,将 SQL 查询结果直接读取为一个 DataFrame 对象。然后,它将 DataFrame 对象转换为一个字典列表,每个字典表示一个接口数据记录。最终,返回这个字典列表。
代码示例:
import pandas as pd
import pymysql
def get_sql_connection():
db_info = {
"host":"192.168.21.101",
"user":"root",
"password":"123456",
"database":"school_manage_sys",
"charset":"utf8"
}
conn = pymysql.connect(**db_info)
return conn
def get_mysql_case_data(interface_type):
conn = get_sql_connection()
sql = "select * from mumu where interface_type = '{}'".format(interface_type)
cursor = conn.cursor()
cursor.execute(sql)
result = cursor.fetchall()
return result
#声明一个工具函数
def get_mysql_case_data_for_pandas(interface_type):
conn = get_sql_connection()
sql = "select * from mumu where interface_type = '{}'".format(interface_type)
interface_type_data = pd.read_sql(sql,conn)
#数据格式的转换和解析
final_data = []
#print(interface_type_data)
for i in interface_type_data.index:
inner_data = {}
for d in interface_type_data.iloc[[i]]:
inner_data[d] = interface_type_data[d][i]
final_data.append(inner_data)
#return interface_type_data
return final_data
四、Excel参数化实现登录自动化测试
-
创建接口自动化测试用例文件夹
接下来需要从一个 Excel 文件中读取测试用例数据,根据指定的请求接口类别(interface_type
)筛选出相关的测试用例数据,并将其以字典的形式存储在一个列表中返回。
-
导入 pandas 模块
import pandas as pd
-
定义
get_excel_case_data
函数
def get_excel_case_data(interface_type):
-
读取 Excel 文件数据
data = pd.read_excel('./case_data/第三章接口测试用例.xlsx')
这里使用 pd.read_excel
函数读取指定路径下的 Excel 文件中的数据,并将其存储在 data
变量中。
-
筛选指定接口类型的数据
interface_type_data = data[data['请求接口类别'] == interface_type]
使用 Pandas 的数据筛选功能,根据指定的请求接口类别从整个数据集中筛选出相关的数据。
-
数据格式的转换和解析
final_data = []
for i in interface_type_data.index:
inner_data = {}
for d in interface_type_data.iloc[[i]]:
inner_data[d] = interface_type_data[d][i]
final_data.append(inner_data)
遍历筛选出的数据集,将每一行数据转换为字典,并添加到 final_data
列表中。这样,最终 final_data
中存储的是一个字典列表,每个字典代表一个测试用例。
-
返回最终数据
return final_data
将处理好的测试用例数据返回给调用者。
通过以上步骤,利用 Pandas 提供的数据处理功能,从 Excel 文件中提取特定接口类型的测试用例数据,并以适合测试框架使用的格式返回。
代码示例:
import pandas as pd
def get_excel_case_data(interface_type):
data = pd.read_excel('./case_data/慕慕生鲜接口测试用例.xlsx')
interface_type_data = data[data['请求接口类别']==interface_type]
final_data = []
# print(interface_type_data)
for i in interface_type_data.index:
inner_data = {}
for d in interface_type_data.iloc[[i]]:
inner_data[d] = interface_type_data[d][i]
final_data.append(inner_data)
# return interface_type_data
return final_data
接下来,将使用 Pytest 的 @pytest.mark.parametrize
装饰器,结合从 Excel 文件中读取的测试用例数据,对登录接口进行了参数化测试,具体思路如下:
-
装饰器参数
@pytest.mark.parametrize(['case_id', 'title', 'interface_type', 'url', 'input_data', 'data_type', 'method', 'if_login', 'expect'], ue.get_excel_case_data("登录"))
-
@pytest.mark.parametrize
装饰器用于参数化测试,允许将多组参数传递给测试函数。 -
装饰器的参数包含了测试函数中需要使用的参数名列表,以及通过调用
ue.get_excel_case_data("登录")
获取的测试数据。
-
测试函数
def test_excel_data_login(case_id, title, interface_type, url, input_data, data_type, method, if_login, expect):
-
定义了一个测试函数,参数列表与装饰器中的参数名一一对应。
-
测试逻辑
if method == "get":
response = requests.get(url1 + url, json.loads(input_data))
assert 200 == response.status_code
print(json.loads(response.text))
assert int(expect) == json.loads(response.text)["status"]
elif method == "post":
if data_type == "form":
response = requests.post(url1 + url, data=json.loads(input_data))
elif data_type == "json":
response = requests.post(url1 + url, json=json.loads(input_data))
assert 200 == response.status_code
assert int(expect) == json.loads(response.text)['status']
-
根据测试数据中的请求方式 (
method
) 进行不同的 HTTP 请求,然后验证响应的状态码和预期结果。
通过以上代码的参数化测试的方式,使用 Excel 文件中的测试数据对登录接口进行多次测试,确保接口在不同情况下的行为符合预期。
五、Excel参数化实现添加购物车自动化测试-前置环境
-
创建config、const 和 conftest配置文件
这三个文件的创建和使用,有助于将配置信息、常量和共享的 fixtures 组织得更加清晰,并提高代码的可维护性,这三个文件的具体作用如下:
-
config 文件:
config
文件用于存放项目的配置信息,例如接口地址、数据库连接信息等。这样,你可以将这些配置信息集中存放,方便统一管理和修改。通过这个文件,你可以轻松地修改项目的配置而无需在代码中硬编码配置信息。
-
const 文件:
const
文件通常用于存放项目中的常量,例如一些固定的字符串、特定的数值等。在自动化测试中,常常会用到一些固定的值,例如接口地址、特定的用户名、密码等。将这些常量存放在 const
文件中,有助于提高代码的可维护性和可读性。
代码示例:
URL="http://*************"
-
conftest 文件:
conftest
文件是 pytest 测试框架的一个特殊文件,用于存放在整个测试项目中共享的 fixtures(夹具)和配置。在你的测试过程中,可能有一些操作是在多个测试用例之间共享的,例如获取登录 token、初始化测试数据等。将这些操作定义为 fixtures 并存放在 conftest
文件中,可以使得它们在整个测试项目中都可用,而不需要在每个测试文件中都进行重复定义。
#获取全局token
import pytest
import requests
import json
from config.const import URL
@pytest.fixture(scope="session",autouse=True)
def get_login_token():
login_url = "/loginWithJwt"
login_data = {
"userName":"******",
"password":"12345678"
}
login_response = requests.get(URL+login_url,
login_data)
data = json.loads(login_response.text)
jwt_token = data['data']
return jwt_token
-
导入依赖模块
使用
import
语句导入了pytest
、requests
、json
以及一些自定义的模块,包括config.const
、utils.mysql_utils
和utils.excel_utils
。这些模块包含了项目的配置信息、数据库操作的工具函数以及 Excel 操作的工具函数。
import pytest
import requests
import json
from config.const import URL
import utils.mysql_utils as um
import utils.excel_utils as ue
-
定义 fixtures
-
使用
@pytest.fixture()
装饰器定义了两个 fixtures,分别是get_token
和get_params
。 -
get_token
用于获取登录 token,依赖于名为get_login_token
的另一个 fixture。这样,每个测试用例在执行前都会先获取登录 token。 -
get_params
用于获取购物车测试用例的参数,通过调用ue.get_excel_case_data("购物车")
从 Excel 表格中读取购物车测试数据。
代码示例:
@pytest.fixture()
def get_token(get_login_token):
return get_login_token
@pytest.fixture()
def get_params():
return ue.get_excel_case_data("购物车")
-
测试用例函数
-
定义了一个测试用例函数
test_excel_cart_add
,接受两个参数get_token
和get_params
,分别是前面定义的 fixtures。 -
在测试用例函数中,首先获取了购物车测试数据
params
和登录 tokenjwt_token
。 -
打印了获取到的购物车测试数据。
代码示例:
def test_excel_cart_add(get_token,get_params):
params = get_params
jwt_token = get_token
print(params)
这段代码的主要目的是为了测试购物车添加功能,其中使用了 pytest 的 fixtures 来方便地管理测试用例的前置条件。通过 fixtures,可以在测试用例中灵活地获取所需的数据或执行所需的操作。在这个例子中,get_token
和 get_params
fixtures 提供了测试用例执行所需的登录 token 和购物车测试数据。
六、Excel参数化实现添加购物车自动化测试-代码
-
导入必要的模块
pytest、requests、json 模块以及自定义的模块 config.const
、utils.mysql_utils
和 utils.excel_utils。
-
定义两个 fixtures
-
get_token
获取登录 token,依赖于名为get_login_token
的另一个 fixture。 -
get_params
从 Excel 表格中读取购物车测试数据。
-
编写测试用例函数
test_excel_cart_add
接受两个参数 get_token
和 get_params
-
获取购物车测试数据
params
和登录 tokenjwt_token
代码示例:
def test_excel_cart_add(get_token,get_params):
params = get_params
jwt_token = get_token
for request_data in params:
print(request_data)
case_id = request_data['用例编号']
title = request_data['用例标题']
interface_type = request_data['请求接口类别']
url = request_data['请求地址']
input_data = request_data['输入数据']
data_type = request_data['数据格式']
method = request_data['请求方式']
if_login = request_data['是否需要登录']
expect = request_data['期望结果']
-
遍历购物车测试数据,对每组数据执行以下操作
-
提取测试数据中的各项参数。
-
根据测试数据中的登录标志
if_login
判断是否需要携带登录 token。 -
发送相应的请求,并根据响应进行断言验证。
代码示例:
if if_login == 1:
headers = {
"jwt_token":jwt_token
}
if method == "get":
response = requests.get(URL+url,
data=input_data,
headers=headers)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
elif method == "post":
if data_type == "form":
response = requests.post(URL+url,
data=input_data,
headers=headers)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
elif data_type == "json":
if data_type == "form":
response = requests.post(URL+url,
json=input_data,
headers=headers)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
elif if_login == 0:
if method == "get":
response = requests.get(URL+url,
data=input_data)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
elif method == "post":
if data_type == "form":
response = requests.post(URL+url,
data=input_data)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
elif data_type == "json":
if data_type == "form":
response = requests.post(URL+url,
json=input_data)
assert 200 == response.status_code
assert expect == json.loads(response.text)['status']
总体来说,这段代码可以用于执行购物车接口测试的自动化测试脚本:
通过 fixtures 和测试用例的参数化,实现了对购物车接口的批量测试,并根据测试数据中的登录标志选择是否携带登录 token。
七、课程总结与思考
-
学习框架
-
学习思考
除了接口测试自动化测试,Python还可以做什么?