diff --git a/README.md b/README.md index 1698ef0..49b500e 100755 --- a/README.md +++ b/README.md @@ -28,11 +28,12 @@ - [Spring和Spring Boot常见面试题总结](./docs/system-design/spring.md) - [设计模式常见面试题总结](./docs/system-design/design-pattern.md) +## 测试开发 + +- [测试开发常见面试题总结](./docs/other/test-development.md) + ## 公众号 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 JavaGuide 公众号 - - - diff --git a/docs/.vuepress/sidebar/index.ts b/docs/.vuepress/sidebar/index.ts index c7d04f7..f43b224 100644 --- a/docs/.vuepress/sidebar/index.ts +++ b/docs/.vuepress/sidebar/index.ts @@ -36,17 +36,12 @@ export default sidebar({ "java-jvm", ], }, - { + { text: "计算机基础", icon: "computer", collapsible: false, prefix: "cs-basics/", - children: [ - "network", - "operating-system", - "data-structure", - "algorithms", - ], + children: ["network", "operating-system", "data-structure", "algorithms"], }, { text: "数据库和缓存", @@ -62,5 +57,12 @@ export default sidebar({ prefix: "system-design/", children: ["spring", "design-pattern"], }, + { + text: "测开", + icon: "framework", + collapsible: false, + prefix: "other/", + children: ["test-development"], + }, ], }); diff --git a/docs/.vuepress/theme.ts b/docs/.vuepress/theme.ts index 3fc88fd..be5dd74 100644 --- a/docs/.vuepress/theme.ts +++ b/docs/.vuepress/theme.ts @@ -7,7 +7,7 @@ import sidebar from "./sidebar/index.js"; const __dirname = getDirname(import.meta.url); export default hopeTheme({ - hostname: "https://javaguide.cn/", + hostname: "https://interview.javaguide.cn/", logo: "/logo.png", favicon: "/favicon.ico", @@ -16,7 +16,7 @@ export default hopeTheme({ url: "https://javaguide.cn/article/", }, - repo: "https://github.com/Snailclimb/JavaGuide", + repo: "https://github.com/Snailclimb/JavaGuide-Interview", docsDir: "docs", pure: true, focus: false, @@ -33,6 +33,18 @@ export default hopeTheme({ align: true, codeTabs: true, gfm: true, + include: { + resolvePath: (file, cwd) => { + if (file.startsWith("@")) + return path.resolve( + __dirname, + "../snippets", + file.replace("@", "./"), + ); + + return path.resolve(cwd, file); + }, + }, tasklist: true, }, diff --git a/docs/README.md b/docs/README.md index b32223c..e41396b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -39,4 +39,4 @@ JavaGuide 已经持续维护 6 年多了,累计提交了接近 **6000** commit 最新更新会第一时间同步在公众号,推荐关注!另外,公众号上有很多干货不会同步在线阅读网站。 -![JavaGuide 官方公众号](https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png) +JavaGuide 公众号 diff --git a/docs/cs-basics/network.md b/docs/cs-basics/network.md index 1c709ba..7f9c75d 100755 --- a/docs/cs-basics/network.md +++ b/docs/cs-basics/network.md @@ -729,3 +729,5 @@ ARP 协议,全称 **地址解析协议(Address Resolution Protocol)**, ### ARP 协议的工作原理? [ARP 协议详解(网络层)](https://javaguide.cn/cs-basics/network/arp.html) + + diff --git a/docs/cs-basics/operating-system.md b/docs/cs-basics/operating-system.md index a38f605..04c204b 100644 --- a/docs/cs-basics/operating-system.md +++ b/docs/cs-basics/operating-system.md @@ -816,3 +816,5 @@ LRU 算法是实际使用中应用的比较多,也被认为是最接近 OPT 4. **循环扫描算法(Circular Scan,C-SCAN)**:SCAN 算法的变体,只在磁盘的一侧进行扫描,并且只按照一个方向扫描,直到到达磁盘边界,然后回到磁盘起点,重新开始循环。 5. **边扫描边观察算法(LOOK)**:SCAN 算法中磁头到了磁盘的边界才改变移动方向,这样可能会做很多无用功,因为磁头移动方向上可能已经没有请求需要处理了。LOOK 算法对 SCAN 算法进行了改进,如果磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向,依此往复。也就是边扫描边观察指定方向上还有无请求,因此叫 LOOK。 6. **均衡循环扫描算法(C-LOOK)**:C-SCAN 只有到达磁盘边界时才能改变磁头移动方向,并且磁头返回时也需要返回到磁盘起点,这样可能会做很多无用功。C-LOOK 算法对 C-SCAN 算法进行了改进,如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。 + + diff --git a/docs/database/mysql.md b/docs/database/mysql.md index 7e285df..b03beb9 100755 --- a/docs/database/mysql.md +++ b/docs/database/mysql.md @@ -995,3 +995,5 @@ MySQL 性能优化是一个系统性工程,涉及多个方面,在面试中 **5.总结** 在面试中,建议按优先级依次介绍慢 SQL 定位、索引优化、表结构设计和 SQL 优化等内容。架构层面的优化,如读写分离和分库分表、数据冷热分离应作为最后的手段,除非在特定场景下有明显的性能瓶颈,否则不应轻易使用,因其引入的复杂性会带来额外的维护成本。 + + diff --git a/docs/database/redis.md b/docs/database/redis.md index 69a4e16..0659e2b 100644 --- a/docs/database/redis.md +++ b/docs/database/redis.md @@ -1725,5 +1725,5 @@ Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数 6. 控制 key 的生命周期:避免 Redis 中存放了太多不经常被访问的数据。 7. ...... - + diff --git a/docs/home.md b/docs/home.md index cc1f61d..04fdf1b 100644 --- a/docs/home.md +++ b/docs/home.md @@ -33,10 +33,14 @@ title: Java 学习&面试指南(Go、Python 后端面试通用,计算机基础 - [Spring和Spring Boot常见面试题总结](./system-design/spring.md) - [设计模式常见面试题总结](./system-design/design-pattern.md) +## 测试开发 + +- [测试开发常见面试题总结](./other/test-development.md) + ## 公众号 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 -![JavaGuide 官方公众号](https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png) +JavaGuide 公众号 diff --git a/docs/other/test-development.md b/docs/other/test-development.md new file mode 100644 index 0000000..5b9623c --- /dev/null +++ b/docs/other/test-development.md @@ -0,0 +1,429 @@ +--- +title: 测试开发常见面试题总结 +category: 测试开发 +tag: + - 测试开发 + - 软件测试 +head: + - - meta + - name: keywords + content: 测试开发面试题,测开高频问题,软件测试面试题,测试用例设计,自动化测试,压力测试,Web测试,白盒测试,黑盒测试,端到端测试,测试左移,测试类型 + - - meta + - name: description + content: 测试开发高频面试题系统总结,覆盖测试开发基础、Bug处理与协作、测试用例设计、自动化测试、压力测试、测试类型区分等实战问题与参考答案,适合冲击中大厂测开岗位的同学快速复盘与刷题。 +--- + + + +很多读者选择了测开方向来冲一波中大厂。在国内当前的测开面试中,面试官不仅会考察测试领域的基础知识和实践能力,往往也会考察候选人的后端开发功底。这是因为优秀的测开工程师需要深入理解系统架构,能够编写高质量的自动化测试代码,进行性能测试分析,甚至参与到测试工具和平台的开发中。所以,像多线程、Redis、MySQL 等后端开发的核心知识点,在测开面试中被问到是常态。 + +我这里整理并总结了一些在测开面试中偏测试方向的高频问题,并附上详细的参考答案(如答案过长,还会提供简化版回答): + +1. **测试开发基础** + - 为什么想做测开?/ 为什么从开发转测开? + - 你认为软件测试的核心竞争力是什么? + - 什么是软件测试?为什么要做? + - 软件测试的流程是怎样的? + - 你如何看待测试覆盖率这个指标? + - 什么是"测试左移"(Shift-Left Testing)?你在项目中是如何实践的? +2. **Bug 处理与协作** + - 如果有一个 Bug 不能复现,怎么去跟开发沟通? + - 你在实习/项目期间测出过什么印象深刻的 Bug? +3. **测试用例** + - 什么是测试用例?一个好的测试用例需要满足什么标准? + - 怎么设计测试用例?/ 常用的测试用例设计方法有哪些? + - 设计 xxx 场景(例如电商直播间、充值、数据迁移系统)的测试用例 +4. **测试类型** + - 什么是自动化测试?为什么需要? + - 什么是 Web 应用的自动化测试?怎么做? + - 怎么进行压测? + - 白盒测试和黑盒测试的主要区别是什么? + - 什么是单元测试?集成测试?系统测试?回归测试?验收测试? + - 单元测试、集成测试、系统测试、回归测试、验收测试最重要的是那一步? + - 什么是端到端测试? + - 移动端与 Web 端测试有什么区别? + - 如何测试 Web 应用的安全性?你会关注哪些常见漏洞? + - API 功能测试如何做? + - 什么是正向测试和反向测试?能否举例说明 + - 可用性测试和用户体验测试有什么区别? + +## 测试开发基础 + +### 为什么想做测开?/ 为什么从开发转测开? + +我在之前的 Java 后端开发经历中,积累了比较扎实的编程基础和系统设计能力(可以具体提 1-2 个技术点,如熟悉微服务、数据库等)。我发现自己对保证软件质量、提升系统稳定性有浓厚的兴趣。我觉得测开岗位能很好地结合我的开发背景和对软件质量保障的关注。 + +我个人的话,也比较注重细节,有耐心,也乐于从用户的角度去思考问题,我觉得这些特质也挺适合做质量保障工作的。 + +我认为测开不仅仅是功能测试,更需要通过技术手段,比如自动化测试、性能测试、构建 CI/CD 流程中的质量门禁,来提高测试效率和深度,从源头保障软件质量。 + +### 你认为软件测试的核心竞争力是什么? + +我认为优秀测试工程师的核心竞争力主要体现在三点: + +1. **强大的质量意识和业务理解能力**,能从用户和业务视角拆解需求、识别高风险场景; +2. **系统性设计测试策略和用例的能力**,合理运用等价类、边界值、组合覆盖等方法,把有限的测试资源用在最关键的地方; +3. **工程化与自动化能力**,熟悉测试工具、脚本和 CI/CD,把测试深度嵌入开发流程,实现持续、可重复、可量化的质量保障。 + +简单说,就是:**懂业务、会分析、能工程化落地的质量保障能力**。 + +### 什么是软件测试?为什么要做? + +软件测试是通过设计和执行一系列用例,在不同场景下运行软件,去发现缺陷、验证功能和质量是否符合需求与标准的系统化活动。 + +回答这个问题的时候需要注意:**一定不要认为软件测试就是在找 bug。** + +为什么要做它?主要有三个原因: + +1. **控制风险,降低成本**:在开发阶段就把 bug 找出来,远比等它在线上造成事故再修复要便宜得多。这是一种风险控制。 +2. **验证业务需求**:确保我们开发的功能,确实是产品和用户想要的,**没做偏**。 +3. **提供质量反馈,赋能持续交付**:在敏捷开发里,没有自动化测试作为安全网,我们根本不敢频繁发布新版本。测试是持续交付的基础。 + +一句话概括:**软件测试就是用有计划的方式尽早暴露问题、评估质量,让软件在交付给用户前尽可能"可预测、可依赖"。** + +### 软件测试的流程是怎样的? + +一个相对完整的软件测试流程,我理解大致包含这几个阶段: + +- **需求分析:** 首先是深入理解需求文档,分析需求的可测性,有时候还需要参与需求评审,尽早发现需求层面的问题。 +- **测试计划:** 然后是制定测试计划,明确测试范围、测试策略(比如哪些功能需要重点测、采用什么测试方法)、资源投入、时间安排以及风险评估。 +- **测试设计:** 接下来是设计测试用例(Test Case),这需要用到像等价类、边界值、场景法等方法,确保用例能有效覆盖需求。同时,可能还需要准备测试数据。 +- **测试执行:** 之后就是执行测试用例,记录测试结果,发现 Bug 要及时提交到缺陷管理系统(比如 Jira、禅道)。 +- **缺陷跟踪与管理:** 对提交的 Bug 进行跟踪,验证开发修复后的 Bug,直到 Bug 关闭。 +- **测试报告与评估:** 测试结束后,需要输出测试报告,总结测试情况,评估产品质量风险,给出是否可以上线的建议。 +- **回归测试:** 在修复 Bug 或有新版本迭代时,还需要进行回归测试,确保旧功能没问题,新改动不引入新问题。 + +在敏捷开发模式下,这些流程可能会更快速地迭代进行。 + +**简化版回答:** 通常我会先和 PM、开发团队沟通需求,然后根据需求来制定测试计划和设计测试用例,之后就是执行测试用例并记录发现的问题。缺陷修复后要做回归测试,确保没有引入新问题,最后再评估版本是否满足上线标准,才会提交上线。 + +### 你如何看待测试覆盖率这个指标? + +我认为测试覆盖率是一个**有用但有限、甚至有时带点欺骗性**的指标。 + +**高覆盖率 ≠ 高质量测试**:覆盖率只反映"代码是否被执行",无法验证: + +- 断言是否充分合理 +- 边界条件和异常场景是否覆盖 +- 业务逻辑是否被正确验证(例如,一个只调用方法但不验证结果的测试也能提高覆盖率) + +**低覆盖率 ≈ 测试很可能不充分**:核心模块若覆盖率低于 70%(尤其是新功能),通常意味着测试深度不足,但也要结合业务风险评估(如简单 DTO 类覆盖率低可能影响不大)。 + +**比较推荐的实践原则**: + +- **设定合理阈值**:核心模块要求 80%+行覆盖,关键路径 100%分支覆盖;非核心模块 60%+即可、 +- **关注"有意义"的覆盖率**:结合变更覆盖率(只关注本次修改的代码)和关键路径覆盖率。 +- **质量优先于数字**:宁可接受 70%的高质量测试,也不要 90%的"形式主义"测试。 +- **工具辅助但不盲从**:使用 JaCoCo/Sonar 等工具监控趋势,但不设硬性 KPI。 + +**一句话总结**:覆盖率是发现盲区的探照灯,而非质量合格的证明书。它最有价值的用法是识别"明显缺失测试"的区域,而非证明"测试充分"。 + +### 什么是"测试左移"(Shift-Left Testing)?你在项目中是如何实践的? + +**测试左移**的本质是:**将质量保障活动尽量前移到软件生命周期的早期阶段**,通过"早发现、早修复"来降低缺陷修复成本(有研究表明,需求阶段发现缺陷的成本大约只有生产环境的 1/100)。 + +也就是说,不再把测试只放在"开发完之后",而是在**需求、设计、开发阶段就开始介入质量活动**,让缺陷在最早的环节被发现和预防。 + +**比较推荐的实践原则**: + +1. **早介入需求与设计** + - 测试人员参与需求评审、设计评审, + - 提前梳理业务流程、异常场景, + - 发现需求歧义、遗漏的边界条件。 +2. **开发阶段的自测与单元测试** + - 要求开发为核心业务逻辑和关键模块编写单元测试、基础集成测试; + - 将单元测试通过率作为代码提交 / 合并的前置条件之一; + - 倡导"先写用例,再写实现"的思路(TDD/UT 驱动,可选,国内较难实现)。 +3. **CI 中尽早运行自动化检查** : + - 对每次提交或合并请求自动执行:静态代码扫描(如 Sonar 等)、单元测试和关键集成测试; + - 让问题在"提交当下"就暴露,而不是拖到系统测试甚至上线前。 +4. **测试用例提前设计** + - 在需求/设计阶段就开始梳理测试思路和关键用例, + - 指导后续自动化脚本和手工测试计划。 + +可以总结为一句话:测试左移就是**把"发现问题"尽量变成"预防问题"**,让测试从"事后把关"变成"全流程参与"。 + +## Bug 处理与协作 + +### 如果有一个 Bug 不能复现,怎么去跟开发沟通? + +- **先自我排查:** 首先,我会自己再努力尝试复现几次,确保不是我操作失误或者遗漏了什么前提条件。我会尝试更换不同的测试环境、不同的测试账号或数据,看看问题是否在特定条件下出现。 +- **收集详细信息:** 如果确实难以稳定复现,我会尽可能详细地记录下当时发现问题的场景信息,比如: + - **具体的操作步骤:** 尽可能回忆并描述清楚每一步操作。 + - **环境信息:** 包括操作系统、浏览器版本(如果是 Web 端)、App 版本(如果是移动端)、网络状况、测试设备型号等。 + - **测试数据:** 当时使用的具体账号或关键数据是什么。 + - **日志信息:** 查看并附上当时客户端(浏览器控制台、App 日志)和服务器端的相关日志,特别是报错信息或异常堆栈。 + - **截图或录屏:** 如果有当时问题现象的截图或录屏是最好的。 + - **出现频率:** 大概尝试了多少次,出现了几次,或者是在什么特定时间段出现的。 +- **有效沟通:** 然后,我会整理好这些信息,找到对应的开发同学,不是直接去质问,而是客观地描述:‘我遇到了这样一个现象(描述现象),尝试了这些方法(描述排查步骤)后暂时无法稳定复现,但这里有当时收集到的信息(展示日志、截图等),你看这些信息对你定位问题有没有帮助?或者我们是不是可以一起看看,或者你那边有没有更详细的日志能查到当时的请求?’ +- **协作解决:** 目的是提供尽可能多的线索,协助开发去分析可能的原因,比如是不是偶发的环境问题、并发问题、脏数据问题等,共同把问题解决掉。 + +**简化版回答:** 我自己会先在不同的情况下,多次复现尝试。如果确实难以稳定复现,我会尽量给开发提供当时的详细操作步骤、环境信息、相关日志和截图,甚至录屏等必要信息,这可以帮助开发更好地排查和定位。同时,我也会协助开发去分析可能的原因。 + +### 你在实习/项目期间测出过什么印象深刻的 Bug? + +一定要讲清楚具体场景(例如优惠卷计算错误、重复点击多次提交订单) + 原因(分析一下导致这个问题的原因) + 修复过程(这个问题最重视如何修复的,后续如何避免)。 + +最好是能够体现个人积极思考和追根究底的态度。 + +## 测试用例 + +### 什么是测试用例?一个好的测试用例需要满足什么标准? + +测试用例是用来验证软件是否符合需求的一组明确的测试步骤和结果,它相当于一个计划书,指导你在特定条件下执行测试,并观察系统的表现是否与预期一致。简单来说,测试用例就是一个操作指南,告诉你: + +- 在什么条件下测试(前置条件)。 +- 做什么操作(输入或操作步骤)。 +- 期望看到什么结果(预期输出)。 + +例如,测一个登录功能,一个测试用例可能就是:输入正确的用户名和密码,点击登录,预期结果是成功登录并跳转到主页。另一个用例可能是:输入错误的密码,点击登录,预期结果是提示密码错误。 + +一个好的测试用例,不是单纯指它能发现问题,而是它能帮助你全面、精准地验证软件的功能和质量。打个比方,如果把软件看作一个池塘,软件缺陷是池塘里的鱼,那么"好的"测试用例就是一张编织得紧密、覆盖全面的渔网——只要池塘里有鱼,这张网就能捞上来;而如果捞不到鱼,就可以确定池塘里没有鱼。 + +所以,好的测试用例的关键不在于发现了多少缺陷,而是它是否全面、科学,能确保测试需求被完整覆盖。具体来说,一个好的测试用例应该满足以下几个标准: + +- **覆盖全面**:把该测的需求、功能点都包含了。比如测试一个表单输入框,测试用例集合需要覆盖正常输入、特殊字符输入、空输入、超长输入、非法输入等所有可能的场景,而不能只测试一种输入情况。 +- **分组精准**:通过等价类划分,减少冗余测试,确保效率和准确性。比如测试一个年龄输入框,18-60 的范围可以作为一个等价类,测试一个值(比如 25)即可,而不需要测试每个值。 +- **边界清晰**:把所有可能的边界、异常情况都考虑并测试到了。比如测试一个输入要求"1-100"的数值框时,边界值测试包括 0、1、100、101,异常情况测试包括负数、字符串输入、空值等。 + +**简化版回答:** 简单来说,测试用例就是测试说明书,它告诉测试人员:"在什么条件下,怎么操作,应该得到什么结果"。一个好的测试用例应该满足覆盖全面、分组精准和边界清晰这三个条件。 + +### 怎么设计测试用例?/ 常用的测试用例设计方法有哪些? + +设计测试用例的目标是全面覆盖软件需求,同时确保测试效率。我通常会结合多种方法,以达到最佳的测试覆盖率: + +- **等价类划分法:** 将所有可能的输入数据划分为若干个互不相交的"等价类",然后从每个等价类中选取一个或少量具有代表性的数据作为测试用例。例如,测试一个处理用户注册的模块,针对"用户名"输入框,可以划分等价类为:有效用户名(3-20 个字符)、无效用户名(小于 3 个字符、大于 20 个字符、包含非法字符)。 +- **边界值分析法:** 作为等价类划分的补充,它专注于测试等价类边界上的值,因为错误往往更容易发生在边界处。例如,对于上述用户名长度的例子,我们需要测试 3 个字符、20 个字符,以及 2 个字符、21 个字符这些边界值。 +- **判定表法(决策表法):** 当存在多个输入条件,且这些条件的组合会产生不同的输出结果时,使用判定表法可以清晰地展示各种情况。例如,一个机票预订系统,影响预订价格的因素可能有:是否是会员、是否是节假日、提前预订天数等。通过判定表,可以列出所有条件组合及其对应的价格计算规则。 +- **场景法(流程图法):** 模拟用户在实际使用软件时的各种场景和操作流程来设计测试用例。通过绘制流程图,可以清晰地展示用户可能的操作路径,包括主流程和各种异常分支流程。例如,测试一个在线购物的流程,可以模拟用户从浏览商品、加入购物车、提交订单、支付、确认收货等一系列操作。 +- **错误推测法:** 凭借测试人员的经验、知识和直觉,推测程序中可能存在的错误,并以此设计测试用例。例如,针对文件上传功能,可以推测可能出现的错误包括:上传空文件、上传超大文件、上传病毒文件、上传与指定格式不符的文件等。 +- **状态迁移法:** 适用于测试具有多种状态且状态会发生变化的对象。例如,测试一个电梯控制系统,电梯有静止、上升、下降等状态,状态之间会根据用户的操作(如按下楼层按钮)发生迁移。需要测试在各种状态下,电梯的行为是否符合预期,以及状态迁移是否正确。 + +在实际工作中,通常需要根据被测功能的特点,灵活地组合使用这些方法,以达到最佳的测试效果,发现潜在的缺陷。同时,测试用例的设计也需要不断地评审和更新,以适应软件的迭代和变化。 + +**简化版回答:** 设计测试用例的目标是全面覆盖需求,同时保证效率。我通常会结合几种方法,比如等价类划分,将输入数据分成不同的"等价类",从每个类中选代表性的数据测试;边界值分析,重点测试等价类边界上的值;以及错误推测,基于经验,推测程序可能出错的地方来设计用例。 + +### 设计 xxx 场景(例如电商直播间、充值、数据迁移系统)的测试用例 + +回答这类问题一般不需要详细列出所有用例,关键是展现你的分析思路和覆盖维度。 + +这里以**电商直播间**为例,分享一下回答思路: + +- **功能测试:** 这是基础。需要覆盖直播间的所有核心功能点,正常场景和异常场景都需要考虑,包括: + - **主播端:** 创建/开始直播、推流稳定性、添加/讲解商品、发优惠券、互动(评论、点赞、连麦)、结束直播、查看数据统计等。 + - **用户端:** 进入/退出直播间、观看流畅度(清晰度切换、卡顿情况)、浏览/搜索商品列表、查看商品详情、领取优惠券、加购/下单流程、评论/点赞/送礼互动、分享直播间、关注主播等。 + - **后台管理:** 直播间管理、内容审核、禁言/踢人、商品管理、订单管理、数据报表等。 +- **兼容性测试:** 需要考虑在不同平台和设备上的表现: + - **移动端:** 不同操作系统版本(iOS/Android)、不同手机品牌和型号、不同屏幕分辨率、App 版本兼容性。 + - **Web 端/PC 端:** 不同浏览器(Chrome, Firefox, Safari, Edge 等)及其版本、不同操作系统(Windows/Mac)。 +- **性能测试:** 直播间对性能要求很高: + - **压力测试:** 模拟大量用户同时在线观看、评论、下单,看服务器的响应时间(RT)、吞吐量(TPS)、错误率、CPU/内存/带宽使用率等指标。 + - **稳定性测试:** 长时间运行直播,观察系统资源是否有泄漏、服务是否稳定。 + - **客户端性能:** App 的启动速度、进入直播间速度、滑动流畅度、CPU/内存/电量消耗等。 +- **网络测试:** 模拟不同网络环境下的表现,如 WiFi、4G、5G、弱网(高延迟、丢包)下的音视频流畅度、互动响应速度等。 +- **安全测试:** 考虑潜在的安全风险,比如用户信息泄露、接口是否可以被恶意调用、防刷(评论、点赞、下单)、支付安全等。 +- **UI/UX 测试:** 界面布局是否合理美观、交互是否符合用户习惯、提示信息是否清晰友好等。 + +针对每个维度,再结合具体的功能点,使用前面提到的测试用例设计方法(如边界值、场景法)来生成具体的测试用例。 + +**简化版回答:** 首先是功能测试,我会覆盖直播间核心功能,包括主播端(如开播、推流、商品添加)和用户端(如进入观看、互动、下单)的各种场景,确保功能正常。其次是兼容性测试,考虑在不同平台和设备上的表现,比如 iOS/Android 手机、不同浏览器等。第三是性能测试,模拟大量用户并发,关注服务器的响应时间、稳定性以及客户端的流畅度。第四是网络测试,模拟弱网环境,确保音视频和互动流畅。最后,我还会考虑安全测试,比如用户信息保护和支付安全。针对每个维度,我会结合具体功能点,运用等价类划分、边界值分析等方法来设计测试用例,确保覆盖到各种潜在问题。 + +## 测试类型 + +### 什么是自动化测试?为什么需要? + +简单来说,自动化测试就是用代码或脚本让电脑自动运行测试,而不是让人工手动点击。你可以把它理解为编写代码来测试其他代码。 + +自动化测试的优势在于: + +- **搞定重复劳动:** 它擅长运行重复性的任务(比如更新后检查旧功能——回归测试),比人工更快、更稳定。再也不用让人痛苦地点击几个小时了。 +- **解放脑力:** 通过自动化那些枯燥的事情,测试人员可以专注于更聪明的工作:设计更好的测试、探索棘手的边界情况、检查可用性——这些都需要人类的直觉。 +- **解决难题:** 它使困难或不切实际的手动测试成为可能,比如模拟成千上万的用户同时访问网站(性能/负载测试)或连续几天不停地运行检查(稳定性测试)。 +- **随时运行:** 你可以安排这些测试频繁运行,甚至在夜间或周末,无需人员在场就能提供更快的反馈。 +- **一致性是关键:** 机器每次都精确地按照指令执行,消除了人为错误,比如忘记步骤或误解结果。 + +不过,维护自动化测试需要花费大量时间和精力。当你发现自动化测试用例的维护成本高于其节省的测试成本时,自动化测试就失去了价值与意义,你也就需要在是否使用自动化测试上权衡取舍了。 + +### 什么是 Web 应用的自动化测试?怎么做? + +Web 应用自动化测试挺深的,面试中问到抓住几个关键点聊就好了。 + +Web 应用的自动化测试,简单说就是**用代码(脚本)来控制工具,模拟真实用户操作浏览器,自动执行预设的测试步骤并验证结果**。比如自动打开网页、点击按钮、输入文字、检查页面显示是否正确等等。 + +实践中,Web 应用自动化测试通常这样做: + +1. **选择合适的工具/框架**:市面上有很多选择,比如老牌的 **Selenium**(支持多语言、多浏览器)、现代化的 **Cypress** 或 **Playwright**(通常更快、更稳定,调试友好)。选择时主要考虑项目技术栈、团队熟悉程度和测试需求。 +2. **编写测试脚本**:针对应用的核心功能和关键业务流程编写自动化脚本。 + - **重点是功能和回归测试**:确保核心流程(如登录、购物、关键操作)能正常工作,并且在新代码提交后这些功能没有被意外破坏。 + - **适当进行 UI 验证**:可以检查关键元素是否存在、是否可见,但过于精细的像素级 UI 对比通常投入产出比较低,容易失败。 + - **考虑兼容性**:同一套脚本可以在不同浏览器(Chrome, Firefox, Safari 等)或不同环境配置下运行,以检查兼容性。 +3. **集成到 CI/CD 流程**:这是发挥自动化价值的关键一步。把自动化测试加入到持续集成/持续部署(CI/CD)管道中(例如使用 Jenkins, GitLab CI, GitHub Actions)。这样,每次开发者提交代码后,测试就会自动运行,快速反馈结果。通过清晰的测试报告,团队能迅速定位并修复失败的测试,保证代码质量。 + +### 怎么进行压测? + +压测,全称压力测试,是指通过模拟大量用户并发访问,或者在极端条件下运行系统,来评估系统在负载下的性能、稳定性和可靠性。 简单来说,就是给系统施加压力,看看它能不能扛得住。 压测可以帮助我们发现系统的瓶颈,比如 CPU、内存、数据库连接数等,从而进行优化,提高系统的性能和稳定性。 + +压测的步骤大致如下: + +1. **确定压测目标:** 你想通过压测了解什么?是想看系统能否支撑 1000 用户在线?还是想知道下单接口的最大 TPS 是多少?响应时间要求低于 500ms?先把这些具体的、可量化的性能指标定下来。同时确定压测的范围,是测试整个系统,还是某个核心模块或接口? +2. **准备测试环境:** 准备一套尽可能接近生产环境的测试环境(硬件配置、网络、数据量等),结果才更有参考价值。最好是隔离的环境,避免影响线上用户。 +3. **选择合适的压测工具:** JMeter 是最常用、免费开源的选择,功能强大。其他流行的还有 k6 (现代化的,用 JavaScript 写脚本)、LoadRunner (商业,功能全面)、Gatling (用 Scala 写脚本,性能较好)。根据团队技术栈和需求选择。 +4. **编写/录制测试脚本:** 使用选定的工具,根据设计的测试场景,编写或录制模拟用户操作的请求脚本。 +5. **配置压测工具并执行测试:** 设置并发用户数、请求频率等参数。配置完成后,执行测试。 +6. **监控和分析结果:** 密切关注压测工具的指标(TPS、响应时间、错误率)和服务器端的性能指标(CPU、内存、磁盘 I/O、网络、数据库连接数、中间件指标等)。找出系统的瓶颈,比如数据库连接数、CPU 利用率等。 +7. **调优和再测试:** 根据分析结果,定位瓶颈并进行优化(代码优化、配置调整、硬件升级等)。优化后,重复执行之前的测试,验证优化效果,看性能指标是否有提升。这是一个迭代的过程。 + +**简化版回答:** 首先确定压测目标和范围,然后准备接近生产环境的测试环境。选择合适的压测工具(如 JMeter),编写模拟用户操作的脚本,配置工具并执行测试。密切监控压测工具和服务器端的性能指标,找出瓶颈并进行优化,最后重复测试验证优化效果,直至达到性能目标。 + +### 白盒测试和黑盒测试的主要区别是什么? + +白盒测试和黑盒测试最主要的区别在于**是否关注被测对象的内部结构和实现逻辑:** + +- 黑盒测试把被测系统看作一个‘黑盒子’,完全不关心它内部是怎么实现的,主要是针对系统对外功能进行验证,比如给定输入,是否得到预期输出。测试人员站在用户的角度,根据需求文档或规格说明,检查系统功能是否符合预期。常用的方法就是前面提到的等价类、边界值、场景法等。" +- 白盒测试则需要了解被测对象的内部代码逻辑、结构和算法。测试的目的是检查代码内部路径是否都能按预期执行、逻辑判断是否正确、是否存在潜在的代码缺陷等。 + +### 什么是单元测试?集成测试?系统测试?回归测试?验收测试? + +- **单元测试(Unit Test)** + - 针对:最小可测试单元(函数、类、模块)。 + - 目标:验证该单元的功能和逻辑是否正确,边界、异常是否处理到位。 + - 特点:依赖少(外部依赖多用 Mock),执行快,通常由开发编写并自动化执行。 +- **集成测试(Integration Test)** + - 针对:多个模块 / 服务之间的组合和交互。 + - 目标:验证接口、数据传递、依赖关系是否正确,模块间能否协同工作。 + - 特点:会使用真实或接近真实的数据库、接口等,关注的是"模块之间"。 +- **系统测试(System Test)** + - 针对:完整系统(所有模块与外部接口集成后)。 + - 目标:从整体上验证系统是否满足需求规格,包括功能、性能、安全、兼容性等。 + - 特点:由测试团队执行,从"系统视角"验证,不关注具体代码实现细节。 +- **回归测试(Regression Test)** + - 针对:每次修改代码后的系统(修 bug、新功能、重构之后)。 + - 目标:确认本次改动没有破坏已有功能,老功能依然按原来方式工作。 + - 特点:高度依赖自动化用例,常在每次迭代、发布前重复执行。 +- **验收测试(Acceptance Test / UAT)** + - 针对:接近上线的完整系统。 + - 目标:由客户 / 业务方 / 产品代表确认系统是否满足业务需求、合同约定,是否可以交付上线。 + - 特点:贴近真实业务场景和生产环境,更关注"是否满足业务和用户预期"。 + +实际项目中,一般遵循"测试金字塔":单元测试自动化率最高(>90%),其上依次是集成测试(60–80%)和少量关键系统/UI 自动化(20–40%),回归尽量依赖自动化,而验收测试则以人工探索和真实业务场景为主。 + +### 单元测试、集成测试、系统测试、回归测试、验收测试最重要的是那一步? + +严格来说,这几个阶段**都重要、互相补充**,但如果面试官逼问"最重要是哪一步",可以这样回答(重点是**理由**): + +- **单元测试**:是质量的第一道防线,越早发现问题,修复成本越低;它保证代码构件本身是可靠的。 +- **集成测试 & 系统测试**:从整体角度保证"拼在一起能不能用"、"业务链路能不能跑通",避免线上出现大面积故障。 +- **回归测试**:保证迭代过程中老功能不被破坏,是持续交付、敏捷开发中非常关键的一环。 +- **验收测试**:从业务和用户角度做最终把关,决定能不能交付上线。 + +如果必须选一个**对业务结果影响最大**的阶段,可以说是: +**系统测试 / 验收测试更关键**,因为它们直接决定系统整体是否可用、能否交付给用户; + +但从"工程实践"和"长期质量保障"来看,**单元测试和回归测试**是最值得投入的,它们决定了团队能否稳定、可持续地迭代。 + +### 什么是端到端测试? + +**端到端测试**(End-to-End Test,E2E)是指**从用户交互入口到系统最终输出结果**,按照真实业务场景,将前端界面、后端服务、数据库、缓存、消息队列、第三方依赖等全部组件串联起来进行的**全流程集成验证**。它模拟真实用户行为,验证整个系统在近生产环境条件下是否满足业务需求。 + +**特点**: + +- 覆盖"完整业务链路",例如:注册 → 登录 → 下单 → 支付 → 查询订单状态; +- 尽量使用与生产环境相似的配置和数据; +- 更关注系统整体可用性和业务流是否跑通,而不是某个单点模块的细节; +- 数量相对较少,但每条用例价值高,适合作为**关键路径回归**和**上线前的最后验证**。 + +### 移动端与 Web 端测试有什么区别? + +| 维度 | 移动端 App 测试 | Web 端测试 | +| ----------- | -------------------------------------------- | -------------------------------------- | +| 架构 & 入口 | C/S 架构,需要安装 App | B/S 架构,通过浏览器访问 | +| 运行环境 | 受机型、系统版本、厂商 ROM 影响大 | 受浏览器内核/版本、操作系统影响 | +| 主要兼容性 | 不同机型、分辨率、iOS/Android 各版本 | 不同浏览器(Chrome/Firefox/Safari 等) | +| 网络相关 | 2G/3G/4G/5G/Wi‐Fi 切换、弱网/无网、前后台 | 不同带宽下页面加载、缓存策略、断网降级 | +| 中断场景 | 来电、短信、通知、锁屏、前后台切换 | 标签页切换、刷新,系统中断较少 | +| UI/交互 | 手势操作、软键盘弹出/收起、全面屏安全区域 | 响应式布局、鼠标键盘操作、窗口缩放 | +| 性能关注点 | 启动时间、流畅度、CPU/内存、耗电、流量 | 首屏时间、资源体积、前端性能、后端响应 | +| 发布方式 | 应用市场发版,有审核;灰度、热更新受平台限制 | 服务器部署,上线/回滚更快,灰度灵活 | +| 典型难点 | 机型/OS 碎片化、网络复杂、功耗与流量 | 浏览器兼容性、复杂前端与多终端适配 | + +### 如何测试 Web 应用的安全性?你会关注哪些常见漏洞? + +重点关注 **OWASP Top 10** 类常见漏洞,针对 Web 端典型场景设计测试: + +**1. XSS(跨站脚本攻击)** + +- 测试位置:输入框、URL 参数、富文本编辑器、评论区 +- 测试用例:`、" onmouseover="alert(1)、` +- 验证点:页面是否执行脚本、是否正确转义/过滤 + +**2. SQL 注入** + +- 测试位置:登录、搜索、筛选、排序等数据库查询场景 +- 测试用例:`' OR '1'='1 --`(登录绕过)、`' UNION SELECT database(),user() --`(信息泄露);时间盲注:`AND SLEEP(5)`、布尔盲注:`AND (SELECT COUNT(*) FROM users)>0` +- 验证点:是否使用参数化查询、是否暴露数据库错误信息、是否对输入做类型校验 + +**3. CSRF(跨站请求伪造)** + +- 测试场景:修改密码、转账、删除数据等敏感操作 +- 测试方法:检查是否有 CSRF Token,尝试第三方页面构造伪造请求 +- 验证点:Token 验证机制、Referer / Origin 校验 + +**4. 身份认证与会话管理** + +- 测试位置:登录/退出流程、会话保持 +- 测试方法:Session 固定攻击测试,退出后 Token 有效性验证 +- 验证点:会话是否及时失效,是否允许暴力破解 + +**5. 敏感信息泄露** + +- 测试位置:API 响应、错误页面、前端代码 +- 测试方法:密码/密钥/内部路径是否暴露,错误信息是否过度详细 +- 验证点:敏感数据是否脱敏,错误信息是否通用化 + +**6. 访问控制失效** + +- 测试位置:用户资料查看、订单数据、文件下载、管理员接口、导出接口 +- 测试方法:越权访问,提升权限 +- 验证点:是否返回他人数据;RBAC(角色访问控制)是否生效 + +### API 功能测试如何做? + +API 功能测试的核心目的其实很简单:**确认你的 API 是否按照设计(例如 API 文档或需求)准确工作**。它并不在乎界面的美观程度,而是关心当我们调用该 API 时,能否正确接收请求、处理业务逻辑并返回预期的响应,以及是否会产生相应的"副作用"(例如对数据库记录的增删改)。 + +1. **仔细阅读 API 文档(如 Swagger/OpenAPI)** :了解请求的 URL 及方法(GET、POST 等),参数类型(路径参数、查询参数)、请求体格式(JSON、XML)以及成功/失败时对应的状态码等信息。 +2. **设计覆盖多种场景的测试用例** :在充分理解 API 的基础上,编写不同维度的用例,包括正确输入、无效输入、非法输入以及边界值等,以确保各种情况得到测试。 +3. **准备相关数据与认证信息** :可能需要在数据库中预先插入初始数据或异常数据。根据场景需求,还要配置 API Key、Token 等认证信息,以便顺利调用接口。 +4. **选用合适的测试工具并执行测试** :可使用 Postman、Reqable、Insomnia 等工具。根据测试用例构造 HTTP 请求(设置方法、URL、Headers、Body 等),执行后得到实际响应(状态码、响应头、响应体)并进行校验。 +5. **对比实际响应与预期结果** :关注状态码是否正确,返回数据是否与预期一致,数据库记录是否跟随请求生效等。任何偏差都可能意味着缺陷或需求不匹配。 +6. **记录测试结果并报告问题(Bug)** :对于用例执行失败的情况,需要在报告中包括完整的请求信息、预期结果、实际结果以及重现步骤,方便团队排查修复。 + +**简化版回答:** API 功能测试的核心是确认接口是否按设计正确工作,主要做法是先阅读文档,弄清楚请求方法、参数和返回值,然后设计覆盖正常、异常与边界场景的用例,准备好测试环境和认证信息,再利用 Postman 等工具发起请求并查看状态码和响应体,接着核对数据库等是否与预期一致,最后将失败用例的请求、预期和实际结果记录下来,方便快速定位并修复问题。 + +### 什么是正向测试和反向测试?能否举例说明 + +**解释**: + +- 正向测试(Positive Testing):使用**合法、合理、期望的输入**,验证系统在正常使用场景下是否按需求工作。 +- 反向测试(Negative Testing):使用**非法、异常、边界或恶意的输入/操作**,验证系统对异常情况的处理能力和鲁棒性。 + +**例子(登录功能)**: + +- 正向测试:输入正确账号 + 正确密码 → 登录成功。 +- 反向测试:账号为空 / 密码为空、密码错误、输入超长字符串、注入脚本、多次输错触发锁定/验证码。 + +### 可用性测试和用户体验测试有什么区别? + +可用性测试评估系统是否易学、易用、易理解,关注点在于:操作流程是否顺畅、提示是否清晰、错误率高低。 + +用户体验测试(UX)评估整体主观感受,关注点在于:用户情绪、满意度、视觉美感、品牌感知等。 + +| **维度** | **可用性测试 (Usability Testing)** | **用户体验测试 (UX Testing)** | +| ------------ | ------------------------------------------ | ---------------------------------------------------- | +| **核心目标** | 产品能否被高效、准确地使用 | 使用过程是否愉悦、有价值、令人满意 | +| **关注范围** | 任务执行效率(交互流程、认知负荷、容错性) | 完整体验旅程(使用前期待 + 使用中感受 + 使用后回忆) | +| **测试维度** | 功能层面 | 情感+功能+审美全方位 | +| **衡量指标** | 任务完成率、时间、错误数 | 满意度评分、NPS、情感反馈 | +| **相互关系** | 是 UX 的基础子集 | 包含可用性 + 情感/价值层面 | +| **测试时机** | 常在开发中后期进行功能验证 | 贯穿产品全生命周期(概念验证到迭代优化) | + + diff --git a/docs/snippets/article-footer.snippet.md b/docs/snippets/article-footer.snippet.md new file mode 100644 index 0000000..72e3fad --- /dev/null +++ b/docs/snippets/article-footer.snippet.md @@ -0,0 +1,9 @@ +## 写在最后 + +感谢你能看到这里,也希望这篇文章对你有点用。 + +JavaGuide 坚持更新 6 年多,近 6000 次提交、600+ 位贡献者一起打磨。如果这些内容对你有帮助,非常欢迎点个免费的 Star 支持下(完全自愿,觉得有收获再点就好):[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)。 + +如果你想要付费支持/面试辅导(比如简历优化、一对一提问、高频考点突击资料等)的话,欢迎了解我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。已经坚持维护六年,内容持续更新,虽白菜价(0.4元/天)但质量很高,主打一个良心! + +JavaGuide 公众号 \ No newline at end of file diff --git a/docs/snippets/small-advertisement.snippet.md b/docs/snippets/small-advertisement.snippet.md new file mode 100644 index 0000000..7ed8e16 --- /dev/null +++ b/docs/snippets/small-advertisement.snippet.md @@ -0,0 +1,5 @@ +::: tip 这是一则或许对你有用的小广告 + +给自己打个小广告,如果需要面试辅导(比如简历优化、一对一模拟问答、高频考点突击资料等),欢迎了解我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。已经坚持维护六年,内容持续更新,虽白菜价(0.4元/天)但质量很高,主打一个良心! + +::: diff --git a/docs/snippets/yuanma.snippet.md b/docs/snippets/yuanma.snippet.md new file mode 100644 index 0000000..643e3ed --- /dev/null +++ b/docs/snippets/yuanma.snippet.md @@ -0,0 +1,25 @@ +[《Java 必读源码系列》](../zhuanlan/source-code-reading.md)(点击链接即可查看详细介绍)的部分内容展示如下。 + +![《Java 必读源码系列》](https://oss.javaguide.cn/xingqiu/image-20220621091832348.png) + +为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的[Java 面试知识星球](../about-the-author/zhishixingqiu-two-years.md)。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面,非常适合准备 Java 面试和学习 Java 的同学。 + +**欢迎准备 Java 面试以及学习 Java 的同学加入我的 [知识星球](../about-the-author/zhishixingqiu-two-years.md),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。** + +下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍): + +[![星球服务](https://oss.javaguide.cn/xingqiu/xingqiufuwu.png)](../about-the-author/zhishixingqiu-two-years.md) + +**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!** + +如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍:[JavaGuide 知识星球详细介绍](../about-the-author/zhishixingqiu-two-years.md) 。 + +这里再送一个 **30** 元的星球专属优惠券,数量有限(价格即将上调。老用户续费半价 ,微信扫码即可续费)! + +![知识星球30元优惠卷](https://oss.javaguide.cn/xingqiu/xingqiuyouhuijuan-30.jpg) + +进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://t.zsxq.com/12uSKgTIm)** 。 + +**无任何套路,无任何潜在收费项。用心做内容,不割韭菜!** + +不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。

AltStyle によって変換されたページ (->オリジナル) /