一、什么是接口自动化测试
接口自动化测试是指使用自动化工具和脚本来模拟用户操作,发送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的复用,提高代码的可维护性和可读性。希望这篇文章对你有所帮助。😊