- 博客(133)
- 收藏
- 关注
原创 Python中return和yield的区别
Python中return和yield的区别:return立即终止函数并返回值,函数状态被销毁;yield则暂停函数并保留状态,返回生成器对象用于惰性计算。return适合一次性返回全部结果(如普通函数),而yield适合处理大数据流或无限序列(如生成器)。关键差异在于状态保存和内存效率:return直接返回结果,yield按需生成值。示例显示squares_return返回完整列表,而squares_yield逐个生成平方数。选择依据取决于是否需要立即计算或逐步处理数据。
2025-06-01 01:46:39
313
原创 Pytest Fixture 是什么?
Pytest Fixture 核心解析 Fixture是Pytest测试框架的核心功能,用于为测试函数提供依赖资源与环境管理。其主要特点包括:依赖注入、作用域控制(测试/模块/会话级)、自动资源清理(通过yield实现)和代码复用。相比传统手动setup/teardown方式,Fixture通过声明式依赖注入,显著减少重复代码,确保资源可靠释放,并提升测试可维护性。典型应用场景包括数据库连接、临时文件管理、Mock对象模拟等。其工作流程分为定义、请求(资源注入)和清理三个阶段,通过@pytest.fixtu
2025-06-01 01:18:07
503
原创 Pytest Fixture 详解
Pytest Fixture 详解摘要 Fixture 是 pytest 的核心功能,用于管理测试依赖(如数据库连接、临时文件),支持复用、作用域控制和自动清理。通过 @pytest.fixture 定义,可指定 scope(函数/类/模块/会话级)控制生命周期,结合 yield 实现资源清理。Fixture 支持参数化、自动执行(autouse=True)和依赖注入,并能通过 conftest.py 共享或覆盖。内置 Fixture(如 tmp_path、capsys)简化常见需求。最佳实践包括:将 Fi
2025-06-01 01:17:23
366
原创 pytest 常用命令参数
本文总结了pytest常用命令参数,帮助开发者高效运行和管理测试。主要内容包括: 基本测试运行:如pytest运行所有测试,-v显示详细信息,-s输出调试信息。 测试选择:通过-k模糊匹配用例,::指定具体测试,-m运行标记用例。 失败控制:支持重跑失败用例(--lf)、失败时停止(-x)、进入调试(--pdb)。 测试报告:生成覆盖率报告(--cov)、HTML报告(--html)、分析慢测试(--durations)。 其他功能:查看fixture(--fixtures)、仅收集用例(--collect
2025-06-01 00:24:09
328
原创 pytest 常见问题解答 (FAQ)
本文总结了使用pytest测试框架时的常见问题及解决方案,内容涵盖基础配置、高级用法、错误处理、性能优化等方面。主要包括:测试文件命名规则、特定测试运行方式、详细输出控制;pytest.ini配置文件编写、测试跳过方法;fixture依赖注入、参数化测试的实现;常见错误排查、插件冲突解决;覆盖率报告生成、并行测试执行;调试技巧和大型测试套件组织建议;以及异常测试方法和性能优化技巧。文章提供了实用的命令行参数和代码示例,帮助开发者高效使用pytest进行Python测试。
2025-05-31 19:57:43
442
原创 k6 是什么
摘要: k6是一款轻量级开源性能测试工具,专为云原生和微服务设计,支持高并发压测。核心特性包括: 脚本化测试:用JavaScript编写用例,灵活模拟复杂场景; 多种压测模式:支持固定并发、阶梯加压及脉冲流量; 丰富指标输出:集成Prometheus等,实时监控性能数据; 分布式执行:通过k6-operator扩展至Kubernetes集群。 相比JMeter,k6更轻量、易集成,适合API、微服务测试及弹性验证,但UI测试需结合其他工具。典型应用包括自动化流水线集成和全链路压测。
2025-05-31 01:47:07
930
原创 如何科学测量系统的最高QPS?
摘要:测量系统最高QPS需科学方法而非盲目加压。核心原则是找到稳定运行的性能极限,关注QPS、响应时间(P90/P99≤500ms)、错误率(≤1%)及资源利用率。测试分四步:1)基准测试确定低负载表现;2)梯度加压至性能拐点(错误率或延迟超标);3)极限测试验证短期峰值;4)稳定性测试(80%最高QPS持续12小时)。避免三大误区:忽视成功率、压垮服务、环境差异。工具推荐JMeter/Grafana,优化需参数化请求及分布式压测。最高QPS定义为错误率≤1%时的峰值,如1500 QPS(错误率0.5%)优
2025-05-31 00:10:53
919
原创 QPS 和 TPS 详解
QPS(每秒查询数)和TPS(每秒事务数)是衡量系统吞吐性能的关键指标。QPS统计每秒处理的请求数,适用于接口和缓存测试;TPS衡量每秒完成的事务数,关注业务完整性,如支付流程。两者区别在于QPS包含所有请求,而TPS仅统计成功事务。一个事务可能包含多个请求,因此QPS≈TPS×N。性能优化时,提高QPS可通过扩展服务器或使用缓存,提升TPS需优化事务逻辑或数据库结构。理解两者差异有助于精准评估系统性能瓶颈。
2025-05-31 00:08:45
838
原创 K6 是什么
K6是一款现代化的开源性能测试工具,专为开发者设计,用于测试Web应用、API和微服务。它采用JavaScript脚本编写测试用例,具有高性能、低资源消耗的特点,支持CI/CD集成和分布式测试。核心功能包括开发者友好的脚本、丰富的指标输出和多种测试类型支持。K6特别适合API性能测试、微服务基准测试和自动化性能回归,比传统工具如JMeter更轻量高效。虽然学习需要JavaScript基础,但其代码即配置的方式和强大的社区支持使其成为云原生测试的理想选择。
2025-05-29 22:07:49
601
原创 LoadRunner 是什么
摘要:LoadRunner性能测试工具简介 LoadRunner是Micro Focus开发的性能测试工具,用于负载测试、压力测试和性能分析。其核心功能包括虚拟用户模拟、多协议支持(如HTTP、数据库)、负载场景配置,以及通过图表报告定位性能瓶颈。主要组件有VuGen(脚本录制)、Controller(场景管理)和Analysis(结果分析),适用于Web、API及企业系统测试。相比JMeter等开源工具,LoadRunner扩展性更强,适合复杂企业级场景,但成本较高。学习可从基础脚本录制入手,逐步掌握高级
2025-05-29 21:40:50
344
原创 JMeter 是什么
JMeter是一款开源的性能测试工具,支持Web应用、API、数据库等多种协议的压力测试和负载测试。它能模拟高并发用户操作,提供丰富的测试元件(如线程组、Sampler、断言等)和可视化报告,帮助评估系统性能和稳定性。典型应用包括Web压力测试、API性能评估和数据库负载测试。JMeter支持分布式测试和CI/CD集成,但资源消耗较大,建议通过命令行运行优化性能。相比Locust、Gatling等工具,JMeter功能更全面但学习曲线较陡,适合复杂场景的性能测试需求。
2025-05-29 21:38:30
858
原创 JaCoCo 是什么
JaCoCo是一款Java代码覆盖率工具,用于分析测试用例对代码的覆盖程度,帮助开发者识别未测试区域。它支持行、分支、方法和类覆盖率统计,并能生成HTML、XML等多种格式报告。通过与Maven、Gradle等构建工具集成,JaCoCo可以在测试时动态收集覆盖率数据。其工作原理是通过字节码插桩记录代码执行情况。配置简单,只需在pom.xml添加插件即可快速生成可视化报告。JaCoCo还能与Jenkins、SonarQube等CI/CD工具集成,设置覆盖率阈值进行质量管控。相比Cobertura等工具,JaC
2025-05-29 21:05:25
584
原创 CI/CD 持续集成、持续交付、持续部署
摘要:CI/CD(持续集成/持续交付与部署)通过自动化流程加速软件交付,提升质量与协作效率。持续集成(CI)频繁合并代码并自动测试;持续交付(CD)确保代码可随时手动部署,而持续部署进一步实现全自动化发布。核心工具包括Jenkins、GitHub Actions等,需结合标准化版本控制、自动化测试及渐进式部署。适用于高频迭代项目,但需避免过度自动化或工具依赖。CI/CD是DevOps的关键实践,平衡效率与风险方能最大化价值。
2025-05-29 18:46:04
1360
原创 Postman 是什么
Postman 是 API 开发者的“瑞士军刀”,尤其适合快速调试、团队协作和自动化测试。对于简单需求,免费版足够使用;复杂场景(如企业级 CI/CD)可能需要升级到付费计划。等多种 API 类型,适用于开发者、测试工程师和 DevOps 团队。,旨在简化 API 的生命周期管理,包括设计、调试、测试、文档化和协作。
2025-05-28 01:30:13
1098
原创 Playwright 是什么
Playwright是微软开发的现代化Web自动化测试框架,支持跨浏览器、跨平台和多语言测试。核心特点包括全浏览器支持、自动等待、网络拦截和移动端模拟。它通过无头浏览器驱动直接通信,速度更快,并支持并行测试。相比Cypress和Selenium,Playwright在多语言支持、执行速度和网络拦截方面更具优势。适用于复杂Web应用测试、视觉回归测试等场景。安装简单,支持进阶功能如并行测试和移动端模拟。优点是执行速度快、调试工具丰富,缺点是不支持老旧浏览器。Playwright是新一代测试标杆,适合追求高可靠
2025-05-28 01:11:34
340
原创 Cypress 是什么
Cypress 是一个现代化的前端端到端(E2E)测试框架,专为Web应用设计。其核心特点包括全栈测试能力(E2E、组件和API测试)、实时交互调试、自动等待机制和内置断言库。Cypress直接运行在浏览器中,实现快速执行和原生访问,适合React/Vue等单页应用测试。相比Selenium,Cypress调试更便捷但浏览器支持有限。通过npm即可快速安装使用,是Web自动化测试的高效解决方案。
2025-05-28 01:02:06
403
原创 XCUITest 是什么
XCUITest是苹果官方提供的iOS/macOS UI自动化测试框架,集成在Xcode中,支持Swift/Objective-C编写测试用例。核心特点包括官方支持、Xcode深度集成、精准元素定位和CI/CD兼容。适用于原生App的UI自动化测试,与单元测试结合构建完整测试体系。相比Appium,XCUITest执行更快更稳定,但仅限于苹果生态。学习需要Swift基础,可通过官方文档和Xcode实践掌握。作为iOS测试的官方方案,XCUITest是苹果生态测试开发的关键技能。
2025-05-28 00:57:36
958
原创 Airtest 是什么
摘要: Airtest 是网易开源的跨平台 UI 自动化测试框架,支持 Android、iOS、Windows 及主流游戏引擎(Unity/Unreal)。其核心优势在于 图像识别测试(通过截图定位元素)和 低代码化(AirtestIDE 可视化脚本生成),尤其适合游戏、动态 UI 及快速验证场景。结合 Poco 框架 可实现控件层级定位,兼顾灵活性与易用性。与 Appium 等工具相比,Airtest 学习成本低、跨平台兼容性强,但图像识别易受分辨率影响,性能较慢。适用于非技术测试人员或游戏项目,传统 A
2025-05-28 00:53:17
966
原创 UIAutomator2 是什么
摘要: UIAutomator2 是 Google 推出的 Android UI 自动化测试框架,适用于系统级和跨应用测试。相比旧版,它基于 UiAutomation 服务,性能更优,支持更多手势操作和灵活的控件定位,且无需签名匹配。核心组件包括 UiDevice(设备操作)、UiSelector(元素定位)和 UiScrollable(滚动列表)。需通过 AndroidX Test 集成,适合测试系统应用及跨交互场景,但仅支持 Java 且学习成本较高。替代方案包括 Appium(跨平台)和 Espres
2025-05-28 00:49:21
816
原创 UIAutomator 是什么
摘要: UIAutomator 是 Google 推出的 Android 黑盒自动化测试框架,支持跨应用操作(如系统设置、通知栏),无需源码即可测试已安装的 APK。其核心组件包括 UiDevice(设备控制)、UiSelector(元素定位)和 UiObject(控件操作),通过 Java 编写测试脚本。优势在于系统级测试能力与稳定性,但仅限 Android 平台且依赖 Java。适用于多应用交互场景,与 Espresso(白盒)、Appium(跨平台)形成互补。开发者在 build.gradle 添加依
2025-05-28 00:43:17
727
原创 MonkeyRunner 是什么
MonkeyRunner是Android早期提供的基于Python的自动化黑盒测试工具,允许通过脚本控制设备执行点击、滑动等操作,支持截图比对和多设备管理。其特点包括无需源码、坐标/控件驱动测试,但缺乏现代测试框架的同步机制和语义化API。虽然适用于兼容性测试和简单压力测试,由于依赖ADB通信、脚本脆弱且Google已停止维护,目前逐渐被Espresso、UIAutomator等现代框架取代。仅建议在老设备测试或需要图像验证时临时使用,新项目推荐采用更先进的测试方案。
2025-05-28 00:34:45
925
原创 Espresso 是什么
摘要: Espresso是Google官方专为Android开发者推出的Android UI测试框架,不具备跨平台,需要持续维护,不建议测开工程师使用
2025-05-28 00:29:54
590
原创 Robotium 是什么
摘要:Robotium是一个专用于Android应用UI自动化测试的黑盒测试框架,基于Instrumentation运行,提供简单API模拟用户操作。其核心特点包括仅支持Android、依赖Instrumentation、黑盒测试友好、API简洁及执行速度快。Robotium通过反射访问UI元素,适合功能测试和回归测试,但仅限Android平台,且依赖签名匹配。相比Appium,Robotium速度更快但跨平台能力不足。替代方案包括Espresso和UiAutomator。适用于快速Android功能测试,
2025-05-28 00:23:48
767
原创 Android 全系统版本文件读写最佳适配,CV 即用(适配到 Android 14)
Android 12及以下系统,我们只需要声明READ_EXTERNAL_STORAGE权限即可。并且由于从Android 13开始这个权限就被废弃了,因此还要加上maxSdkVersion="32"才行。参考文献:郭神: https://blog.youkuaiyun.com/guolin_blog/article/details/137410229。Android 13新增了3个运行时权限,分别用于控制App对照片、视频、音频的访问。这是能够完美适配Android各个系统版本的本地读写权限的写法。
2024-08-14 11:16:36
678
原创 时间复杂度、空间复杂度,这里一次讲清楚
无论是时间复杂度和空间复杂度都是是用来衡量算法在处理不同规模数据时所需的时间和内存的变化情况,是不同角度的衡量结果。在算法分析中,大O符号(O)表示算法的渐近时间(或空间)复杂度。它描述了算法运行时间(或空间占用)与输入规模的增长关系。
2024-06-12 15:39:50
712
原创 git上传了一个文件到远程仓库里面,之后如何忽略它
我们可能会遇到这种情况,因为一些失误或者别人的粗心,将一些本地的文件上传到了远程仓库,而且这个文件是环境相关的,随着不同开发者的环境,编译器会动态修改,从而导致每个人都不同。如果你之前已经将文件上传到了远程仓库,你需要使用 Git 命令从远程仓库中删除该文件。这将从 Git 索引中删除该文件,并阻止 Git 跟踪它。但是请注意,这不会删除实际的文件。在提交过程中相互覆盖,而且影响运行,应该怎么做呢,现在提供解决方案。现在你的远程仓库应该已经忽略了该文件。的文件,可以在文件中添加一行。文件提交到远程仓库。
2024-02-27 17:42:23
846
原创 LiveData底层实现
提供了一个简单而强大的机制,使得数据在组件之间的通信变得更加容易和可靠。同时,它也遵循了生命周期的管理,避免了内存泄漏和不必要的数据更新。这样可以确保观察者能够接收到最新的数据,即使它们在数据变化之后才注册。使用了弱引用来引用观察者,这意味着如果观察者没有被其他引用持有,它将会被垃圾回收,避免了内存泄漏。是一个可观察的数据持有类,它可以在数据变化时通知注册的观察者。会确保通知观察者是在主线程执行的,以保证 UI 更新操作在主线程进行。的生命周期状态,并在相应的生命周期状态下决定是否分发数据更新通知。
2023-09-19 12:47:03
325
原创 ArrayMap 和 HashMap的区别
都是在 Android 开发中常用的数据结构,用于存储键值对。它们之间的主要区别在于内部实现和适用场景。在 Android 开发中,根据具体的场景和需求选择合适的数据结构非常重要。可能是一个更好的选择。但如果你处理的是大规模数据集,并且需要高效的查询操作,那么。总的来说,如果你处理的是小型数据集,并且对内存占用有较高要求,那么。
2023-09-19 12:41:25
628
原创 lock和synchronized的区别
综上所述,选择使用Lock还是取决于具体的需求和场景。通常来说,如果只需要简单的同步控制,已经足够了。如果需要更高级的锁定机制、性能优化或者其他特殊需求,可以考虑使用Lock接口。
2023-09-19 12:32:15
241
原创 基于ConstraintLayout的增强布局,专注于过渡动画实现的动画框架:MotionLayout
继承自,布局内容的写法就完全遵循ConstraintLayout,布局就交给了ConstraintLayout是一个动画框架,专注于实现过渡动画Android动画分类:View 动画API 1 加入帧动画补间动画属性动画API 11 加入调用方式:使用 ObjectAnimator 或 ValueAnimator 来对布局的属性进行动画处理也可以使用 View 的 animate() 方法来执行动画。这是一种更简洁的方式,但背后实际上也是在使用属性动画过渡动画API 18 加入。
2023-09-15 17:59:12
231
原创 View绘制流程的源码所得
子线程不是不能更新UI,而是谷歌工程师不让我们在子线程更新UI,是一种代码级别的约定,因为如果任意线程都能更新UI,那么系统工程师就需要做线程安全,每次更新UI都得执行加锁、解锁操作,浪费性能,还得考虑各种意外情况出于成本考虑,强制让开发者在主线程更新UI,能解决掉非常大的性能问题和巨量的工作,所以说不允许在子线程更新UI。
2023-09-12 22:50:15
248
原创 布局过程的完全解析
那么为什么要分为两个流程呢因为测量流程是一个复杂的流程,有时候不一定一遍就能得出测量结果,可能需要2 - 3次甚至更多需求:实现一个正方形的ImageView这样可以实现我们的效果,但是为什么不能这样写呢?因为这是父View在他的OnLayout方法中会调用字view的layout,让子view将自己的尺寸保存下来,而我们在这个过程中修改了自己的尺寸,父view是不知道的,后续的过程中父view会一直认为我们的尺寸是他传给我们的那个,会发生意想不到的效果。
2023-09-10 23:14:00
159
原创 一:图形的位置和尺寸测量
如果要确定一个点是在内部还是外部,那么就从这个点像任意方向发送一条射线,这条线遇到左旋(逆时针)路径就+1,右旋路径就-1,最终结果无论正负,只要不为0,那么这就是一个在内部的点。,Direction主要是用来处理两个图形相交处的样子,通过Direction的配合使用,可以使图形相交地方之处实现实心还是镂空的效果,这里有一个标准。第二个参数的作用是是否要自动闭合,如果一个图形假设是个半圆,那么测量的就是这个半圆的长度,如果是true就是半圆+起始点连接线的长度。举个例子,一个圆和一个方相交。
2023-09-08 15:18:22
288
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人