libotest xiaobotester01
关注数: 58 粉丝数: 657 发帖数: 3,571 关注贴吧数: 89
大疆创新-测试工程师面试体验总结 一面: 1、测试开发中的杀虫剂效应 2、测试开发哪个阶段bug比较多 3、研发提交代码质量反馈阶段 4、自己经历跨度比较大:喜欢有挑战性的事情,不同的位置去尝试 5、为什么选择测试 6、为什么选择大疆 7、大疆新品有了解吗 8、反问:收获与成长 二面: 1、自我介绍 2、介绍实习:优秀实习生小组、功耗下降趋势是怎么样的 3、介绍项目:如何判断2000个客户端是服务器达到极限了而不是机器(阿里云网站数据) 4、为什么想做测试(1.重要,2.上岸机会更大) 5、实习时怎么测的接口 6、为什么想来大疆(酷,科技感,研发导向利好技术人员,年轻企业,机会多成长快) 7、对大疆产品有了解吗,用过什么产品(手持影像系统,自动跟踪,可以用在哪些场合) 8、自己未来的职业规划 9、反问:是否有机会深度参与贯穿“芯片-操作系统-算法-应用软件-云端软件-硬件-结构”全栈技术的测试业务挑战,获得快速成长。 终面(hr面):会议里一共三个人,另外一个应该是HR 1、自我介绍(实习介绍完喝了一口水,面试官说先到这开始问问题) 2、为什么跨专业,跨专业应该挺困难怎么做到的 3、实习时有哪些做的好的地方和不好的地方 4、实习期间遇到哪些困难 5、用过大疆的哪些产品,有什么建议吗 6、为什么做测试 7、为什么想来大疆 8、自己的职业规划 9、反问:可以接触到业务的方方面面吗,然后问自己的开发经历也比较多,可以往测试开发方向发展吗
软件测试学习路线 【全栈测试工程师技术进阶路线】 1.软件测试基础知识内容 软件测试职业以及发展定位 软件测试的概述&原则 软件测试的策略及详细讲解 软件测试的生命周期 软件测试工作流程 软件需求分析制作详解 软件测试计划的编写 软件测试用例的常用方法--等价类,边界值 软件测试用例的常用方法--因果图,判定表 测试用例的常用方法--状态迁移图;场景法 软件测试环境准备&团队组织架构&职责划分 bug编写规范,教你写出不low的缺陷 bug的流转与状态处理 缺陷编写规范与流程处理 缺陷编写规范与流程处理 2.MySQL数据库知识 数据库对测试人员的重要性 数据库概述 数据库安装 navicat连接数据库 简单的增删改查语句 DDL语言+类型与约束 数据库的增删改操作 数据库的其他约束 数据库的删除操作 3.接口测试基本知识 接口测试原理本质 接口测试用例编写和设计 Postman部署与接测试以及断言 Postman测试集使用&参数化 Postman接口关联以及发送报告 Fiddler环境搭建及原理&抓包、过滤、断点 Fiddler模拟mock实战及弱网实战 Jmeter常见元件详解及接门测试参数化 Jmeter接门关联、断言及JDBC包使用 Jmeter的jar包使用及生成测试报告 4.Python编程技术 编程语言介绍/编程概念讲解/环境搭建 Python编程思维及语法:变量的定义及基本使用 Python编程思维及语法:基本运算、基本数据类型、 Python编程思维及语法:输⼊与输出、数据的类型转换 Python编程逻辑流程:数学运算符/比较运算符/赋值运算符 Python编程逻辑流程:逻辑运算符/成员运算符 Python编程逻辑流程:程序中的条件分支--if Python编程逻辑流程:程序中的循环结构--while Python中的数据类型:python中的list列表定义 Python中的数据类型:python中的list列表操作流程 Python中的数据类型:python中的dict字典定义 Python中的数据类型:python中字典的增删改查 Python中的数据类型:元组在python中的应用 Python复杂操作:range函数在python中的意义 Python复杂操作:for循环的定义实操 Python复杂操作:字符串、列表的切片操作 Python中的数据类型:python中的集合应用 Python函数:python中的函数定义 Python函数:python中函数的注释 Python函数:python中函数的嵌套 Python函数:python中的内置函数 Python函数:python中的匿名函数 Python函数:python中函数的调用与引用的概念 Python函数:python中的装饰器详解 Python中的模块化与引用关系 Python导包:from关键字与import关键字的应用场景 python中的文件操作 面向对象:python中的类机制 面向对象:类属性的概念与应用 面向对象:类中的继承概念应用 面向对象:类中的多态概念 面向对象:异常机制 5.Web自动化测试技术 Web自动化测试入门:前端页面的组成分析详解 Web自动化测试入门:javascript操作Dom元素详解 Web自动化测试入门:selenium中的环境搭建详解 Web自动化测试入门:selenium原理,UI自动化的核心含义 Web自动化测试入门:从手工用例向自动化测试用例的迈进 Web自动化测试入门:常规定位--八大元素定位 Web自动化测试入门: 元素定位之selenium4.0特有网格定位 Web自动化测试入门: 元素定位之selenium元素内定位 Web自动化测试进阶:网页中难点之等待机制--强制等待 Web自动化测试进阶:网页中难点之等待机制--隐式等待 Web自动化测试进阶:网页中难点之expected_conditions的应用与原理 Web自动化测试进阶:网页中难点之等待机制--显式等待 Web自动化测试进阶:网页中难点之匿名函数在等待中的使用 Web自动化测试进阶:selenium模拟鼠标操作 Web自动化测试进阶:selenium模拟键盘操作 Web自动化测试进阶:ActionChain模拟拖动滚动操作 Web自动化测试进阶:实战中的单选复选框选择 Web自动化测试进阶:实战中的下拉框定位问题 Web自动化测试进阶:selenium中的switch_to函数详解 Web自动化测试进阶:selenium中的句柄操作详解 Web自动化测试进阶: 网页中难点之frame切换 Web自动化测试进阶: 网页中难点之多窗口切换 Web自动化测试进阶: 网页中难点之alert切换 Web自动化测试进阶:实战项目中难点之验证码问题 Web自动化测试进阶:图像处理的灰度化与二值化操作 Web自动化测试进阶:验证码处理之OCR图像识别操作 Web自动化测试进阶:验证码处理之cookie跳过验证码操作 Web自动化测试进阶:验证码处理之js处理方案 Web自动化测试进阶:自动化中的难点--文件上传操作 Web自动化测试进阶:自动化中的难点之input标签文件选择 Web自动化测试进阶:自动化中的难点之非input标签文件选择 Web自动化测试进阶:实战难点之多文件上传 Web自动化测试进阶:实战难点之iframe日期控件 Web自动化测试框架篇:unittest+pytest框架入门应用 Web自动化测试框架篇:实战中的pytest框架规则 Web自动化测试框架篇:pytest框架夹具及顺序 Web自动化测试框架篇:pytest框架插件实战详解 Web自动化测试框架篇:如何利用pytest框架生成测试报告 Web自动化测试框架篇:POM核心设计思路详解 Web自动化测试框架篇:POM的业务代码逻辑与组件分离 Web自动化测试框架篇:用POM思想设计一套框架 Web自动化高级篇:用POM思想重构unittest框架代码 Web自动化高级篇:进阶思路--从POM到关键字驱动 Web自动化高级篇:测试报告生成及Allure报告优化 Web自动化高级篇:Allure报告生成之用例重运行 Web自动化高级篇:Allure的装饰器执行流程 Web自动化高级篇:Allure的截图,异常截图操作 Web自动化高级篇:自动化执行记录之自定义框架日志封装 Web自动化高级篇:自定义框架封装设计理念 Web自动化高级篇:关键字与核心执行器封装 Web自动化高级篇:自动化测试重复流程的抽取和处理 Web自动化高级篇:数据驱动与数据分离--yaml文件驱动 Web自动化高级篇:动态化测试用例的生成与断言数据的生成 Web自动化拓展:web自动化分布式测试Grid介绍 Web自动化拓展:Web自动化分布式测试之selenium-Grid的hub详解 Web自动化拓展:Web自动化分布式测试之selenium-Grid的Nodes详解 Web自动化拓展:Web自动化分布式测试之selenium-Grid的配置详解 Web自动化拓展:全面提升测试效率--实战中的Grid的应用与常见问题处理 6.接口自动化测试 接口自动化入门: Http请求的核心概念及原理详解 接口自动化入门: Http的请求头,请求体,响应码解析 接口自动化入门: Http请求的域名与IP地址概念 接口自动化入门: swagger/word/excel/pdf等不同种类的接口文档理解 接口自动化入门:项目实战中接口测试流程分析及实现 接口自动化入门:Jmeter实现在接口工具中关联接口处理方案 接口自动化入门:Jmeter的多组数据测试、JDBC驱动及数据断言 接口自动化入门:JSON中的万能密码--JSONPath解析 接口自动化入门:大型项目中接口测试分工协同安排 接口自动化入门:接口自动化思维逻辑梳理及相关环境搭建 接口自动化入门:接口自动化实战项目需求分析+用例分析 接口自动化入门:Requests组成介绍及接口调用方式 接口自动化入门:Requests请求头设置详解 接口自动化入门:Requests的RESTFul请求发送 接口自动化入门: Requests实现项目接口关联调用测试实战 接口自动化入门:登录流程中的Session,Token鉴权实践 接口自动化入门:requests中的Assert断言处理 接口自动化入门: 加密接口处理之对称加密 接口自动化入门:加密接口处理之非对称加密 接口自动化进阶:Pytest运行规则插件安装常用参数详解 接口自动化进阶:Pytest结合Requests实现自动化 接口自动化进阶:Pytest全局配置pytest.ini文件详解 接口自动化进阶:Pytest之Fixture拓展及conftest.py加载机制 接口自动化进阶:Pytest之Parameterize数据驱动应用 接口自动化框架篇:Pytest断言处理以及Allure报告生成 接口自动化框架篇:Pytest+Allure报告企业定制化实现 接口自动化框架篇:Pytest企业级接口用例管理流程 接口自动化框架篇:Pytest中的接口请求封装 接口自动化框架篇:Pytest中的接口关联封装 接口自动化框架篇:优化逻辑--接口关联封装改进 接口自动化框架篇:规范JSON数据格式测试用例封装 接口自动化框架篇:接口框架中如何实现热加载封装 接口自动化框架篇:接口框架中的常归断言封装 接口自动化框架篇:接口框架中的日志记录封装 接口自动化框架篇:使用python连接数据库-PySQL介绍 接口自动化框架篇:PySQL的游标概念及数据操作 接口自动化框架篇:PySQL的游标概念及数据操作 接口自动化框架篇:Mysql数据库数据断言封装 接口自动化框架篇:接口框架中的数据类型处理 接口自动化框架篇:核心执行器封装流程 接口自动化框架篇:框架中的数据流转处理 接口自动化框架篇:框架中的不同请求方式封装 接口自动化框架篇:自定义异常日志封装 接口自动化框架篇:自定义断言封装逻辑 接口自动化框架篇:BaseURL基础路径封装 接口自动化框架篇:接口加密解密封装 接口自动化框架篇:接口签名Sign封装 接口自动化框架篇:接口自动化框架的测试报告生成 接口自动化拓展:接口Mock的理念与实战场景 接口自动化拓展:Flask框架安装、介绍及工作中的应用 接口自动化拓展:Flask框架与前端页面的通讯 接口自动化拓展:Flask框架的数据库操作 接口自动化拓展:Flask框架的增删改查接口实战 7.APP自动化测试 App自动化测试入门:APP测试的定义及环境搭建处理 App自动化测试入门:Appium设计理念解析 App自动化测试入门:APP测试中常用的ADB操作命令理解 App自动化测试入门:APP自动化稳定性测试详解 App自动化测试入门:Appium自动化的组件角色介绍 App自动化测试入门:Appium的自动化测试原理 App自动化测试入门:Appium的Inspector实战操作 App自动化测试入门:Desktop配置及底层逻辑 App自动化测试入门:运用Appium-Python-Client替代Desktop操作 App自动化测试入门:实战中的APP元素定位方式之Id定位 App自动化测试入门:实战中的APP元素定位方式之Name定位 App自动化测试入门:实战中的APP元素定位方式之ClassName定位 App自动化测试入门:实战中的APP元素定位方式之TagName定位 App自动化测试入门:实战中的APP元素定位方式之Xpath定位 App自动化测试入门:实战中非常规模式下的其他元素定位方式详解 App自动化测试入门:APP自动化中Activity组件原理 App自动化测试入门:实战中App自动化页面加载资源流程中的"坑" App自动化测试入门:实战中App自动化页面资源渲染需要注意的"雷区" App自动化测试入门:APP自动化测试中的三种常规等待类型 App自动化测试入门: 常规等待无法处理的bug解决方案--Activity等待与指令等待 App自动化测试进阶:App自动化-常规元素属性详解 App自动化测试进阶:App自动化-常规元素操作 App自动化测试进阶:App自动化非常规元素操作之触控操作详解 App自动化测试进阶:App自动化非常规元素操作之多指操作详解 App自动化测试进阶:App自动化非常规元素操作之新版本W3C操作 App自动化测试框架篇:实战中Pytest的用例标签详解 App自动化测试框架篇:Pytest-html测试报告生成 App自动化测试框架篇:实战中Pytest的用例参数化驱动测试用例 App自动化测试框架篇:实战中Pytest的conftest与钩子函数 App自动化测试框架篇:Pytest的yiled关键字原理解析 App自动化测试框架篇:Pytest-html报告添加截图操作 App自动化测试框架篇:Pytest-html获取用例结果流程 App自动化测试框架篇:Pytest-html报告源码解读与改造 App自动化测试框架篇:Pytest-html 自定义异常截图流程 App自动化测试框架篇:Pytest-html 实战中测试报告生成解析 App自动化测试框架篇: 企业级自定义框架封装思路详解 App自动化测试框架篇: 企业级数据驱动之数据的定义方式 App自动化测试框架篇: 自定义框架测试下的元素操作关键字封装详解 App自动化测试框架篇: 自定义框架测试下的系统函数关键字封装详解 App自动化测试框架篇: 自定义框架测试下的逻辑处理关键字封装详解 App自动化测试框架篇: 自定义框架测试下的逻辑处理关键字封装详解 App自动化测试框架篇: 自定义框架测试下的断言关键字封装详解 App自动化测试框架篇: 框架设计数据分离关键字之存储文件处理 App自动化测试框架篇: 框架设计数据分离之关键字热处理 APP自动化测试框架篇: 关键字驱动在企业中的落地方案 8.APP自动化测试拓展 App自动化测试拓展:企业级设备集群管理平台环境搭建介绍 App自动化测试拓展:企业级设备集群管理平台核心配置含义 App自动化测试拓展:Appium在多机器下的自动化操作流程 App自动化测试拓展:实战中APP测试框架结合ATXServer集群测试方案 App自动化测试拓展:H5在APP中的应用与问题介绍 App自动化测试拓展:实战中的混合应用APP问题常见处理方式 App自动化测试拓展:混合应用中的元素定位与操作流程 App自动化测试拓展:混合应用中的跳转及等待操作处理 App自动化测试拓展:公众号H5 webview混合应用测试实战 微信小程序自动化:Minium环境搭建、自动化流程梳理 微信小程序自动化:小程序自动化的核心思路与原理理解 微信小程序自动化:小程序中的元素定位、属性分析、元素操作 微信小程序自动化:小程序中的特殊操作-点击、长按、拖动 微信小程序自动化:minitest命令详解/测试报告分析 9.跨平台自动化测试RobotFramework & Airtest RobotFramework简介与环境搭建 RF语法之变量使用 RF基础语法之测试用例编写 RF之关键字与资源文件 RF之语法控制流与循环 RF-Web自动化项目实战 RF-接口自动化项目实战 RF-扩展库开发 RF-集成Jenkins之持续集成 Airtest环境搭建与IDE使用 Airtest-Web自动化项目实战 Airtest-APP自动化项目实战 Airtest之poco框架 Airtest-windows应用程序自动化测试 Airtest之脚本运行方式 10.DevOps 持续集成 GIT代码版本控制:版本控制概念/环境搭建 GIT代码版本控制:版本库创建 GIT代码版本控制:克隆、pull、push、commit命令使用 GIT代码版本控制:版本冲突解决/分支/tag控制 Jenkins持续集成:CICD介绍、环境搭建 Jenkins持续集成:Jenkins插件管理常用插件 Jenkins持续集成:命令执行机制/远程ssh执行 Jenkins持续集成:Allure测试报告集成/办公软件集成 Jenkins持续集成:自动化用例结合Jenkins应用 Jenkins持续集成:Jenkins定时任务/GIT集成 Jenkins持续集成:构建 CI/CD 流水线 开发-测试-运维 sonar代码白盒检测:代码检测概念,sonar环境搭建 sonar代码白盒检测:常见代码检测问题解析 sonar代码白盒检测:代码检测报告分析 sonar代码白盒检测:Jenkins与sonar组合持续集成 11.Jmeter性能测试 性能和功能的区别 性能指标:响应时间 程序运行过程中,对服务器资源占用率 吞吐量 和 并发量 的关系?/区别? 性能测试整体流程介绍 项目中性能测试的背景分析 性能需求分析-业务模型 性能测试用例的概念和示例 性能测试概念-负载测试 性能测试用例结构及项目实例 性能测试完成标准 性能测试环境 服务器配置 Jmeter环境构建 Jmeter多线程插件的使用 Jmeter压测汇总报告结果分析 Jmeter梯度压测线程组实际应用 Jmeter分布式集群压测概念 阿里云PTS云服务器压测方式 Jmeter压测使用CSV数据集 Jmeter 7大定时器分析 结果分析之Basic Graphs图表 InfluxDB + Grafana+Jmeter监控大屏 Jmeter 后端监听器连接InfluxDB Jmeter-InfluxDB-Grafana完整调试 nmon数据采集与结果分析 prometheus 服务器 配置 性能测试报告-测试实施情况编写 性能测试报告-资源使用率截图内容 如何找性能拐点及性能瓶颈定义 APP性能测试概念,目的与意义 性能测试流程和性能测试工具分析 APP性能指标(cpu、内存、流畅度等) APP性能测试工具选择,环境搭建实战 APP性能指标启动时间、CPU、流量详解获取方法 APP性能监控脚本实现;数据分析 APP性能指标之电量、内存、FPS APP性能指标之过度渲染及实战 Locust简介 Locust是什么? Locust发起HTTP接口请求 Locust的Web界面 locustfile之task_set属性 locustfile之weight (权重)属性 详解任务集合TaskSet类 动态URL参数使用 Locust“逐步负载”模式运行 Locust+Grafana 搭建性能监控平台 12.vue测试开发平台 阶段1. 前端HTML/CSS/JS项目开发实战 阶段2. VUE 前端框架项目开发实战 阶段3. Flask WEB后端开发框架项目实战 阶段4. Flask+Vue前后端分离系统项目实战 阶段5. 测试平台管理系统基础功能开发 阶段6:接口自动化测试平台设计阶段 阶段7:接口测试平台前端界面设计与开发 阶段8:接口测试平台后端设计与开发 阶段9:接口测试平台联调测试 阶段10:WEB自动化测试平台设计阶段 阶段11:WEB测试平台前端界面设计与开发 阶段12:WEB测试平台后端设计与开发 阶段13:WEB测试平台联调测试 阶段14:APP自动化测试平台设计阶段 阶段15:APP测试平台前端界面设计与开发 阶段16:APP测试平台后端设计与开发 阶段17:APP测试平台联调测试 阶段18:用例执行图形报表可视化数据监测 阶段19:CICD持续集成整合企业测试流程 阶段20:办公软件钉钉/飞书/企微等整合 阶段21:Xmind测试用例数据格式集成 阶段22:Swagger/Har动态接口数据集成 阶段23:测试平台分布式集群部署实战 13.django测试开发 WEB开发技术简介及Django开发环境搭建 Django开发web接口urls及views机制 Django数据库模型和视图 Django-admin环境搭建及应用 接口测试脚本自动化及脚本存在的问题 Pytest插件开发测试工具原理分析 如何将Python测试工具打包成可执行命令 自动化测试平台开发思路 通过Django_admin_vue模板快速开发出web界面 平台开发:项目创建及自定义管理平台数据展示内容 平台开发:实现复杂数据维护页面 平台设计:如何将测试数据转换为数据库存储 平台实现:接口测试平台效果演示及debug调试 WEB封装思维锻炼:web自动化中封装技术的应用 WEB封装思维锻炼:fixture及断言截图机制拓展封装 代码封装思维对于测试开发的重要性 WEB平台驱动封装:POM的作用以及它的问题 WEB平台驱动封装:UI自动化框架实现原理剖析 WEB平台:底层UI执行驱动工具开发 WEB平台:自动化平台项目实战及原理debug分析 APP_UI平台:APP自动化平台内容梳理及实战项目 APP_UI平台:封装思想及拓展思想分析 APP_UI平台:平台数据库设计思路分析 UI自动化测试平台封装思维整体梳理 自动化平台架构:集群分布式部署方案分析 自动化平台部署:Nginx集群部署实践 自动化平台部署:集群下登陆session共享方案 14.安全测试 安全测试两大项目靶场部署 WEB安全漏洞及渗透测试手法:反射性XXS漏洞 WEB安全漏洞及渗透测试手法:DOMXXS漏洞 WEB安全漏洞及渗透测试手法:SQL注入漏洞 WEB安全漏洞及渗透测试手法:文件下载漏洞 WEB安全漏洞及渗透测试手法:平行权限漏洞 WEB安全漏洞及渗透测试手法:路径遍历漏洞 WEB安全漏洞及渗透测试手法:URL跳转漏洞 WEB安全漏洞及渗透测试手法:短信_邮件_炸弹_暴力破解 漏洞扫描工具:ZAP简介及安装 漏洞扫描工具:ZAP纯自动扫描机制 漏洞扫描工具:ZAP被动扫描-浏览器 漏洞扫描工具:ZAP模糊测试 漏洞扫描工具:ZAP构建CSRF攻击表单 漏洞扫描工具:CSRF Token构建机制 漏洞扫描工具:安全测试报告及脚本机制 15.K8S云原生技术测试应用内容 容器技术与虚拟机区别 手把手教你搭建docker环境 Docker 容器使用 Docker 项目运行镜像制作 Docker容器部署运行测试环境 Kubernetes介绍 高可用Kubernetes集群部署 详解Pods、Service、Namespace等核心概念 核心组件:Master K8S测试环境搭建 Helm应用管理工具 Kubesphere产品介绍 K8S持续集成流程实现 K8S云原生 CI/CD 工具链 自动化测试技术与K8S融合 上面就是我为大家整理出来的一份软件测试工程师发展方向知识架构体系图。希望大家能照着这个体系,完成这样一个体系的构建。可以说,这个过程会很有挑战,但只要突破了瓶颈。以后的职业生涯就轻松很多。正所谓万事开难,只要迈出了第一步,你就已经成功了一半,古人说的好“不积跬步,无以至千里。”等到完成之后再回顾这一段路程的时候,你肯定会感慨良多。
面试题分享,看看你会多少 1自我介绍 2测试框架的搭建,选型?都调研过哪些框架?哪些框架符合你们的业务?其他框架有哪些优缺点?为什么选用这个框架?你的框架里面封装的哪些底层的方法? 3每条用例的前置条件怎么处理的?比如说某个接口在测的时候,会依赖其他的一些接口,那你这个场景化用例是怎么做的呢? 4试算、核保都需要一些前置条件,前置条件怎么在excel里面实现的?就是说你的接口参数? 5所有的测试用例,前置和后置是怎么做的? 6excel里面有哪些字段? 7自动化测试用例覆盖率是多少?你们是怎么评估的?整个自动化提升的效果是怎么样的? 8涉及到支付问题的话,你们会关注哪些点,整个支付的流程是什么样的?9在支付过程中,网络出问题了,或者有一些兼容性问题,调微信失败了怎么处理?有模拟失败的这种场景吗? 10.支付流程的测试用例异常设计有哪些点? 11怎么模拟微信那边没有扣钱? 12你对整个压测场景,包括整个容量评估,压力评估啊,你怎么去执行一些压测的一些计划? 13压测目标怎么来的? 14QPS和TPS的区别?15你的压测数据压测参数怎么实现的?在线上压还是测试环境压?16.压测数据会对你的压测性能会有哪些影响呢?为什么要做这个数据构造呢? 17.线程阻塞指什么?你是怎么发现出来线程阻塞的?你是怎么一步步分析出来的?排查了哪些问题?具体哪个地方有线程阻塞呢?(我说了线程dump ,定位到代码级别) 18数据库连接数是一个什么样的概念?面试官说现在都是连接池 19你在以前的工作中有除了自动化、性能,还有哪些亮点?就是说有什么除了你之外,其他人做不了的 20开发自测有哪些效益呢? 21他测不测你怎么衡量? 22冒烟测试不通过,打回之后,对开发本人有什么影响? 23你们公司这个流程规范是什么样的呢? 24你有什么要问我的?
面了几十个测试,都挂了 很多人说现在找工作很难,确实难,岗位机会非常少,可与之相对应的是大部分候选人根本不会面试。几年前是岗位多人少,你不用特别过硬的技能就能找到一份工作,还能有不错的涨幅,但是现在僧多粥少,如果你还用过去的标准要求自己,路只会越走越窄,我经常跟团队小伙伴说,现在很像学生时代,如果你按部就班,只要不太差,到点就拿毕业证,出去找工作。现在上班也是,循规蹈矩,做个小透明,到了一定时间也会毕业出去找工作。今年面了好几十人,都没发offer,岗位也不着急,盘一下我认为的共同问题。 1.自己写上简历的项目经验一知半解很多人在简历里都写上做过性能测试,做过自动化测试,可我刚一问,你看性能测试哪些指标,这其实是一个比较简单的问题,稍微准备下就行,但不少人立马气场就下来了,我们当时就是用工具测测,不深入。其实我很不明白,你自己简历上写这个,连最基础的答案都没准备,不是自己挖坑自己跳吗?先不谈专业水平,以你做事的逻辑和细致程度,我不敢用你啊。 2.简历过度包装,面试表现却严重不符简历可以适度美化,但不要过度包装。很多人为了展现自己的能力,简历里的感觉几乎是把所有的事情都描述一遍,尤其是管理者,团队的事情内化为自己的事情,但事实上,参与度很低,问一下哪些是自己做的,哪些是团队做的,他很难提炼出来,感觉就是在分配活,对于痛点问题的解决方案也难讲出鲜明的观点。 3.同质化严重,找不到亮点90%的简历都写的编写测试用例,测试评审,熟悉python,熟悉pytest,selenium,requests等,找不到差异点,要去寻找自己的亮点,我面试最后总会问,你觉得你有什么亮点我没有问到吗?一般来说问这个问题是前面都没找到亮点,二是怕一些候选人表达能力不够弱化了专业能力,如果最后这位候选人也没能有效的概括出自己的亮点,那基本验证了我的第一判断是没有问题的。很多大公司的侯选人最后面试下来总让我感觉低于预期,问到平台工具细节,都是之前已经搭建好的,我说那新公司没有,你如何做呢?基本上答不上来,其实这类候选人就是脱离了平台比较难生存,既没有0-1解决问题的能力,又会适应不了中小公司薄弱的基建。 4.只关注自己的岗位,对行业了解很肤浅上次面试一位同学,工作年限比较浅,本来不是意向人选,但在最后滔滔不绝讲ChatGPT在他实际工作中的应用,这位候选人让我感觉太对新事物的钻研态度以及兴奋之情,甚至我后面也被有所感染。这样的同学更加有创造的可能性,所以我最终给他发了offer。 5. 对未来没有规划,很多来面试的人对自己完全没有思考过,你说你喜欢做测试,问你怎么体现出喜欢,没有例子可以陈述。更像是现场表决心,在我这里,没啥用。 6. 简历海投,至少有了面试机会,你再去看看JD要求,有所侧重的准备,别感觉像过来碰运气一样。 7. 不仔细看需求,岗位要求,工作地点已经写明,但是依然重复沟通提问同样的问题。 8. 主动跟进,面试后,可以主动问问情况,我比较喜欢主动的同学,真诚永远是必杀技。看到这里有人说,要求真多。是的,今年找工作就很难,到年底更难。有工作的也尽可能多充电,尤其是心里没底的同学,不要赌运气现在手上还有工作,哪天掉下去了不一定爬的上来。
面了几十个测试,都挂了 很多人说现在找工作很难,确实难,岗位机会非常少,可与之相对应的是大部分候选人根本不会面试。几年前是岗位多人少,你不用特别过硬的技能就能找到一份工作,还能有不错的涨幅,但是现在僧多粥少,如果你还用过去的标准要求自己,路只会越走越窄,我经常跟团队小伙伴说,现在很像学生时代,如果你按部就班,只要不太差,到点就拿毕业证,出去找工作。现在上班也是,循规蹈矩,做个小透明,到了一定时间也会毕业出去找工作。今年面了好几十人,都没发offer,岗位也不着急,盘一下我认为的共同问题。 1.自己写上简历的项目经验一知半解很多人在简历里都写上做过性能测试,做过自动化测试,可我刚一问,你看性能测试哪些指标,这其实是一个比较简单的问题,稍微准备下就行,但不少人立马气场就下来了,我们当时就是用工具测测,不深入。其实我很不明白,你自己简历上写这个,连最基础的答案都没准备,不是自己挖坑自己跳吗?先不谈专业水平,以你做事的逻辑和细致程度,我不敢用你啊。 2.简历过度包装,面试表现却严重不符简历可以适度美化,但不要过度包装。很多人为了展现自己的能力,简历里的感觉几乎是把所有的事情都描述一遍,尤其是管理者,团队的事情内化为自己的事情,但事实上,参与度很低,问一下哪些是自己做的,哪些是团队做的,他很难提炼出来,感觉就是在分配活,对于痛点问题的解决方案也难讲出鲜明的观点。 3.同质化严重,找不到亮点90%的简历都写的编写测试用例,测试评审,熟悉python,熟悉pytest,selenium,requests等,找不到差异点,要去寻找自己的亮点,我面试最后总会问,你觉得你有什么亮点我没有问到吗?一般来说问这个问题是前面都没找到亮点,二是怕一些候选人表达能力不够弱化了专业能力,如果最后这位候选人也没能有效的概括出自己的亮点,那基本验证了我的第一判断是没有问题的。很多大公司的侯选人最后面试下来总让我感觉低于预期,问到平台工具细节,都是之前已经搭建好的,我说那新公司没有,你如何做呢?基本上答不上来,其实这类候选人就是脱离了平台比较难生存,既没有0-1解决问题的能力,又会适应不了中小公司薄弱的基建。 4.只关注自己的岗位,对行业了解很肤浅上次面试一位同学,工作年限比较浅,本来不是意向人选,但在最后滔滔不绝讲ChatGPT在他实际工作中的应用,这位候选人让我感觉太对新事物的钻研态度以及兴奋之情,甚至我后面也被有所感染。这样的同学更加有创造的可能性,所以我最终给他发了offer。 5. 对未来没有规划,很多来面试的人对自己完全没有思考过,你说你喜欢做测试,问你怎么体现出喜欢,没有例子可以陈述。更像是现场表决心,在我这里,没啥用。 6. 简历海投,至少有了面试机会,你再去看看JD要求,有所侧重的准备,别感觉像过来碰运气一样。 7. 不仔细看需求,岗位要求,工作地点已经写明,但是依然重复沟通提问同样的问题。 8. 主动跟进,面试后,可以主动问问情况,我比较喜欢主动的同学,真诚永远是必杀技。看到这里有人说,要求真多。是的,今年找工作就很难,到年底更难。有工作的也尽可能多充电,尤其是心里没底的同学,不要赌运气现在手上还有工作,哪天掉下去了不一定爬的上来。
Python函数的进阶(匿名函数、递归) 一、函数是一个对象,函数可以被修改名字、可以传递、可以被删除。直接通过下面的代码看效果进行理解: def sayhi(): print("hello world") test = sayhiprint(test)print(sayhi)test()sayhi() del testsayhi()test() 二、函数的返回值可以是函数 def func(*args, **kwargs): def add(a, b): return a + b return add new_func = func()print(new_func(1, 2)) 三、匿名函数 在Python中,匿名函数可以通过lambda关键字定义,其语法格式为: lambda arguments: expression匿名函数可以有多个参数,通过冒号后面的表达式来定义函数体。与普通函数不同的是,匿名函数没有函数名,并且只能包含单个表达式。以下是几个使用匿名函数的实例,以展示其简洁、灵活和实用之处。1、使用匿名函数对列表进行排序: my_list = [5, 2, 8, 1, 9]sorted_list = sorted(my_list, key=lambda x: x)print(sorted_list) # 输出:[1, 2, 5, 8, 9] 2、使用匿名函数进行简单的数学计算: add = lambda x, y: x + yresult = add(3, 5)print(result) # 输出:8 3、使用匿名函数进行元素筛选: my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]filtered_list = list(filter(lambda x: x % 2 == 0, my_list))print(filtered_list) # 输出: [2, 4, 6, 8, 10] 四、函数递归调用 递归是一种算法或函数自我调用的过程,它在解决问题时能够简洁、优雅地表达思想。通过递归调用,函数可以重复执行相同的操作,但在每次调用中处理的数据规模会逐渐减小,直到达到某个基本条件而停止。案例演示: 1、计算阶乘 阶乘是指将一个非负整数 n 乘以所有小于等于它的正整数的乘积。 例如,5的阶乘(表示为5!)等于5 * 4 * 3 * 2 * 1,结果为120。 def factorial(n): if n == 0: return 1 else: return n * factorial(n-1) 2、计算斐波那契数列斐波那契数列是一个由 0 和 1 开始,后续每一项都是前两项之和的数列。例如,斐波那契数列的前几项为 0、1、1、2、3、5、8、13 等。 def fibonacci(n): if n <= 1: return n else: return fibonacci(n-1) + fibonacci(n-2)
Python中的type与isinstance的区别 Python中的type()函数和isinstance()函数是两个常用的类型判断函数,它们可以用来判断变量的类型,接下来让我们一起来看一下它们的用法。 type()函数 type()函数用于获取一个变量的类型,它的语法是:type(变量)。 调之后会返回变变量的类型,下面是一个简单的例子: 1、获取变量的类型 a = 123b = "123"c = (123,) print(type(a)) # 输出<class 'int'>print(type(b)) # 输出<class 'str'>print(type(c)) # 输出<class 'tuple'>print(type(None)) # 输出<class 'NoneType'> 2、获取函数、类、模块等的类型 import time def test(): print(time.time()) test()print(type(test)) # 输出 <class 'function'>print(type(object)) # 输出<class 'type'>print(type(time)) # 输出<class 'module'> 3、使用type函数动态创建类 type()函数接收三个参数: 类名(字符串) 父类(元组) 类属性和方法(字典) 使用案例: # 定义一个函数作为类方法def say_hi(self): print(f"大家好,我的公众号是: {self.name},欢迎大家关注哟~") MyClass = type('MyClass', (object,), {"name": "小博测试成长之路", "age": 18, "say": say_hi}) MyClass().say() 关于使用type来动态创建类的话,之前我也没接触过这种用法,等后面有时间接触的多了之后,还会再去回过头仔细地了解一下具体的用法和使用场景,这次先简单介绍一下。 isinstance()函数 isinstance()函数一般用来检查一个对象是否是另一个对象的实例。isinstance()函数会考虑继承关系,如果一个对象是指定类或其子类的实例,isinstance()函数都会返回True。同时,可以使用isinstance进行多种类型的判断,只需要将要判断的类型以元组的形式传递给isinstance()函数即可。
Python中的dataclass:简化数据类的创建 Python中的dataclass是一个装饰器,用于自动添加一些常见的方法,如构造函数、__repr__、__eq__等。它简化了创建数据类的过程,减少了样板代码,提高了代码的可读性和可维护性。有点类似java里面的Java Bean。 让我们看一个简单的例子来说明dataclass的用法: from dataclasses import dataclass @dataclassclass User: name: str age: int p1 = User("小博", 18)p2 = User("小博", 18)p3 = User("小明", 19) print(p1) # Output: User(name='小博', age=18)print(p1.__repr__()) # Output: User(name='小博', age=18)print(p1 == p2) # Output: Trueprint(p1.__eq__(p2)) # Output: Trueprint(p1 == p3) # Output: False 在上面的例子中,我们定义了一个名为User的数据类,它有两个成员变量:name和age。在这个简单的例子中,dataclass自动为我们创建了以下方法: __init__: 自动添加了带有name和age参数的构造函数,我们可以用User("小博", 18)的形式创建对象。 __repr__: 自动添加了一个友好的表示对象的字符串方法,我们可以通过print()函数查看对象的内容。 __eq__: 自动添加了对象之间的相等比较方法,我们可以使用==来比较两个对象是否相等。 接下来让我们看一下dataclass的对象之间怎么比较 from dataclasses import dataclass, field @dataclass(order=True)class Person: name: str age: int = field(compare=False) # 指定某个字段不参与排序 height: float # 创建实例person1 = Person("Alice", 30, 185.5)person2 = Person("Bob", 25, 170.0)person3 = Person("Charlie", 35, 175.2)person4 = Person("Alice", 35, 175.2)person5 = Person("Bob", 25, 185.2) # 使用比较运算符进行排序people = [person1, person2, person3, person4, person5]people_sorted = sorted(people) # 默认升序people_sorted = sorted(people, reverse=True) for person in people_sorted: print(person.name, person.age, person.height) 输出结果:Charlie 35 175.2Bob 25 185.2Bob 25 170.0Alice 30 185.5Alice 35 175.2 要让类的实例对象之间进行比较,需要在定义类的时候,加上@dataclass(order = True)。默认将生成__gt__、__ge__、__lt__、__le__方法。如果传入False,则省略它们。默认会按照类中定义的字段顺序进行对比,第一个字段的值相等的时候,就用第二个字段进行比较。要忽略某个字段不进行对比的话,可以使用field(compare=False) End
Python操作文件:从入门到“悟” 一、打开文件 Python里面打开文件可以使用内置的open函数。 open函数的定义如下: def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True): # known special case of open 常用参数介绍: file:指定要打开的文件名 打开模式(mode):打开模式可以是一个字符串,用于指定读取、写入或追加等操作。常见的打开模式包括 "r"(读取模式)、"w"(写入模式)、"a"(追加模式) 编码(encoding,可选):用于指定文件的字符编码,仅在文本模式下使用,比如utf-8,gbk等 其他的参数我暂时没怎么用过,先不进行过多介绍,以免文档写错了,对大家造成困扰。 下面来重点看下mode介绍,先看函数官方定义的文档中是怎么描述的: ========= =============================================================== Character Meaning --------- --------------------------------------------------------------- 'r' open for reading (default) 'w' open for writing, truncating the file first 'x' create a new file and open it for writing 'a' open for writing, appending to the end of the file if it exists 'b' binary mode 't' text mode (default) '+' open a disk file for updating (reading and writing) ========= =============================================================== 英文看不懂的话 ,我再来写一下自己的理解: ========= =============================================================== Character Meaning --------- --------------------------------------------------------------- 'r' 读取模式,也是默认的选项 'w' 写入模式,首先清空文件再写入 'x' 创建新文件并打开进行写入,如果文件已存在时会报错:FileExistsError: [Errno 17] File exists 'a' 追加模式,如果文件存在则在文件末尾追加 'b' 二进制模式 't' 文本模式 (default) '+' 表示以更新模式打开文件。这种模式允许对文件进行读取和写入操作,即同时支持读取和写入 ========= =============================================================== rwabt这几个字母怎么去记忆呢?可以根据对应的英文单词喔,分别是read、write、append、byte、text。 二、使用with语句操作文件 在Python中,打开文件后最好使用with语句来读取文件。with语句在结束时会自动关闭文件,无需显式调用close()方法。with语句提供了一种方便的方式来确保在文件使用完毕后自动关闭,以避免资源泄漏和错误。当with块结束时,文件将自动关闭,即使在处理文件期间发生异常或错误,也会正确地关闭文件。 with open('myfile.txt', 'r',encoding="utf-8") as file: content = file.read() # 在这里可以对文件内容进行处理 print(content)# 文件会在with语句结束后自动关闭,无需手动调用file.close() 逐行读取文件: with open('myfile.txt', 'r',encoding="utf-8" ) as file: for line in file: # 对每一行进行处理 print(line) 按行写入文件: lines = ['Line 1', 'Line 2', 'Line 3']with open('myfile.txt', 'w') as file: for line in lines: file.write(line + '\n')
python中f-string介绍 最近在看python基础的时候,又发现一个之前没怎么掌握的字符串格式化的小技巧,f-string f-string 格式化 f-string是Python3.6引入的一种字符串格式化方式,它提供了一种简洁、直观的方式来将变量值嵌入到字符串中。在 f-string 中,可以在字符串前加上 f 或 F,然后用 {} 括起变量或表达式来进行字符串插值。 下面直接演示几种用法: 案例一:变量替换 name = "小博"age = 31print(f"My name is {name} and I am {age} years old.")输出:My name is 小博 and I am 31 years old. 案例二:表达式的替换 x = 1y = 2print(f"{x} + {y} = {x + y}")输出:1 + 2 = 3 案例三:使用格式化控制符控制精度等格式 π = 3.14159265print(f"π 的值是 {π:.2f}.")输出:π 的值是 3.14. 案例四:使用变量的属性 class Student: def __init__(self, name, age): self.name = name self.age = age stu = Student("张三", 21)print(F"{stu.name} is {stu.age} years old.") 案例五:结合if语句一起使用 salary = 10print(f"你的收入{'超过了18k' if salary >= 18 else '没有超过18k'}.")输出:你的收入没有超过18k. 案例六:Python 3.8中引入的一种称为"Debug f-strings"的新特性 a = 1b = 2print(f"{a=},{b=}")输出 a=1,b=2 要特别注意哈,案例六的用法,在python3.8以上的版本才支持哈,3.7的版本这么写是会报错的哟 说明: {a=}和{b=}会将变量a和b的名称和值作为字符串插入到输出中,方便在调试过程中查看变量的值。这个特性可以让你更快地了解代码中的变量值,而不用手动打印或者调试。需要注意的是,这个特性只在Python 3.8及以上版本中可用。如果你使用的是Python 3.7或更早的版本,你可以使用类似print(f"a={a}, b={b}")的方式来达到同样的效果。
ValueError: check_hostname requires server_hostname 最近在新公司电脑上搭建python环境的时候,现在python更新到3.9版本了,然后下载下来之后,配好环境变量,然后安装requests插件,然后写一个简单的代码发送请求,结果发现居然报错了: import requestsres = requests.get(url="http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fblog.csdn.net%2Fliboshi123%2F&urlrefer=65e6aecdf2baa14da9809893550fa731", verify=False) 运行上面的代码的时候,发现报了下面的错误: raise ValueError("check_hostname requires server_hostname")ValueError: check_hostname requires server_hostname 报错的原因: 这个其实跟选用的python版本的关系不大,主要原因是因为每次使用 pip install 命令下载插件的时候,下载的都是最新的版本,比如下载requests插件,它会自动的将依赖的urllib3这个插件也安装,然后依赖的插件版本太高,就导致了这个报错的问题。 所以说,一般遇到这种莫名其妙的问题的时候,可以先去看一下是不是插件的问题导致的,解决措施就是 将urllib3插件的版本降低就可以,当然,直接在安装requests插件的时候,选择用低版本也可以解决这个问题。比如用下面的命令指定版本进行安装: pip install requests==2.20或者使用下面的命令降低版本:pip install urllib3==1.25.8 这种类似的问题,在使用一些框架的时候经常会遇到,比如有的小伙伴在学习django,然后照着别人博客写的文章操作,最后报错,很有可能就是插件的版本导致的。 另外,在线安装插件时,如果插件下载过慢,或者报错的话,可以在插件的命令后面加上 -i 指定插件安装的源。 pip install 插件名称 -i http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.aliyun.com%2Fpypi%2Fsimple&urlrefer=5fa2d0fd225255ffa2499faf52f73c13 有时候报插件找不到的话,就换一个源试试。 不想每次都指定源进行安装的话 ,那就在用户名下文件夹下建一个pip的文件夹,然后新建pip.ini的配置文件,写入下面的内容就行(具体的源可以自己选择):{创建这个配置文件的存放位置有很多种方式都可以,感兴趣的可以自己去试试,比如pip所在目录下,或者%APPDATA%目录下去新建文件夹。} [global]index-url = http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmirrors.aliyun.com%2Fpypi%2Fsimple&urlrefer=5fa2d0fd225255ffa2499faf52f73c13[install]trusted-host=mirrors.aliyun.com 另外,有些插件通过上面的在线方式就是容易出现报错的,可以尝试用离线安装的方式去安装插件,去网上下载whl格式的文件进行安装,比如,可以在下面的链接下下载: whl格式插件: http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.lfd.uci.edu%2F~gohlke%2Fpythonlibs%2F%23lxml&urlrefer=6d4f4817fecf412567be28ca2d234027 pip install xxx.whl 官网下载插件: http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fpypi.org%2F&urlrefer=88f17df972da4059255dc64a7451159d 解压后,在目录执行:python setup.py install
Python3.10版本的新特性介绍 Python近几年来越来越火了,而且版本也一直在不停的更新迭代中。Python在2021/10/04发布了3.10的正式版,虽然你可能还没有升级,不过也可以先大概了解一下在新的版本中做了哪些改动哟。 官方的升级介绍(相比3.9版本): http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fdocs.python.org%2F3%2Fwhatsnew%2F3.10.html&urlrefer=7bcb21893134c86c151f40b25ec11ba0 1、错误提示变得更加友好 以前写脚本的时候,如果写了一行脚本,少写了一个括号啥的,错误提示不够直观,找错误还得找半天。 下面看下python3.9版本中的错误提示: a = (1,2,3同样的脚本,再看下python3.10版本下的提示:what?是的,你没有看错,python会告诉你括号没有成对出现。 那是不是所有的错误,都能够提醒的这么智能呢?当时不是,有可能是现在新版本才刚出来,对比比较复杂的写法支持的还不够好,下面这个例子提示的就不够直观:同样是少了一个括号,看来能识别的场景有限呀,期待后面能变得更加强大。 2、加入了match case的用法 match ... case 语法类似于其它语言中的 switch ... case 语法,在多条件判断时比用 if ... elif 代码更简洁。 下面看下match case的用法: def http_error(status): match status: case 400: return 'Bad Requests' case 404: return 'Not Found' case _: return 'other error' print(http_error(400))print(http_error(404))print(http_error(500)) 输出结果: Bad Requests Not Found other error case _ 类似于其它语言中的 default ,当其他条件都不符合就执行这行。 也可以在case语句后面使用 | 去进行连接: case 401 | 403 | 404: return "Not allowed"在以后封装测试脚本的时候,也可以用上这个功能喔: def send_requests_method(method): match method: case 'GET': return send_get_requests() case 'POST': return send_post_requests() case 'PUT': return send_put_requests() case _: pass3、新的类型联合操作符 在以前的版本中,要针对一个函数的入参做多种类型支持的话,要用到Union: from typing import Uniondef square(number: Union[int, float]) -> Union[int, float]: return number ** 2 现在有个新的语法糖“|”,叫联合操作符,可以让代码更简洁 def square(number: int | float) -> int | float: return number ** 2该操作符在函数 isinstance()和 issubclass() 也可以支持 print( isinstance(1, int | str))print(issubclass(int, int | str)) 4、支持带括号的上下文管理器比如之前读取文件的操作是这样的: with open('file1', 'r') as f1, open('file2', 'r') as f2: print(f.read())在3.10版本中,可以用括号将多个上下文放在一起: with ( open('run.py', 'r') as f1, open('run.py', 'r') as f2): pass但是目前这种写法在pycharm中可以会有标红的错误提示,但不影响实际运行。
1 下一页