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 注解来指定参数化测试数据,并在测试用例中使用这些数据来调用登录接口。通过这种方式,你可以轻松地对不同的输入数据进行测试,而无需为每组数据编写单独的测试用例。

相关推荐
isyangli_blog12 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb20081112 小时前
FastAPI APIRouter
开发语言·python
Benszen12 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆13 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木13 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充13 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~13 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball61613 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草14 小时前
反射、Tomcat执行
java·开发语言
雪的季节15 小时前
企业级 Qt 全功能项目
开发语言·数据库·qt