1
测试理论or常考八股 抓包的原理 原理就是把fiddler设置为代理服务器,那么浏览器上发出所有请求都由fiddler这个工具来代理转发,或者说:通过fiddler来拦截客服端和服务端的数据交互,这样我们可以拦截到客户端给服务端发了什么数据,服务端给客户端响应了什么数据,然后对数据进行分析   自动化测试的优势是什么?   自动化测试支持对应用程序进行功能和性能测试。   它支持重复测试用例的执行。   它有助于并行执行。   它有助于测试大型测试矩阵   由于没有人为错误的机会,因此可以提高准确性。   节省时间和金钱。  请说出XHTML和HTML的区别      文档顶部doctype声明不同,xhtml的doctype顶部声明中明确规定了xhtml DTD的写法       xhtml元素必须正确嵌套,不能混乱       属性必须是小写的       属性值必须加引号       标签必须有结束,单标签也应该用“/”来结束掉   很多网站不常用table iframe这两个元素,知道原因吗  因为浏览器页面渲染的时候是从上至下的,而table和iframe这两种元素会改变这样的渲染规则,他们是要等待自己元素内的内容加载完才整体渲染。用户体验会很不友好。   cookies和session的区别?   cookies:是针对每一个网站的信息,每一个网站只对应一个,其他网站不能访问,这个文件是保存在客户端的,每次你打开相应网站,浏览器会查找这个网站的cookies,如果有就会将这个文件一起发送过去。cookies文件的内容大致包含这些信息如用户名,密码,设置等。cookie 的解决方案不需要在服务器存储客户端的数据,占用资源较小,可拓展性较高;请求携带的cookie 携带着用户信息,相对来说,没那么安全 ;从数据量上来看,cookie 一般都比 sessionId 大,传输过程中占用较大资源。   session:是针对每一个用户的,只有客户机访问,程序就会为这个客户新增一个session。session里主要保存的是用户的登录信息,操作信息等。这个session在用户访问结束后会被自动消失(如果超时也会)。session 解决方案需要在服务端存储客户端的数据,分布式服务器需要设置单独且唯一的数据中心,占用资源较大。但是客户端携带的 sessionId 不包含的用户信息,较为安全。   什么是IP地址?   IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。          请简述三次握手阶段。   ① 首先客户端向服务器发送一个 SYN 包,并等待服务器确认 ② 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一段 TCP 报文 ③ 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从而结束 SYN-SENT 阶段。并返回最后一段报文。     如果第二次握手的时候每次握手信息对方没有收到会如何?   若第二次握手客户端未接收到服务器回应的 ACK 报文时,客户端会采取第一次握手失败时的动作,这里不再重复,而服务器端此时将阻塞在 accept() 系统调用处等待 client 再次发送 ACK 报文。     三次握手的目的是什么?两次握手可以吗?   三次握手的主要目的是确认自己和对方的发送和接收都是正常的,从而保证了双方能够进行可靠通信。若采用两次握手,当第二次握手后就建立连接的话,此时客户端知道服务器能够正常接收到自己发送的数据,而服务器并不知道客户端是否能够收到自己发送的数据。若只有两次握手,会造成服务器开销的浪费。             什么是DNS?           DNS是域名系统(Domain Name System),DNS是用来做域名解析的,它会在你上网输入地址后,把它转换成IP,然后去访问对方服务器;没有它,你想上百度就要记住百度的IP,但有了DNS的处理,你只需要记住对应网站的域名,即网址就可以了       DNS的工作原理        假设一个客户端 A,想要查询 a.leetcode.cn 的 ip 地址,考虑缓存的情况。            客户端 A 首先查询本地的 hosts 文件,查询是否有网址映射关系,如果没有,进行下一步查找。             查找本地的 dns 解析器缓存,如果没有进行下一步。             根据 tcp/ip 参数查找设置好的首选 dns 服务器 ip 地址,一般叫做本地 dns 服务器,查询本地 dns 服务器。本地 dns 服务器如果没有,它就会进行下一步操作。             本地dns会访问根服务器 ,然后根据后缀名,从根服务器中查找对应的顶级域名服务器的 ip ,然后以此向下查找域名服务器的 ip ,然后查找网址映射关系,直到找到为止。              客户端 A 向本地域名服务器查询为递归查询,本地域名服务器向根域名服务器查询为迭代查询。           DNS 数据传输采用 tcp 协议还是 udp 协议 ,或者是其他的什么协议 ?    dns 既采用 udp 协议也采用 tcp 协议:            dns 是通过 53 端口进行通信,默认是采用 udp 协议进行数据传输的,除了个别情况,也就是说绝大多数情况是采用 udp 进行传输。             使用 tcp 传输的情况:                   当返回的响应超过的 512 字节( udp 最大只支持 512 字节的数据)。             区域传送:主域名服务器向辅助域名服务器传送变化的那部分数据。                  注意: tcp 协议和 udp 协议是可以同时绑定同一个端口的。          区域传输: dns 服务器中数据不总是一成不变的,域名数量是不断增加,而且一些域名对应着的服务器的也是在变化的,所以其实 dns 服务器中的数据是不断增加的,并且随时流动的,所以可以将区域传输简单理解为 dns 服务器之间进行的数据传输。              get 和 post 的差别                get 提交的数据会放在 url 之后,post 提交的数据放在 body 上。                   1.get请求参数会以 url 的形式完整的保留在浏览器的记录里,会存在安全问题。而 post 数据放在请求主体中,且数据不会被浏览器记录,相比 get 方法,post 方法更安全,主要用于修改服务器上的资源。           注意:http有安全方法的概念,即不改变服务器状态。 get 方法不会改变服务器状态,而 post 会改变服务器的状态,从这个角度来看,get方法更安全。          总结:get 方法对于服务器更安全,post 方法对于客户端更安全.                      2.post 可以进行复杂的加密,get 则不可以            3.get 只支持 ASCII 字符格式的参数,而 post 方法没有限制。            4.get 提交的数据大小有限制(这里所说的限制是针对浏览器而言的),而 post 方法提交的数据理论上没限制            get 方法具有幂等性,post 方法不具有。              幂等性,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。                post方法有时会发送两个 tcp 数据包,与浏览器有关                   1.使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data。但并不是所有浏览器会这么做,例如火狐就不会。            2.而 GET 方法 Header 和 Data 会一起发送       XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。           http状态码                      比较常见的状态码(面试只需要了解以下状态码即可)            200:成功返回响应             301:永久重定向,客户端第一次访问此 url 时,告知客户端以后直接访问新的 url,该状态保存在浏览器缓存中。             302;临时重定向,客户端每次访问此 url 时,告知客户端重定向到新的 url ,后续访问依然访问当前的 url。             400:发送的请求错误,请求格式错误,或者没有服务器要求的数据。             401:没有权限访问,当前用户没有权限访问此资源。             403: 请求被服务器禁止。             404:请求的 url 不存在,一般是 url 出错。             500: 服务器处理请求出现错误。             501:服务器超出能力之外的方法,例如:请求的方法服务器不支持。             504:来自网关或者代理服务器,请求资源服务器时超时。              http状态码目录:https://developer.mozilla.org/en-US/docs/Web/HTTP/Status        与请求方法一样,http 状态码也是为了方便开发的一种标准,大部分的服务器在大范围上都是遵循该标准的。但是不能保证所有服务器严格遵循此标准,毕竟状态码只是服务器返回数据中的一部分,一些自定义的服务器可能对于所有的 5XX 类型错误都返回 500 状态码。       自动化测试处理验证码?                 产品上线前我们找开发将验证码注释掉              让开发预留一个万能验证码,比如8888这种,当然这种只能在测试环境去做,在生产环境要将它删掉              有的系统可以勾选保存用户名和密码,我们可以通过cookie跳过登录,使用抓包工具就能处理              使用验证码识别技术,OCR识别,比如java下面有一个Tess4j库,python下面有一个ddddocr库,成功率比较低,不推荐               MySQL数据库        什么是索引?        索引是一种特殊的文件(InnoDB数据表上的索引是表空间一个组成部分),他们包含着对数据表里所有记录的引用指针。       索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。       更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容简历索引形成目录。索引是一个文件,它是要占据物理空间的。                                                                           实战项目手撕 给你一个网站怎么开展测试?  1.首先,查找需求说明、网站设计等相关文档,分析测试需求。 2.制定测试计划,确定测试范围和测试策略,一般包括以下几个部分:功能性测试,界面测试,性能测试,数据库测试,安全性测试,兼容性测试。 3.设计测试样例:          功能性测试可以包括:链接测试;链接是否正确跳转,是否存在空页面和无效页面,是否有不正确的出错信息返回等;提交功能的测试,多媒体元素是否可以正确加载和显示;多语言支持是否能够正确显示选择的语言等。           界面测试:页面是否风格统一,美观。页面布局是否合理,重点内容和热点内容是否突出。控件是否正常使用。是否提供自动下载并安装的功能,文字检查。           性能测试:压力测试,负载测试,强度测试           数据库测试要具体决定是否需要开展。数据库一般需要考虑连结性,对数据的存取操作,数据内容的验证等方面。           安全性测试:基本的登录功能的检查;是否存在溢出错误,导致系统崩溃或者权限泄露;相关开发语言常见的安全性问题检查,例如SQL注入等;如果需要高级的安全性测试,确定获得专业安全公司的帮助,外包测试,或者获取支持。           兼容性测试,根据需求说明的内容,确定支持的平台组合:浏览器的兼容性;操作系统的兼容性;软件平台的兼容性;数据库的兼容性。     4.开展测试,并记录缺陷。合理的安排调整测试进度,提高获取测试所需的资源,建立管理体系(例如,需求变更、风险、配置、测试文档、缺陷报告、人力资源等内容)。 5.定期评审,对测试进行评估和总结,调整测试的内容。         为什么有时候我们需要手工编写脚本来测试网站的登录功能?               网站的变化 登录页面可能会变。比如,开发者可能会加入一个新的验证码功能或者改变登录按钮的位置。如果只用Selenium IDE录制的功能,那么每次页面有变动,你都需要重新录制脚本。但是,如果你手工编写脚本,你可以更容易地调整脚本以适应这些变化。                   处理特殊情况 有时候,登录功能可能不仅仅是输入用户名和密码那么简单。可能还有“忘记密码”、“注册新账户”等链接,或者有些用户可能会被要求完成额外的验证步骤,比如输入手机收到的验证码。Selenium IDE可能不容易处理这些特殊情况,但手工编写的脚本可以更灵活地处理。                   错误检查 当测试登录功能时,很重要的一点是检查是否有错误发生。比如,如果你输入了错误的用户名或密码,网站通常会显示一个错误消息。Selenium IDE可能会记录这些错误,但手工编写的脚本可以提供更详细的错误信息,帮助你更快地找到问题所在。                   使用不同的数据进行测试 为了充分测试登录功能,你可能需要使用多组不同的用户名和密码进行测试。如果你用手工编写脚本,你可以很容易地设置这些测试数据,然后让脚本自动使用不同的数据进行测试。这叫做参数化测试,是自动化测试的一个重要部分。                   与其他测试或工具结合 最后,手工编写的脚本更容易与其他测试或工具结合使用。比如,你可能想在登录后自动检查用户的个人资料页面是否正确显示。或者,你可能想使用某个特定的测试框架或报告工具来管理和跟踪你的测试。手工编写的脚本可以提供更大的灵活性来实现这些集成。              总的来说,虽然Selenium IDE是一个很好的起点,特别是对于那些不熟悉编程的人来说,但当测试需求变得更加复杂时,手工编写脚本通常可以提供更大的灵活性和控制能力。     界面搜索框测试用例 答:可以从功能测试、界面测试、安全性测试、兼容性测试、性能测试、易用性测试等角度进行回答。如:功能测试      搜索内容为空如何处理       在允许的字符串长度内外如何处理       合法的字符串长度后,加空格验证结果       验证每种合法的输入,结果是否正确       是否支持检索内容的复制、粘贴、编辑等操作       是否支持回车键搜索       多次输入相同的内容,查看系统的检索结果是否一致       搜索的历史纪录是否显示在下面       点击搜索,显示搜索界面    界面测试      查看 UI 是否显示正确,布局是否合理       是否有错别字       搜索结果显示的布局是否美观   安全性测试      脚本的禁用       SQL 的注入,检索 SQL SELECT 语句等       敏感内容的检索是禁止的   兼容性测试      多平台 Windows,macOS       移动平台 Android,iOS       多浏览器 火狐、Chrome、IE 等       分辨率,操作系统版本兼容等等   性能测试      搜索页面的链接打开速度的时间       搜索出结果消耗时间       弱网时搜索的响应时间       不同网速下搜索时的响应时间 3G,4G,WiFi   易用性      有联想功能       搜索内容与搜索结果的匹配程度       支持拍照搜索,语音搜索     Python相关岗位必备   Python中列表和元组的区别:      列表可以修改,元组不可以修改,列表相当于一个动态数组,而元组是一个静态数组。       从设计上说,列表是用来保存多个相互独立对象的数据集合,而元组设计的初衷就是为了描述一个不会改变的事物的多个属性。       然后列表的声明用中括号,元组的声明用小括号,并且元组只有一个元素到时候需要后面加逗号。     大厂面试中,非常经典的数字交换题目:如何在不引入第三个中间变量的情况下,完成两个数字的交换:   常规方法: a = a + b;b = a - b;a = a - b;不过这种方法有可能会导致数组越界   更好的方法是采用位运算完成数字交换: a = a ^ b;b = b ^ a;a = a ^ b;     HR面半步offer时刻    你觉得你个性上最大的优点是什么?  沉着冷静、条理清晰、立场坚定、顽强向上,乐于助人和关心他人,适应能力和幽默感,乐观和友爱。 你最大的缺点是什么 1.作为社团的领导者,我有一个很明显的缺点——深厚的同情心。尽管有的时候它经常被当做优点,但在社团管理的层面上,这就是一个不小的缺点,因为有效的管理往往需要坚定的决策和实施。由于我倾向于更温和、更理解他人的方式,这使得我们的团队在执行纪律,例如准时参加社团会议方面,存在些许不足。当然这种风格其实也有一定的好处,它确实鼓励了团队成员与我进行开放、真诚的交流,这对于增强团队凝聚力还是起到了一定的作用。当然,未来如果我还能成为一个团队的核心的话,我会寻求在亲和与决断之间的平衡,以更好地服务整个团队。 2.不擅长公众演讲,之前在实习的时候,开周会需要评审的时候,我总容易紧张哆嗦,怕自己出错,但后来发现工作很多年的同事也会出错,其实没关系,解决问题才是最重要的,所以我慢慢的克服了紧张, 细节反问      根据您对我的简历,还有今天面试的总体了解,如果我可以顺利拿到offer,并且顺利入职的话,您觉得我还有什么可以改进的空间或者是还需要具备什么能力,来和这个岗位达到一个更好的匹配。       尽管JD已经对这个岗位的职责有了一个简单的介绍,我还是想明确一下这个岗位的核心工作,团队的工作氛围,以及团队之间是如何分工协作的。       您是职场前辈,我是小白,请问您有什么职场建议可以传授给我吗?       贵公司对新入公司的实习生有没有什么培养项目,我可以参加吗?   你为什么选择软件测试,最大的兴趣是什么?      行业前景比较好,而且近些年越来越多企业更注重测试。       测试时间越久,面临的困难和挑战也越多,解决问题的同时,也提高了自身的能力。       自己的性格比较外向开朗,很容易跟产品和开发沟通,做起事情可以事半功倍。   你提交的bug,开发不认可怎么办?      首先我会再看需求文档,是不是我的理解有误,如果是我对需求理解错的话我就会去关闭bug。       如果是bug再去听听其他测试人员的意见,然后自己会再三的进行复测,并且保存好相关的截图和日志,确定这是一个bug之后我就去跟开发说明白,并且给他看bug重现的截图以及日志,如果开发还是不认可的话我就跟产品或项目经理说明情况,然后等待上级的指示。   你为什么选择这个城市作为你的工作地   在选择成都作为工作地点时,我认为首先我非常向往成都的独特的历史文化底蕴,可以让人在忙碌的工作之余能够沉浸在悠久的历史氛围中。成都这种所独有的悠闲、舒适的生活氛围,以及深厚的历史文化底蕴,对我来说具有无法抗拒的吸引力。   其次因为我本身老家是新疆乌鲁木齐的,从小喜欢吃辣,成都的一些美食像麻辣火锅、串串香等都非常适合我的口味。   与成都相比,北京和上海的生活节奏明显更快,竞争压力也更大。虽然这两个城市提供了更多的职业发展机会和国际化的生活环境,但对我来说,可能缺乏一些生活上的悠闲和舒适。因此,在权衡职业发展与生活品质之后,我选择了成都作为我的工作地点。   我相信在这座充满魅力的城市中,我能够找到属于自己的职业发展空间,同时享受到高品质的生活。《春熙路、太古里、熊猫基地》   你的实习测试心得?  我觉得做测试态度比能力更重要,做好一个测试,最主要是性格,信心,耐心,细心还需要良好的沟通能力。不断学习的能力,产品质量,测试流程这块很关键,好的计划加好的执行才能成就好的产品。 你为什么选择腾讯? 腾讯是目前世界最大互联网公司之一,汇聚了业内最卓越的人才团队,拥有雄厚的技术积淀,也推出了许多受市场青睐的家喻户晓的产品。这个对于像我这样初入职场的人来说,腾讯这样的大的平台都是“无法拒绝”的吸引力。 另外腾讯的福利也是业内所领先的,这为员工提供了一个安稳的后盾,让员工可以无所顾虑地将精力集中在工作上面。 最后我觉得我个人方面,从小使用tx系软件,所以对tx有很深的情感羁绊,这也是我选择来到腾讯的理由。 你的职业规划?  首先,我的短期目标是在测试开发领域不断学习和深化技能。我希望在接下来的实习期间,能够全面了解和掌握测试的基本流程和工具的使用,积累实际项目经验,并努力提升自己的工作效率和质量。 中期来看,我计划在完成实习后,留在贵公司或寻找其他的互联网公司,担任正式的测试开发工程师职位。在这个过程中,我期望能够参与更多复杂、具有挑战性的项目,通过实践不断提升自己的技术水平和解决问题的能力。 长期而言,我希望能够成为测试开发领域的专家。我计划通过持续学习和实践,掌握最新的测试开发技术和方法,为公司带来更高的价值。同时,我也考虑在适当的时机,向测试团队领导或项目管理等更高层次的角色发展,为团队的成长和项目的成功做出更大贡献。 如果来这边实习你觉得可能会遇到哪些挑战?如何解决?   如果来到贵公司实习,我可能会遇到以下挑战,并且我已经构思了相应的解决方法:   挑战一:技术深度和广度的掌握 由于测试开发领域涉及众多技术和工具,我可能会在技术深度和广度上面临挑战。为了解决这个问题,我计划采取以下措施:      主动学习:利用公司提供的培训资源,参加技术讲座和研讨会,不断拓宽知识面。        实践应用:将所学知识应用到实际项目中,通过实践来加深理解和掌握。        寻求帮助:遇到技术难题时,积极向导师和同事请教,借助团队的力量共同解决。      挑战二:项目压力和时间管理 在实习期间,我可能会面临来自项目的压力和时间管理的挑战。为了应对这些挑战,我打算:      制定计划:为每个任务设定明确的时间表,合理分配工作和休息时间,确保高效完成任务。        优先级排序:根据项目的重要性和紧急程度,对任务进行优先级排序,确保关键任务得到优先处理。        及时反馈:与团队成员保持密切沟通,及时反馈工作进展和遇到的问题,共同调整计划以应对变化。      挑战三:团队协作和沟通 作为一个实习生,我可能需要时间与团队成员建立默契,确保顺畅的协作和沟通。为此,我将努力做到:      积极参与:主动参与到团队活动中,积极分享自己的想法和见解,展示自己的工作成果。        倾听和理解:在与团队成员交流时,认真倾听他们的意见和建议,努力理解他们的需求和期望。        灵活适应:根据团队的文化和习惯,调整自己的沟通方式和合作态度,以更好地融入团队。      我相信通过以上方法,我能够克服实习期间可能遇到的挑战,并为公司和团队带来积极的影响。   对于读研和直接工作你为什么倾向于选择后者?  对于读研和直接工作,我倾向于选择后者的原因主要有以下几点: 首先,我认为实践是检验真理的唯一标准。虽然研究生阶段的学习能够提供更深入的专业知识和研究能力,但直接工作可以让我更早地接触到实际的工作环境,将所学知识应用到实践中去,从而更好地理解和掌握。通过实际工作,我可以更快地积累经验和提升技能,这对于我未来的职业发展是非常有益的。 其次,我意识到职场是一个不断学习和进步的平台。在工作中,我会遇到各种各样的挑战和问题,这些都需要我去主动学习和解决。这种学习过程是持续的,而且能够让我保持对新技术和新知识的敏感度,从而更好地适应不断变化的市场需求。相比之下,研究生阶段的学习可能更侧重于理论知识和研究方法,而我对于实际应用和解决问题的兴趣更大。 最后,我也考虑到了时间和成本的因素。如果选择读研,我需要投入更多的时间和精力去学习,同时还需要承担一定的经济成本。而直接工作可以让我更早地开始职业生涯,积累工作经验和收入,从而更好地规划自己的未来。当然,这并不是说我不重视学术研究和深造,如果有机会和需要,我也会考虑在工作之余进行进一步的学习和提升。 综上所述,我倾向于选择直接工作是因为我更看重实践经验和职场学习,同时也考虑到了时间和成本的因素。我相信通过努力工作和学习,我能够在职场上取得更好的成绩和发展。 #软件开发笔面经#
点赞 21
评论 1
全部评论

相关推荐

牛客146600443号:92的能看上这3k,5k在搞笑呢
点赞 评论 收藏
分享
点赞 评论 收藏
分享
10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务