当前位置: 首页 > news >正文

自动化面试题

1、什么是测试套件

测试套件是多个测试用例的集合。

2、搭建接口自动化框架中,你遇到最大的难点是什么,以及怎么解决的?
测试数据动态管理难点:
接口依赖动态参数(如Token、订单ID),数据无法硬编码.

解决方案:
使用关联提取(如正则提取响应中的Token)结合Redis缓存动态数据,供后续用例复用。结果:实现跨用例数据传递,维护成本降低50%。

文件上传/下载测试
难点:
上传接口需处理多种文件格式(图片、PDF),脚本难以通用化。

解决方案
封装文件处理工具类,自动生成测试文件;使用multipart/form-data格式动态构造请求。结果:支持10+种文件类型测试,代码复用率80%。

3、Python 自动化测试中,若需从 5000 条测试用例中筛选出 3000 条执行,pytest框架应该如何实现?
方法 一:使用标签(Markers)筛选

适用场景:测试用例已按功能模块、优先级等分类标记。

实现步骤:
1.标记测试用例

在代码中使用 @pytest.mark 装饰器标记需要执行的用例:import pytest@pytest.mark.smoke # 标记为冒烟测试def test login():assert True@pytest.mark.regression # 标记为回归测试def test payment():assert True

2.执行特定标签的用例:

使用 -m 参数运行指定标签的用例:
pytest -m"smoke”# 执行所有标记为 smoke 的用例pytest -m "smoke or regression"# 执行 smoke 或 regression 标签的用例
方法 二:关键字(Keyword)筛选


适用场景:测试用例名称或类/模块名包含特定关键词。
实现步骤:
1.命名规范
确保用例名称包含可识别的关键词(如 api、ui_)

def test api login():
assert True
def test ui checkout():
assert True

2.使用 -k 参数筛选:
pytest -k"api "# 执行名称包含"api"的用例

        pytest -k"not ui " # 排除名称包含"ui "的用例

方法 三:指定目录/文件/类/方法适用场景:测试用例按目录或文件组织。

实现步骤:
1.按目录执行
pytest tests/api/ # 执行 api 目录下的所有用例

2.按文件或类执行
pytest tests/test login.py #执行单个文件

pytest tests/test _payment.py::TestPayment #执行指定类

pytest tests/test login.py::test api login # 执行单个方法

方法 四:动态跳过测试用例适用场景:根据条件(如环境、配置)动态跳过用例。

实现步骤:
1.使用 skipif 标记

import pytest
@pytest.mark.skipif(env == "prod", reason="Not run in production")
def test dangerous operation():
assert True
4、说一下你是怎么做接口自动化的

        一:先结合项目经验讲业务

                结合项目讲一下公司主要把什么核心的接口做成了接口自动化,并简单的介绍下核心 的 业务场景。目的主要解决了回归测试耗时长、降本增效等等。

        二:讲一下你怎么搭建的框架?用了哪些技术。

Requests     发起接口请求
Pytest框架   主要用来管理测试用例
数据驱动(通过外部数据文件或参数化方式管理测试数据)

        参数化驱动
使用代码参数化或装饰器(如pytest的@pytest.mark.parametrize)直接在代码中传递不同参数,适用于数据量较小的场景。

        文件驱动

Excel文件通过 ‌openpyxl用来读取excel
logging             用来打印执行日志
allure                生成测试报告
pymysql           操作数据库
除此之外,还集成了jenkins,自动定时构建,并自动发送邮件等功能。


三.再讲一下框架设计分层以及有什么亮点,难点?(怎么设计?过程中遇到什么问题怎么解决?)

比如:基于关键字驱动实现底层逻辑封装,结合yaml,json,excel,mysql多种数据驱动形态实现接口测试数据管理,解决了数据依赖,接口关联,断言,参数化,自动失败重试等问题


整体时间控制在3-4分钟即可,不需要讲如pytest各种框架细节,除非他后续专门问你这个框架怎么管理测试用例的,主要从宏观角度讲面即可。

(要熟悉数据驱动的实现逻辑,接口之间怎么关联的、断言、框架怎么管理测试用例的

pytest的细节知识:fixture,conftest,pytest.mark.parametrize)即pytest的初始化和清理化与参数化。

5、接口自动化测试如何提升测试覆盖率?


1.全面测试用例设计:根据接口的需求和功能,设计全面的测试用例,覆盖所有的输入和输出情况,包括正常流程、异常情况和边界值情况。这是提高测试覆盖率的基础。


2.数据驱动测试:通过使用数据驱动测试,可以用不同的测试数据来测试接口的不同场景这样可以提高测试覆盖率和准确性。


3.结合手工测试:结合手工测试可以发现接口自动化测试中无法覆盖的测试场景,以提高测试覆盖率和准确性。


4.定期回归测试:定期运行自动化测试脚本进行回归测试,以确保系统的稳定性和可靠性这也是提高测试覆盖率的一个重要方面。


5.代码覆盖率工具:使用代码覆盖率统计工具如Jacoco或pytest-cov来监测代码覆盖率,并对未被覆盖的代码路径进行测试,这样可以更精确地知道测试的覆盖情况,并针对性地补充测试用例。

6.持续集成:将接口自动化测试集成到持续集成(CI/CD)流程中,每次代码提交后自动运行测试脚本并生成测试报告,以便及早发现和修复接口错误,这也有助于提高测试覆盖率。 

 6、接口自动化测试中,经常需要对不同的测试数据进行测试。请描述你会如何实现测试用例的参数化,以便于能够使用不同的输入数据来执行相同的测试逻辑。

在自动化测试框架中,我主要使用Pytest(Python)的参数化功能,使用装饰器(如@pytest.mark.parametrize)将外部数据注入测试函数。数据源可以是代码内列表、CSV文件、数据库或JSON文件,确保数据易于扩展。框架自动遍历所有数据组合执行测试,并生成详细报告。

        比如在银行信贷项目中,我经常测试贷款申请接口(如/api/loan/apply)。该接口需要输入贷款金额、期限、用户信用评分等参数。

import pytest
import requests# 定义测试数据:每个元组代表一个测试用例,包含输入参数和预期响应
test_data = [# 正常场景:低金额、短期限,预期批准(10000, 12, 700, 200, {"status": "approved", "interest_rate": 5.0}),# 边界场景:最小贷款金额,预期批准(500, 6, 650, 200, {"status": "approved", "interest_rate": 6.0}),# 异常场景:高金额但低信用评分,预期拒绝(50000, 24, 550, 200, {"status": "rejected", "reason": "insufficient_credit"}),# 错误场景:无效期限,预期错误响应(10000, 0, 700, 400, {"error": "invalid_term"}),
]# 使用pytest.mark.parametrize参数化测试函数
@pytest.mark.parametrize("amount, term, credit_score, expected_status, expected_response", test_data)
def test_loan_application(amount, term, credit_score, expected_status, expected_response):"""测试贷款申请接口:参数化不同输入数据,验证接口逻辑。"""# 构建请求数据url = "https://api.bank.com/loan/apply"headers = {"Authorization": "Bearer token"}payload = {"amount": amount,  # 贷款金额"term": term,      # 贷款期限(月)"credit_score": credit_score  # 用户信用评分}# 发送请求response = requests.post(url, json=payload, headers=headers)# 验证响应状态码assert response.status_code == expected_status, f"预期状态码 {expected_status},实际 {response.status_code}"# 验证响应内容response_data = response.json()for key, value in expected_response.items():assert key in response_data, f"响应缺少字段 {key}"assert response_data[key] == value, f"字段 {key} 预期 {value},实际 {response_data[key]}"
  • 参数化装饰器@pytest.mark.parametrize定义了参数名称(如amountterm)和数据源test_data。Pytest自动遍历每个数据组合执行测试。
  • 数据源test_data是一个列表,每个元素是一个元组,包含输入参数和预期输出。在真实项目中,我会从CSV或数据库加载数据,便于团队协作。
  • 测试逻辑:函数test_loan_application是通用的:发送请求、验证响应状态码和内容。逻辑固定,但数据变化。
  • 在测试信用评估接口时,我参数化了用户类型(如新用户、老用户)、收入水平等,覆盖了不同风险等级。
  • 例如,测试高额贷款时,添加了边界值如最大允许金额(如100万),确保系统拒绝超额请求。
  • 使用CSV文件管理数据:我将测试数据存储在外部文件(如loan_test_data.csv),通过Pytest插件读取,实现数据与代码分离。

参数化不仅用于正向测试,还用于负向测试和性能测试

  • 数据驱动设计
    • 使用外部文件(如CSV、Excel)存储测试数据,便于业务分析师或QA更新数据。例如,在测试还款计划接口时,我创建了包含不同还款频率(月付、季付)的数据文件。
    • 在Python中,使用pytest结合pandas读取CSV:import pandas as pd; test_data = pd.read_csv('test_data.csv').values.tolist()
  • 覆盖多样化场景
    • 边界值分析:参数化最小/最大值,如贷款金额下限(500元)和上限(系统允许的最大值)。
    • 异常处理:测试无效输入(如负利率或空字段),验证接口错误处理逻辑。
    • 业务规则验证:在信贷项目中,参数化信用评分阈值(如<600分拒绝),确保风控规则生效。
  • 优势:在最近一个项目中,参数化帮助我将测试用例从50个减少到10个核心逻辑,执行时间缩短40%,同时覆盖率从70%提升到95%。
  • 挑战:数据管理需谨慎,如确保敏感数据(用户ID)脱敏。我使用Mock服务或测试环境专用数据来避免生产风险。
7、假设你正在参与一个项目的接口自动化测试,并且测试数据存储在一个Excel文件中。请描述你会如何封装一个Python函数来读取这个Excel文件中的数据,并确保它可以在你的自动化测试脚本中被复用。

        测试数据存储在Excel文件中时,封装一个可复用的Python函数是关键。这能提高代码的可维护性、减少重复代码,并确保测试脚本高效运行。以下是我推荐的步骤和方法,基于Python的标准库和最佳实践。我会选择pandas库来处理Excel文件,因为它简单、高效,且支持多种数据格式

第一步为了确保函数可复用,我们需要:

  • 输入参数:文件路径(必需)和工作表名称(可选,默认为第一个工作表)。
  • 返回值:返回一个DataFrame对象(pandas的数据结构),便于在测试脚本中直接使用数据(如迭代或参数化)。
  • 错误处理:添加异常处理,避免因文件不存在或格式错误导致脚本崩溃。

代码实现要了解

import pandas as pddef read_excel_data(file_path, sheet_name=0):"""读取Excel文件中的数据并返回DataFrame。参数:file_path (str): Excel文件的路径(例如:'data/test_data.xlsx')。sheet_name (str or int, optional): 工作表名称或索引,默认为0(第一个工作表)。返回:pandas.DataFrame: 包含测试数据的DataFrame对象。异常:如果文件不存在或读取失败,抛出FileNotFoundError或ValueError。"""try:# 使用pandas读取Excel文件data = pd.read_excel(file_path, sheet_name=sheet_name)return dataexcept FileNotFoundError:raise FileNotFoundError(f"文件未找到: {file_path}")except Exception as e:raise ValueError(f"读取Excel文件失败: {e}")# 示例使用(在测试脚本中调用)
# test_data = read_excel_data('test_data.xlsx', sheet_name='API_Test')
# print(test_data.head())  # 输出前几行数据
  • 导入函数:将函数保存在一个模块文件(如data_reader.py),然后在测试脚本中导入。
  • 直接使用数据:返回的DataFrame可以直接用于参数化测试。例如,使用pytest框架时,可以结合@pytest.mark.parametrize实现数据驱动测试。
import pytest
from data_reader import read_excel_data  # 导入封装好的函数# 读取测试数据
test_data = read_excel_data('path/to/test_data.xlsx', sheet_name='TestCases')# 参数化测试用例
@pytest.mark.parametrize("input_data, expected_output", test_data[['Input', 'Expected']].values)
def test_api_endpoint(input_data, expected_output):# 模拟接口调用和断言response = call_api(input_data)  # 假设call_api是自定义的接口调用函数assert response.status_code == expected_output

       增强复用性的建议

  • 处理多工作表:函数支持sheet_name参数,可以读取特定工作表(如sheet_name='Sheet1'或索引)。如果需要读取所有工作表,可以修改函数返回字典(键为工作表名,值为DataFrame)。
  • 数据清洗:如果Excel数据包含空值或格式问题,可以在函数中添加预处理逻辑(如data.fillna(0)填充空值)。
  • 性能优化:对于大型Excel文件,使用pandasdtype参数指定列类型以提高读取速度。
  • 错误日志:添加日志记录(如logging模块),便于调试失败原因。

        好处总结

通过这种封装:

  • 代码复用:避免在每个测试脚本中重复编写读取逻辑。
  • 可维护性:如果Excel格式变化,只需修改一个函数。
  • 可靠性:错误处理确保自动化测试在文件异常时不会中断。
  • 扩展性:易于集成到CI/CD流程中(如Jenkins)。

8、Python自动化中,unittest框架中setUp和tearDown方法的区别是什么?

          1.setUp 方法在每个测试方法执行前被调用,常用于测试前的准备工作,如创建测试环境.
初始化变量等。
2.tearDown 方法在每个测试方法执行后被调用,常用于测试后的清理工作,如删除测试创建的文件、释放资源等。

9、接口自动化中,请求头参数(Headers)、POST请求的data(如JSON、表单等)的处理方式通常遵循数据驱动可维护性原则,通过参数化配置化管理实现灵活复用

1. 请求头参数(Headers)的处理

场景分类

  • 通用头部(如Content-TypeUser-Agent):全局配置,所有接口共用。

  • 动态头部(如Authorization令牌):需实时生成或从响应中提取。

  • 接口特定头部(如自定义签名):个别接口独有。

处理方式

  • YAML/JSON配置文件
    将头部参数按环境(测试/预发/生产)或接口类型分类存储:

    # config/headers.yaml
    default:Content-Type: "application/json"User-Agent: "AutoTest/1.0"
    auth_required:Authorization: "${token}"  # 动态替换变量

    代码封装
    封装头部生成逻辑,避免重复代码:

    def get_headers(auth=False):base = load_yaml("config/headers.yaml")["default"]if auth:base.update({"Authorization": get_token()})return base

    POST请求的data(JSON/表单)的处理

    数据组织方式

  • 模板化
    使用模板文件(如Jinja2)或JSON Schema定义请求体结构,动态填充变量:

    // templates/login.json
    {"username": "${username}","password": "${password}","timestamp": "${current_time}"
    }

  • 数据驱动
    通过CSV/Excel/YAML文件存储测试数据,实现参数化:同7、

  • 动态生成
    对需实时计算的数据(如签名、时间戳),在代码中动态生成: 

    payload = {"username": "test1","password": hash_password("pass123"),"sign": generate_sign("test1pass123")
    }
    import requests
    from utils.data_handler import load_test_data, render_templatedef test_login():# 加载测试数据test_data = load_test_data("login.csv")[0]  # 取第一组数据# 渲染请求体模板payload = render_template("templates/login.json", test_data)# 发送请求response = requests.post(url="https://api.example.com/login",headers=get_headers(auth=False),json=payload)assert response.status_code == test_data["expected_code"]

    环境隔离
    通过环境变量或配置文件区分不同环境的参数(如URL、数据库配置):

    # config/env.yaml
    dev:base_url: "https://dev.api.com"
    prod:base_url: "https://api.example.com"

    4. 工具框架集成示例

  • Pytest + Requests
    使用pytestfixture管理参数:

    @pytest.fixture
    def auth_headers():token = login_and_get_token()return {"Authorization": f"Bearer {token}"}def test_user_profile(auth_headers):response = requests.get("/profile", headers=auth_headers)

通过以上方法,接口自动化可以实现低耦合、高复用的参数管理,适应复杂业务场景和快速迭代需求。 

http://www.lryc.cn/news/592547.html

相关文章:

  • 搜广推校招面经九十五
  • 基于 WinForm 与虹软实现人脸识别功能:从理论到实践
  • 关于我用AI编写了一个聊天机器人……(11)
  • 《每日AI-人工智能-编程日报》--2025年7月18日
  • [JS逆向] 微信小程序逆向工程实战
  • 加速度计和气压计、激光互补滤波融合算法
  • 6月零售数据超预期引发市场波动:基于AI多因子模型的黄金价格解析
  • # Redis-stable 如何在Linux系统上安装和配置
  • 编译器没找到 esp_http_client.h,
  • 算法竞赛备赛——【图论】求最短路径——小结
  • 【CF】⭐Day104——Codeforces Round 840 (Div. 2) CE (思维 + 分类讨论 | 思维 + 图论 + DP)
  • 数据结构入门:像整理收纳一样简单!
  • 文件流导出文件
  • spring boot 实战之分布式锁
  • 【Nginx】nginx+lua+redis实现限流
  • docker,防火墙关闭后,未重启docker,导致端口映射失败
  • 产品需求文档(PRD)格式全解析:从 RP 到 Word 的选择与实践
  • 前端性能优化“核武器”:新一代图片格式(AVIF/WebP)与自动化优化流程实战
  • 新手向:图片批量裁剪工具
  • 力扣 hot100 Day48
  • AWS(基础)
  • (nice!!!)(LeetCode 每日一题) 2163. 删除元素后和的最小差值 (贪心+优先队列)
  • #vscode# #SSH远程# #Ubuntu 16.04# 远程ubuntu旧版Linux
  • 网工知识——vlan技术
  • go安装使用gin 框架
  • 在 Jenkins 中使用 SSH 部署密钥
  • mac系统安装、启动Jenkins,创建pytest接口自动化任务
  • 周志华《机器学习导论》第9章 聚类
  • 一文讲清楚React的render优化,包括shouldComponentUpdate、PureComponent和memo
  • 【Lua】闭包可能会导致的变量问题