Pytest教程:手把手带你打造一个数据分离测试框架

数据分离测试框架是一种测试框架设计模式,旨在将测试数据与测试逻辑分离,以提高测试用例的可维护性、可读性和复用性。这种框架通常用于自动化测试,特别是在接口测试、UI 测试和集成测试中非常有用。

在数据分离测试框架中,测试数据通常存储在外部文件(如 Excel、CSV、JSON 等)中,而测试逻辑则编写在测试用例中。通过将测试数据与测试逻辑分开,可以实现以下优势:

  1. 易维护性:测试数据的变化不会影响测试逻辑,反之亦然。当测试数据需要更新时,只需修改数据文件而不必修改测试用例代码。

  2. 可读性:测试用例更加清晰易读,因为数据被独立出来并以结构化的方式存储在外部文件中。

  3. 复用性:可以重复使用相同的测试逻辑,只需提供不同的测试数据即可运行多个测试场景。

  4. 扩展性:随着测试需求的增加,可以很容易地添加新的测试数据文件,而无需改动现有的测试用例。

  5. 灵活性:可以使用不同类型的数据文件进行数据分离,根据具体需求选择最适合的数据存储格式。

数据分离测试框架通常包括数据读取工具、测试逻辑编写、日志记录和报告生成等功能。通过有效地组织和管理测试数据,测试团队可以更高效地执行测试,并快速准确地识别潜在的问题。

开发一个复杂的数据驱动测试框架涉及到多个方面,包括数据读取、日志记录、邮件发送、配置文件使用以及清晰的代码目录结构等。让我们一步一步来完成这个任务。

1.创建项目目录结构

首先,创建一个新的项目目录结构,并包含以下子目录和文件:

python 复制代码
data_driven_testing_framework/
    ├── configs/
    │   └── config.ini
    ├── data/
    │   └── test_data.xlsx
    ├── logs/
    ├── tests/
    │   ├── __init__.py
    │   └── test_sample.py
    ├── utils/
    │   ├── __init__.py
    │   ├── excel_reader.py
    │   ├── logger.py
    │   ├── mailer.py
    └── pytest.ini

2.安装所需库

确保安装所需的库:

python 复制代码
pip install pytest openpyxl configparser logging yagmail

3.编写配置文件

configs/config.ini 中定义配置参数:

python 复制代码
[EMAIL]
email_address = your_email@example.com
email_password = your_email_password

[LOGGING]
log_file = logs/test.log

4. 编写工具类

utils/excel_reader.py 中编写 Excel 数据读取工具类:

python 复制代码
import openpyxl

class ExcelReader:
    @staticmethod
    def read_data(file_path):
        wb = openpyxl.load_workbook(file_path)
        sheet = wb.active
        data = []
        for row in sheet.iter_rows(min_row=2, values_only=True):
            data.append(row)
        return data

utils/logger.py 中编写日志记录工具类:

python 复制代码
import logging
import configparser

config = configparser.ConfigParser()
config.read('configs/config.ini')

log_file = config['LOGGING']['log_file']

logging.basicConfig(filename=log_file, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

utils/mailer.py 中编写发送邮件工具类:

python 复制代码
import yagmail
import configparser

config = configparser.ConfigParser()
config.read('configs/config.ini')

email_address = config['EMAIL']['email_address']
email_password = config['EMAIL']['email_password']

class Mailer:
    @staticmethod
    def send_email(subject, contents):
        yag = yagmail.SMTP(email_address, email_password)
        yag.send(to=email_address, subject=subject, contents=contents)

5.编写测试用例

tests/test_sample.py 中编写测试用例:

python 复制代码
import pytest
from utils.excel_reader import ExcelReader
from utils.logger import logging
from utils.mailer import Mailer

test_data_file = 'data/test_data.xlsx'

@pytest.mark.parametrize("data", ExcelReader.read_data(test_data_file))
def test_data_driven(data):
    logging.info(f"Running test with data: {data}")
    # Your test logic here

    assert True

def test_send_email():
    Mailer.send_email("Test Email", "This is a test email sent from the data-driven testing framework")

6.运行测试

现在你可以使用 Pytest 来运行测试。在命令行中执行以下命令:

python 复制代码
pytest -v

7.实际使用示例

在接口测试中,你可以使用这个框架来执行数据驱动测试。例如,你可以从 Excel 文件中读取测试数据,然后在测试用例中使用这些数据来调用接口,并断言结果是否符合预期。

7.1准备测试数据

首先,准备一个 Excel 文件,例如 test_data.xlsx,其中包含了不同的测试数据。假设我们要测试一个登录接口,测试数据文件内容如下:

Username Password
user1 password1
user2 password2
user3 password3

7.2编写测试用例

tests/test_sample.py 中编写测试用例,使用数据驱动的方式来运行测试:

python 复制代码
import pytest
from utils.excel_reader import ExcelReader
from utils.logger import logging
from utils.mailer import Mailer
from your_api_client_module import APIClient  # 导入你的 API 客户端模块

test_data_file = 'data/test_data.xlsx'

@pytest.mark.parametrize("username, password", ExcelReader.read_data(test_data_file))
def test_login_api(username, password):
    logging.info(f"Running test with data: Username - {username}, Password - {password}")

    # 使用测试数据调用登录接口
    api_client = APIClient()
    response = api_client.login(username, password)

    # 断言登录结果是否符合预期
    assert response.status_code == 200
    assert 'token' in response.json()

def test_send_email():
    Mailer.send_email("Test Email", "This is a test email sent from the data-driven testing framework")

在上面的示例中,我们使用 @pytest.mark.parametrize 注解来指定参数化测试数据,并在测试用例中使用这些数据来调用登录接口。通过这种方式,你可以轻松地对不同的输入数据进行测试,而无需为每组数据编写单独的测试用例。

相关推荐
爱吃生蚝的于勒3 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio13 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE15 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻19 分钟前
WPF中的依赖属性
开发语言·wpf
洋24027 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙29 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点30 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
NoneCoder1 小时前
Java企业级开发系列(1)
java·开发语言·spring·团队开发·开发
苏三有春1 小时前
PyQt5实战——UTF-8编码器功能的实现(六)
开发语言·qt
Aniay_ivy1 小时前
深入探索 Java 8 Stream 流:高效操作与应用场景
java·开发语言·python