自动化面试题

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.pswp.cn/web/89946.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】LVS(Linux virual server)环境搭建

一、LVS的运行原理1.1 LVS简介LVS:Linux Virtual Server&#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四层SLB(Server LoadBalance)是基于LVSkeepalived实现LVS 官网: http://www.linuxvirtualserver.org/ LVS 相关术语 VS: Virtual Server…

算法竞赛备赛——【图论】求最短路径——Dijkstra

Dijkstra 用来计算从一个点到其他所有点的最短路径的算法&#xff0c;是一种单源最短路径算法。也就是说&#xff0c;只能计算起点只有一个的情况。Dijkstra的时间复杂度是O (|v|^2)&#xff0c;它不能处理存在负边权的情况。 邻接矩阵存图 #include<iostream> using …

影刀 RPA:批量修改 Word 文档格式,高效便捷省时省力

在日常办公和文档处理中&#xff0c;Word 文档格式的统一和规范是许多企业和个人用户的重要需求。无论是撰写报告、制作提案&#xff0c;还是整理资料&#xff0c;都需要确保文档格式的一致性。然而&#xff0c;手动修改多个 Word 文档的格式不仅耗时费力&#xff0c;还容易因疏…

GitLab 社区版 10.8.4 安装、汉化与使用教程

一、GitLab 安装 GitLab 提供了集成所需软件的 RPM 包&#xff0c;简化了安装流程。我们选择安装社区版&#xff08;CE&#xff09;10.8.4&#xff0c;可通过官方网站或国内镜像源&#xff08;如清华镜像&#xff09;获取安装包。 1. 准备工作 首先创建工具目录并进入&#…

[硬件电路-64]:模拟器件 -二极管在稳压电路中的应用

二极管在稳压电路中的应用主要基于其单向导电性和特定类型二极管&#xff08;如稳压二极管&#xff09;的电压稳定特性。以下是详细解释&#xff1a;一、普通二极管的稳压作用&#xff08;有限场景&#xff09;正向导通压降的利用&#xff1a;原理&#xff1a;普通二极管在正向…

【Linux】重生之从零开始学习运维之Nginx

安装apt/yum安装apt imstall nginx yum install nginxRocky源码编译安装基础编译环境yum install gcc make gcc-c glibc glibc-devel pcre pcre-devel openssl openssldevel systemd-devel zlib-devel yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-deve…

主流 MQ 的关键性能指标

常用消息队列&#xff08;MQ&#xff09;的“数量级”通常围绕吞吐量&#xff08;TPS&#xff0c;每秒处理消息数&#xff09;、消息堆积能力、延迟三个核心指标展开&#xff0c;不同MQ因设计目标&#xff08;高吞吐、低延迟、高可靠等&#xff09;不同&#xff0c;数量级差异显…

[NIPST AI]对抗性机器学习攻击和缓解的分类和术语

原文link&#xff1a;https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.100-2e2025.pdf Introduction 人工智能&#xff08;AI&#xff09;系统在过去几年中持续全球扩展。这些系统正在被众多国家开发并广泛部署于各自的经济体系中&#xff0c;人们在生活的许多领域都获得了更多使…

[深度学习] 大模型学习3上-模型训练与微调

在文章大语言模型基础知识里&#xff0c;模型训练与微调作为大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;应用构建的主要方式被简要提及&#xff0c;本系列文章将从技术原理、实施流程及应用场景等维度展开深度解析。相关知识的进一步参考见&#x…

Claude Code 启动提示 Note: Claude Code might not be available in your country. 解决

如下图所示 主播参考了在别的地方看来的解决方案&#xff08;并非主播不想标注来源&#xff0c;主要是忘记是哪里看来的了&#xff0c;下班就忘记了&#xff0c;懒得找了&#x1f62d;&#xff0c;如果后续找到会补上的&#xff09;。 好了&#xff0c;开始正文&#xff0c;开始…

Unity VR多人手术系统恢复3:Agora语音通讯系统问题解决全记录

&#x1f3af; 前言 这是一个Unity多人VR手术模拟项目&#xff0c;已经搁置了近两年时间。最近重新启动了这个项目&#xff0c;然而在恢复过程中却遇到了些的技术障碍。 项目重启遇到的挑战 当我们重新部署和测试系统时&#xff0c;发现原本运行良好的Agora语音通讯功能完全…

sqli-labs靶场通关笔记:第46-53关 order by注入

目录 第46关 order by注入 第47关 闭合的order by注入 第48关 无报错回显的数字型order by注入 第49关 无报错回显的闭合型order by注入 第50关 基于order by的堆叠注入 第51关 闭合的报错注入或堆叠注入 第52关 数字型盲注或堆叠注入 第53关 闭合的盲注或堆叠注入 第…

cdh6.3.2的hive使用apache paimon格式只能创建不能写报错的问题

前言根据官网paimon安装教程&#xff0c;看上去简单&#xff0c;实则报错阻碍使用的信心。 解决方法原带的jars下的zstd开头的包旧了&#xff0c;重新下载zstd较新的包单独放到每个节点的hive/lib下;然后将hdfs yarn用户下的mr-framework.tar.gz中的zstdjar包替换成新的版本。重…

【Vue进阶学习笔记】实现图片懒加载

创建Vue项目 首先确保你已安装Vue CLI&#xff0c;然后创建一个新的Vue 3项目&#xff1a; npm init vuelatest安装依赖 安装vueuse/core库&#xff0c;它提供了useIntersectionObserver组合式API&#xff1a; cnpm install cnpm install vueuse/core创建指令文件夹和文件 在sr…

深入理解 synchronized

深入理解 synchronized 引言&#xff1a;synchronized的核心地位 在Java并发编程中&#xff0c;synchronized关键字是实现线程安全的基石。自JDK 1.0引入以来&#xff0c;它经历了从"重量级锁"到"自适应锁"的进化&#xff0c;如今已成为兼顾安全性与性能的…

C语言字符串相关函数

C语言笔记内容提要数组字符串基本操作字符串相关函数综合案例&#xff1a;学生成绩管理系统数组字符串基本操作在用格式化说明符%s进行输入输出时&#xff0c;其输入输出项均为数组名。但在输入时&#xff0c;相邻两个字符串之间要用空格分隔&#xff0c;系统将自动在字符串后加…

从零开始:用Python库轻松搭建智能AI代理

为什么要关注AI代理&#xff1f; “Agentic AI”&#xff08;智能代理&#xff09;正在悄然改变我们的工作方式。想象一下&#xff0c;一个AI助手不仅能帮你查航班、订机票&#xff0c;还能自动安排行程、发邮件、生成日报——就像一个效率极高的“虚拟助理”团队。 对于测试工…

如何防止GitHub上的敏感信息被泄漏?

如大家所了解的&#xff0c;随着GitHub的用户越来越多&#xff0c;GitHub上的敏感信息被泄漏的问题也越来越严重。那么如何做&#xff0c;才能防止此类事情发生呢&#xff1f;这值得我们探讨。移除并删除敏感信息当我们发现了历史 commit 中包含敏感信息后&#xff0c;第一步便…

船舶机械零件的深孔工艺及检测方法 —— 激光频率梳 3D 轮廓检测

引言船舶机械零件中的深孔结构&#xff08;深径比&#xff1e;15:1&#xff09;直接影响动力系统可靠性&#xff0c;如柴油机缸体深孔、推进轴系润滑油孔等。此类深孔具有孔径大&#xff08;φ10 - 50mm&#xff09;、深度深&#xff08;500 - 2000mm&#xff09;、表面质量要求…

论文Review Lidar 3DGS Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping

基本信息 题目&#xff1a;Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping 来源&#xff1a;ICCV 2025 学校&#xff1a;Sapienza University of Rome 是否开源&#xff1a;https://github.com/rvp-group/Splat-LOAM 摘要&#xff1a;纯激光3DGS&#xff01;…