【电商接口测试】自学接口测试系列|生鲜电商平台的接口自动化测试实战

在正式分享接口自动化测试实战的内容之前,你们可以跟着我的思路思考下这些问题:

  1. 如何实现单个接口请求的测试?

  2. 如何实现登录的Excel文件测试用例的参数化?

  3. 如何实现登录的MySQL数据库测试用例参数化?

  4. 添加购物车的登录状态该如何处理?

  5. 测试用例中的字段该如何使用?

  6. 如何“优雅”的实现添加购物车的测试用例?

一、PyMySQL原生结合fixture实现参数化测试--环境

  1. 创建并命名新的工程

 
pip list

  1. 编写数据库工具模块

作用:包含用于操作数据库的方法,例如连接数据库、执行查询——其他模块将依赖于这些数据库操作的方法。

前后关系:

  • 定义 get_sql_connection 方法,用于连接数据库。

  • 定义 get_mqsql_case_data 方法,通过连接数据库执行 SQL 查询,获取测试数据。

代码示例:

#在本py文件中书写的全部都是能够很方便地操作数据库的方法import pymysqldef 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
 

  1. 编写测试用例模块

作用:包含了测试用例和 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  pytestimport  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)

  1. 编写测试入口模块

作用:作为测试的入口文件,执行 pytest.main(["-vs"]) 启动测试。

前后关系:这个文件主要负责启动整个测试框架,调用 pytest 运行测试。

代码示例:

 
import  pytestif name == '__main__':    pytest.main(["-vs"])

二、PyMySQL原生结合fixture实现参数化测试--代码

  1. 导入所需的库和模块

包括 pytestrequestsjson,以及从 utils.mysql_utils 模块中导入了 get_mqsql_case_data 方法。

  1. 定义 url1 变量

该变量存储了被测试的服务器地址。

  1. 创建参数化fixture

使用 PyTest 的 @pytest.fixture 装饰器创建了一个参数化的 fixture get_mysql_login_data,该 fixture 使用了 get_mqsql_case_data("登录") 方法获取登录接口的测试数据。

  1. 定义测试函数

定义一个测试函数 test_mysql_login1,该函数使用了 get_mysql_login_data 这个 fixture,通过参数获取了测试数据。

  1. 发送HTTP请求

在测试函数中,通过 requests 发送 HTTP 请求,根据测试数据中的 method 字段判断使用 GET 还是 POST 请求。

根据测试数据中的 data_type 字段判断数据格式,如果是 "form",则使用 data 参数发送 form 数据;如果是 "json",则使用 json 参数发送 JSON 数据。

  1. 对响应进行断言

判断状态码和期望结果是否符合测试数据中的期望值。

代码示例:

 
import  pytestimport  requestsimport 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实现登录自动化测试

  1. 建立 MySQL 数据库的连接

get_sql_connection() 函数:用于建立与 MySQL 数据库的连接。

通过配置数据库连接信息,使用 pymysql.connect() 方法创建一个数据库连接对象,并返回该对象。

  1. 获取数据库中特定接口类型的数据

get_mysql_case_data(interface_type) 函数:用于获取数据库中特定接口类型的数据。函数中通过 get_sql_connection() 获取数据库连接,执行 SQL 查询语句,获取结果,最后返回查询结果。

  1. 使用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 pdimport pymysqldef 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参数化实现登录自动化测试

  1. 创建接口自动化测试用例文件夹

图片

接下来需要从一个 Excel 文件中读取测试用例数据,根据指定的请求接口类别(interface_type)筛选出相关的测试用例数据,并将其以字典的形式存储在一个列表中返回。

  1. 导入 pandas 模块

 
import pandas as pd

  1. 定义get_excel_case_data 函数

 
def get_excel_case_data(interface_type):

  1. 读取 Excel 文件数据

 
data = pd.read_excel('./case_data/第三章接口测试用例.xlsx')

这里使用 pd.read_excel 函数读取指定路径下的 Excel 文件中的数据,并将其存储在 data 变量中。

  1. 筛选指定接口类型的数据

 
interface_type_data = data[data['请求接口类别'] == interface_type]

使用 Pandas 的数据筛选功能,根据指定的请求接口类别从整个数据集中筛选出相关的数据。

  1. 数据格式的转换和解析

 
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 中存储的是一个字典列表,每个字典代表一个测试用例。

  1. 返回最终数据

 
return final_data

将处理好的测试用例数据返回给调用者。

通过以上步骤,利用 Pandas 提供的数据处理功能,从 Excel 文件中提取特定接口类型的测试用例数据,并以适合测试框架使用的格式返回。

代码示例:

 
import  pandas as pddef 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 文件中读取的测试用例数据,对登录接口进行了参数化测试,具体思路如下:

  1. 装饰器参数

     

    @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("登录") 获取的测试数据。

  1. 测试函数

 

def test_excel_data_login(case_id, title, interface_type, url, input_data, data_type, method, if_login, expect):

  • 定义了一个测试函数,参数列表与装饰器中的参数名一一对应。

  1. 测试逻辑

 
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参数化实现添加购物车自动化测试-前置环境

  1. 创建config、const 和 conftest配置文件

这三个文件的创建和使用,有助于将配置信息、常量和共享的 fixtures 组织得更加清晰,并提高代码的可维护性,这三个文件的具体作用如下:

  • config 文件:

config 文件用于存放项目的配置信息,例如接口地址、数据库连接信息等。这样,你可以将这些配置信息集中存放,方便统一管理和修改。通过这个文件,你可以轻松地修改项目的配置而无需在代码中硬编码配置信息。

  • const 文件:

const 文件通常用于存放项目中的常量,例如一些固定的字符串、特定的数值等。在自动化测试中,常常会用到一些固定的值,例如接口地址、特定的用户名、密码等。将这些常量存放在 const 文件中,有助于提高代码的可维护性和可读性。

代码示例:

 
URL="http://*************"

  • conftest 文件:

conftest 文件是 pytest 测试框架的一个特殊文件,用于存放在整个测试项目中共享的 fixtures(夹具)和配置。在你的测试过程中,可能有一些操作是在多个测试用例之间共享的,例如获取登录 token、初始化测试数据等。将这些操作定义为 fixtures 并存放在 conftest 文件中,可以使得它们在整个测试项目中都可用,而不需要在每个测试文件中都进行重复定义。

 
#获取全局tokenimport pytestimport  requestsimport jsonfrom 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
  1. 导入依赖模块

      使用 import 语句导入了 pytestrequestsjson 以及一些自定义的模块,包括 config.constutils.mysql_utils 和 utils.excel_utils。这些模块包含了项目的配置信息、数据库操作的工具函数以及 Excel 操作的工具函数。

 
import pytestimport requestsimport jsonfrom config.const import URLimport utils.mysql_utils as umimport utils.excel_utils as ue

  1. 定义 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("购物车")

  1. 测试用例函数

  • 定义了一个测试用例函数 test_excel_cart_add,接受两个参数 get_token 和 get_params,分别是前面定义的 fixtures。

  • 在测试用例函数中,首先获取了购物车测试数据 params 和登录 token jwt_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参数化实现添加购物车自动化测试-代码

  1. 导入必要的模块

pytest、requests、json 模块以及自定义的模块 config.constutils.mysql_utils 和 utils.excel_utils。

  1. 定义两个 fixtures

  • get_token 获取登录 token,依赖于名为 get_login_token 的另一个 fixture。

  • get_params 从 Excel 表格中读取购物车测试数据。

  1. 编写测试用例函数 test_excel_cart_add

接受两个参数 get_token 和 get_params

  1. 获取购物车测试数据 params 和登录 token jwt_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['期望结果']

  1. 遍历购物车测试数据,对每组数据执行以下操作

  • 提取测试数据中的各项参数。

  • 根据测试数据中的登录标志 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。

七、课程总结与思考

  1. 学习框架

图片

  1. 学习思考

除了接口测试自动化测试,Python还可以做什么?

图片

在正式分享接口自动化测试实战的内容之前,你们可以跟着我的思路思考下这些问题:

  1. 如何实现单个接口请求的测试?

  2. 如何实现登录的Excel文件测试用例的参数化?

  3. 如何实现登录的MySQL数据库测试用例参数化?

  4. 添加购物车的登录状态该如何处理?

  5. 测试用例中的字段该如何使用?

  6. 如何“优雅”的实现添加购物车的测试用例?

之前有陆陆续续跟着看我学习笔记的宝子肯定知道,以上这6个问题的理论知识点在之前的系列笔记中都有讲过,还没看过的记得倒回去补补课呐!不然今天这篇文章你也会跟不上的

图片

一、PyMySQL原生结合fixture实现参数化测试--环境

  1. 创建并命名新的工程

图片

  1. 检查python环境配置

 
pip list

图片

  1. 编写数据库工具模块

作用:包含用于操作数据库的方法,例如连接数据库、执行查询——其他模块将依赖于这些数据库操作的方法。

前后关系:

  • 定义 get_sql_connection 方法,用于连接数据库。

  • 定义 get_mqsql_case_data 方法,通过连接数据库执行 SQL 查询,获取测试数据。

代码示例:

#在本py文件中书写的全部都是能够很方便地操作数据库的方法import pymysqldef 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
 

  1. 编写测试用例模块

作用:包含了测试用例和 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  pytestimport  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)

  1. 编写测试入口模块

作用:作为测试的入口文件,执行 pytest.main(["-vs"]) 启动测试。

前后关系:这个文件主要负责启动整个测试框架,调用 pytest 运行测试。

代码示例:

 
import  pytestif name == '__main__':    pytest.main(["-vs"])

二、PyMySQL原生结合fixture实现参数化测试--代码

  1. 导入所需的库和模块

包括 pytestrequestsjson,以及从 utils.mysql_utils 模块中导入了 get_mqsql_case_data 方法。

  1. 定义 url1 变量

该变量存储了被测试的服务器地址。

  1. 创建参数化fixture

使用 PyTest 的 @pytest.fixture 装饰器创建了一个参数化的 fixture get_mysql_login_data,该 fixture 使用了 get_mqsql_case_data("登录") 方法获取登录接口的测试数据。

  1. 定义测试函数

定义一个测试函数 test_mysql_login1,该函数使用了 get_mysql_login_data 这个 fixture,通过参数获取了测试数据。

  1. 发送HTTP请求

在测试函数中,通过 requests 发送 HTTP 请求,根据测试数据中的 method 字段判断使用 GET 还是 POST 请求。

根据测试数据中的 data_type 字段判断数据格式,如果是 "form",则使用 data 参数发送 form 数据;如果是 "json",则使用 json 参数发送 JSON 数据。

  1. 对响应进行断言

判断状态码和期望结果是否符合测试数据中的期望值。

代码示例:

 
import  pytestimport  requestsimport 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实现登录自动化测试

  1. 建立 MySQL 数据库的连接

get_sql_connection() 函数:用于建立与 MySQL 数据库的连接。

通过配置数据库连接信息,使用 pymysql.connect() 方法创建一个数据库连接对象,并返回该对象。

  1. 获取数据库中特定接口类型的数据

get_mysql_case_data(interface_type) 函数:用于获取数据库中特定接口类型的数据。函数中通过 get_sql_connection() 获取数据库连接,执行 SQL 查询语句,获取结果,最后返回查询结果。

  1. 使用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 pdimport pymysqldef 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参数化实现登录自动化测试

  1. 创建接口自动化测试用例文件夹

图片

接下来需要从一个 Excel 文件中读取测试用例数据,根据指定的请求接口类别(interface_type)筛选出相关的测试用例数据,并将其以字典的形式存储在一个列表中返回。

  1. 导入 pandas 模块

 
import pandas as pd

  1. 定义get_excel_case_data 函数

 
def get_excel_case_data(interface_type):

  1. 读取 Excel 文件数据

 
data = pd.read_excel('./case_data/第三章接口测试用例.xlsx')

这里使用 pd.read_excel 函数读取指定路径下的 Excel 文件中的数据,并将其存储在 data 变量中。

  1. 筛选指定接口类型的数据

 
interface_type_data = data[data['请求接口类别'] == interface_type]

使用 Pandas 的数据筛选功能,根据指定的请求接口类别从整个数据集中筛选出相关的数据。

  1. 数据格式的转换和解析

 
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 中存储的是一个字典列表,每个字典代表一个测试用例。

  1. 返回最终数据

 
return final_data

将处理好的测试用例数据返回给调用者。

通过以上步骤,利用 Pandas 提供的数据处理功能,从 Excel 文件中提取特定接口类型的测试用例数据,并以适合测试框架使用的格式返回。

代码示例:

 
import  pandas as pddef 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 文件中读取的测试用例数据,对登录接口进行了参数化测试,具体思路如下:

  1. 装饰器参数

     

    @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("登录") 获取的测试数据。

  1. 测试函数

 

def test_excel_data_login(case_id, title, interface_type, url, input_data, data_type, method, if_login, expect):

  • 定义了一个测试函数,参数列表与装饰器中的参数名一一对应。

  1. 测试逻辑

 
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参数化实现添加购物车自动化测试-前置环境

  1. 创建config、const 和 conftest配置文件

这三个文件的创建和使用,有助于将配置信息、常量和共享的 fixtures 组织得更加清晰,并提高代码的可维护性,这三个文件的具体作用如下:

  • config 文件:

config 文件用于存放项目的配置信息,例如接口地址、数据库连接信息等。这样,你可以将这些配置信息集中存放,方便统一管理和修改。通过这个文件,你可以轻松地修改项目的配置而无需在代码中硬编码配置信息。

  • const 文件:

const 文件通常用于存放项目中的常量,例如一些固定的字符串、特定的数值等。在自动化测试中,常常会用到一些固定的值,例如接口地址、特定的用户名、密码等。将这些常量存放在 const 文件中,有助于提高代码的可维护性和可读性。

代码示例:

 
URL="http://*************"

  • conftest 文件:

conftest 文件是 pytest 测试框架的一个特殊文件,用于存放在整个测试项目中共享的 fixtures(夹具)和配置。在你的测试过程中,可能有一些操作是在多个测试用例之间共享的,例如获取登录 token、初始化测试数据等。将这些操作定义为 fixtures 并存放在 conftest 文件中,可以使得它们在整个测试项目中都可用,而不需要在每个测试文件中都进行重复定义。

 
#获取全局tokenimport pytestimport  requestsimport jsonfrom 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
  1. 导入依赖模块

      使用 import 语句导入了 pytestrequestsjson 以及一些自定义的模块,包括 config.constutils.mysql_utils 和 utils.excel_utils。这些模块包含了项目的配置信息、数据库操作的工具函数以及 Excel 操作的工具函数。

 
import pytestimport requestsimport jsonfrom config.const import URLimport utils.mysql_utils as umimport utils.excel_utils as ue

  1. 定义 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("购物车")

  1. 测试用例函数

  • 定义了一个测试用例函数 test_excel_cart_add,接受两个参数 get_token 和 get_params,分别是前面定义的 fixtures。

  • 在测试用例函数中,首先获取了购物车测试数据 params 和登录 token jwt_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参数化实现添加购物车自动化测试-代码

  1. 导入必要的模块

pytest、requests、json 模块以及自定义的模块 config.constutils.mysql_utils 和 utils.excel_utils。

  1. 定义两个 fixtures

  • get_token 获取登录 token,依赖于名为 get_login_token 的另一个 fixture。

  • get_params 从 Excel 表格中读取购物车测试数据。

  1. 编写测试用例函数 test_excel_cart_add

接受两个参数 get_token 和 get_params

  1. 获取购物车测试数据 params 和登录 token jwt_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['期望结果']

  1. 遍历购物车测试数据,对每组数据执行以下操作

  • 提取测试数据中的各项参数。

  • 根据测试数据中的登录标志 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。

七、课程总结与思考

  1. 学习框架

图片

  1. 学习思考

除了接口测试自动化测试,Python还可以做什么?

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值