Python接口自动化测试基类封装分层处理

一、什么是接口自动化测试

接口自动化测试是指使用自动化工具和脚本来模拟用户操作,发送HTTP请求,获取接口响应数据,进行断言和验证,生成测试报告,发现接口的缺陷和问题,提高接口的质量和稳定性。

接口自动化测试的优点有:

  • 提高测试效率,节省人力和时间,可以快速地执行大量的测试用例,覆盖更多的测试场景
  • 提高测试准确性,避免人为的错误和遗漏,可以更好地检查接口的功能和性能,保证测试结果的一致性和可靠性
  • 提高测试可维护性,方便修改和扩展,可以根据需求变化和接口更新,灵活地调整测试用例,实现测试的可持续性和可复用性

二、什么是分层处理和基类封装

分层处理是指将接口自动化测试的不同部分,按照功能和职责,划分为不同的层次,实现解耦和隔离,提高代码的结构和逻辑。

基类封装是指将接口自动化测试中的通用功能和方法,抽象为一个或多个基类,实现复用和继承,提高代码的灵活性和可读性。

三、为什么要分层处理和基类封装

分层处理和基类封装是接口自动化测试的两个重要的设计原则,它们可以带来以下的好处:

  • 代码复用性高,可以减少重复代码的编写,提高开发效率,例如,可以将发送HTTP请求的功能封装为一个基类,然后在不同的测试用例中调用,避免每次都要写相同的代码
  • 代码结构清晰,可以按照功能模块进行分层,方便维护和扩展,例如,可以将测试数据、测试逻辑、测试执行、测试报告分别存放在不同的层次,实现解耦和隔离,当需要修改或增加某个部分时,不会影响其他部分
  • 代码可读性强,可以使用关键字驱动的方式,使测试用例更容易理解和编写,例如,可以将测试用例的步骤和数据,用关键字的形式表示,然后在基类中实现关键字的功能,使测试用例更接近自然语言,更符合业务需求
  • 代码灵活性高,可以使用fixture来管理各类测试资源,如数据库连接、测试数据、测试环境等,例如,可以使用pytest的fixture机制,实现测试用例的前置和后置条件,以及跨模块的调用,避免重复加载和释放
  • 代码稳定性强,可以使用conftest.py来存放公共的fixture,实现跨模块的调用,避免重复加载和释放,例如,可以在conftest.py中定义一个获取token的fixture,然后在不同的测试用例中使用,实现接口的关联和鉴权
  • 代码适应性强,可以使用pytest的插件机制,实现各种功能的扩展,如失败重跑、并发执行、测试报告等,例如,可以使用pytest-rerunfailures插件,实现失败重跑的功能,提高测试的通过率和稳定性

四、如何分层处理和基类封装

分层处理和基类封装的具体实现方法,可能因项目而异,但一般可以参考以下的示例:

  • 项目结构:可以参考以下的项目结构,将接口自动化测试分为数据层、业务层、执行层、报告层等,每个层次都有相应的文件和目录,实现代码的组织和管理
ProjectName
 ├── common                    // 定义公共库
 │   ├── __init__.py           // 
 │   ├── baseApi.py             // 基类模块
 │   ├── baseAssert.py          // 断言模块
 ├── configs                   // 配置库库
 │   ├── __init__.py            // 
 │   ├── config.py               // 配置模块
 │   ├── env.yaml                // 配置文件     
 ├── libs                      // 业务库
 │   ├── __init__.py            //
 │   ├── login.py               // 登录模块
 │   ├── XX.py                // XX模块
 ├── data                      // 数据库
 │   ├── 测试用例.xls             // 测试用例
 │   ├── 测试用例.yaml            // 测试用例     
 ├── utils                     // 工具库
 │   ├── __init__.py            // 
 │   ├── handle_excel.py         // 处理excel模块
 │   ├── handle_yaml.py          // 处理yaml模块
 ├── testCase                  // 测试用例库
 │   ├── __init__.py            // 
 │   ├── test_login.py           // 登录模块测试
 │   ├── test_XX.py            // XX模块测试
 ├── OutFiles                 // 导出库
 │   ├── report                 // 报告
 │   ├── log                    // 日志  
 │   ├── screenShot             // 截图
 ├── docs                    // 文档库
 │   ├── readme.md              // 说明文档
 ├── requirements.txt          // 项目依赖
  • 基类封装:可以参考以下的代码示例,将发送HTTP请求的功能封装为一个基类,然后在不同的测试用例中调用,避免每次都要写相同的代码
import requests

class BaseApi:
    # 定义一个发送HTTP请求的方法
    def send_request(self, method, url, **kwargs):
        # 使用requests库发送请求
        response = requests.request(method, url, **kwargs)
        # 返回响应对象
        return response
  • 关键字驱动:可以参考以下的代码示例,将测试用例的步骤和数据,用关键字的形式表示,然后在基类中实现关键字的功能,使测试用例更接近自然语言,更符合业务需求
# 定义一个测试用例的类,继承BaseApi类
class TestApi(BaseApi):
    # 定义一个测试用例的方法,使用pytest的装饰器标记
    @pytest.mark.parametrize("method, url, data, expected", [
        # 使用关键字表示测试用例的步骤和数据
        ("get", "http://example.com/api/users", None, 200),
        ("post", "http://example.com/api/users", {"name": "Alice"}, 201),
        ("put", "http://example.com/api/users/1", {"name": "Bob"}, 200),
        ("delete", "http://example.com/api/users/1", None, 204)
    ])
    def test_api(self, method, url, data, expected):
        # 调用基类的发送请求的方法,传入关键字对应的参数
        response = self.send_request(method, url, json=data)
        # 使用pytest的断言机制,验证响应状态码是否符合预期
        assert response.status_code == expected
  • fixture管理:可以参考以下的代码示例,使用fixture来管理各类测试资源,如数据库连接、测试数据、测试环境等
# 定义一个获取数据库连接的fixture
@pytest.fixture(scope="session")
def db():
    # 创建一个数据库连接对象
    db = Database()
    # 返回数据库连接对象
    yield db
    # 关闭数据库连接
    db.close()

# 定义一个获取测试数据的fixture
@pytest.fixture(scope="function")
def data():
    # 从excel文件中读取测试数据
    data = Excel().read_data("test_data.xlsx")
    # 返回测试数据
    return data

# 定义一个获取测试环境的fixture
@pytest.fixture(scope="session")
def env():
    # 从配置文件中读取测试环境
    env = Config().get_env("test_env.yaml")
    # 返回测试环境
    return env
  • conftest.py存放:可以参考以下的代码示例,使用conftest.py来存放公共的fixture,实现跨模块的调用,避免重复加载释放。conftest.py文件可以放在项目的根目录或者任意子目录下,pytest会自动识别并加载它。在conftest.py文件中,可以定义一些通用的fixture,比如登录、初始化数据库、清理数据等。这些fixture可以在不同的测试模块中使用,而不需要导入。例如,下面的代码定义了一个login_fixture,它会在每个测试用例之前执行登录操作,并返回一个登录对象。
    # conftest.py
    import pytest
    from page.login import Login
    
    @pytest.fixture(scope="function")
    def login_fixture():
        login = Login()
        login.login("admin", "123456")
        yield login
        login.logout()
    

    在测试用例中,只需要将login_fixture作为参数传入,就可以使用它的返回值。例如,下面的代码使用了login_fixture来获取登录对象,并调用它的方法。

    # test_case/test_demo.py
    import pytest
    
    def test_demo(login_fixture):
        login = login_fixture
        login.do_something()
        assert login.get_result() == "success"
    

    这样,就可以实现fixture的复用,提高代码的可维护性和可读性。希望这篇文章对你有所帮助。😊

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值