赞
踩
目录
一、答疑篇
1、什么是软件测试
软件测试是验证产品特性是否满足需求。是样本试验,具有不可穷尽性。
2、测试和开发的区别
难易程度:开发广度小,专业度高;测试广度大,专业度相对低。
工作环境:基本类似
薪水:中小企业总体比研发低,自动化等专业测试领域和研发基本无差距。大厂研发测试基本无差别
发展前景:自动化测试、安全测试等领域发展前景和研发基本一致。
繁忙程度: 敏捷模式下差距不大,产品发布前压力比较大。
技能要求:测试要求更广泛:业务能力,设计和架构分析能力,测试手段和工具使用,用户模型分析和理解,编程能力
3、测试和测试开发的区别
共同点:测试和测试开发都统称为测试人员,主要职责就是保障项目质量安全
不同点:测试开发比测试多“开发”二字,而这个开发并不是指业务开发,因为业务开发是开发人员的主要职责,这里的开发指的是需要开发测试效率工具,通过效率工具来提升测试效率和测试质量,比如我们的自动化就属于效率工具 。
4、为什么选择测试而不是研发
5、测试用例要素
测试用例是为了实施测试而向被测试的系统提供的一组集合,包含:测试环境、测试步骤、测试数据、预期结果等。
6、测试项目具体工作
搭建测试环境 撰写测试用例 执行测试用例 写测试计划,测试报告 测试,并提交BUG表单 跟踪bug修改情况 执行自动化测试,编写脚本,执行,分析,报告 进行性能测试,压力测试等其他测试,执行,分析,调优,报告
7、测试工程师必备技能
需要的知识:
软件测试基础理论知识,如黑盒测试、白盒测试等;
编程语言基础,如C/C++、java、python等;
自动化测试工具,如Selenium、Appium、Robotium等;
计算机基础知识,如数据库、Linux、计算机网络等;
测试框架,如JUnit等。
需要具备的能力:
业务分析能力,分析整体业务流程、分析被测业务数据、分析被测系统架构、分析被测业务模块、分析测试所需资源、分析测试完成目标;
缺陷洞察能力,一般缺陷的发现能力、隐性问题的发现能力、发现连带问题的能力、发现问题隐患的能力、尽早发现问题的能力、发现问题根源的能力;
团队协作能力,合理进行人员分工、协助组员解决问题、配合完成测试任务、配合开发重现缺陷、督促项目整体进度、出现问题勇于承担;
专业技术能力,掌握测试基础知识、掌握计算机知识、熟练运用测试工具;
逻辑思考能力,判断逻辑的正确性、对可行性逻辑分析、站在客观角度思考;
问题解决能力,技术上的问题、工作中的问题、沟通问题;
沟通表达能力,和技术人员、产品人员、上下级的沟通;
宏观把控能力,有效控制测试时间、有效控制测试成本、有效制定测试计划、有效进行风险评估、有效控制测试方向。
二、概念篇
1、软件的生命周期及各阶段概述
软件的生命周期是指从软件产品的设想开始到软件不再使用而结束的时间。
分为六个阶段:需求分析、计划、设计、编码、测试、运行维护。
2、软件测试的流程:需求测试->概要设计测试->详细设计测试->单元测试->集成测试->系统测试->验收测试
3、开发模型和测试模型
开发模型:
1)瀑布模型
线性顺序进行的软件开发模型,是其他模型的基础。
优点: –强调开发的阶段性; –强调早期计划及需求调查; –强调产品测试。
缺点: –依赖于早期进行的唯一一次需求调查,不能适应需求的变化; –由于是单一流程,开发中的经验教训不能反馈应用于本产品的过程; 风险往往迟至后期的测试阶段才显露,因而失去及早纠正的机会。
2)螺旋模型
渐进式开发模型的代表之一。
适用于规模庞大、复杂度高、风险大的项目。
优点: –强调严格的全过程风险管理。 –强调各开发阶段的质量。 –提供机会检讨项目是否有价值继续下去。
缺点: 引入非常严格的风险识别、风险分析和风险控制,这对风险管理的技能水平提出了很高的要求。需要人员、资金和时间投入。
3)增量、迭代模型
增量开发能显著降低项目风险,鼓励用户反馈,在每个迭代过程中,通过开发人员和测试人员的紧密协作,促使开发小组以一种循环的、可预测的方式驱动产品的开发。
3)敏捷模型
scrum三个重要角色:product owner(产品经理)、scrum master(项目经理)和team(研发团队)
product owner负责整理user story(用户故事),定义其商业价值,对其进行排序,制定发布计划,对产品负责。
scrum master 负责召开各种会议,协调项目,为研发团队服务。
研发团队则由不同技能的成员组成,通过紧密协同,完成每一次迭代的目标,交付产品。
五个重要会议:
发布计划会议:product owner负责讲解user story,对其进行估算和排序,发布计划会议的产出就是制定出这一期迭代要完成的story列表,sprint backlog。
迭代计划会议:项目团队对每一个story进行任务分解,分解的标准是完成该story的所有任务,每个任务都有明确的负责人,并完成工时的初估计。
每日例会:每天scrum master召集站立会议,团队成员回答昨天做了什么今天计划做什么,有什么问题。
演示会议:迭代结束之后,召开演示会议,相关人员都受邀参加,团队负责向大家展示本次迭代取得的成果。期间大家的反馈记录下来,由PO整理,形成新的story。
·回顾会议:项目团队对本期迭代进行总结,发现不足,制定改进计划,下一次迭代继续改进,已达到持续改进的效果。
特点:轻流程、轻文档、重目标、重产出
测试模型
1)V模型
正在上传…重新上传取消正在上传…重新上传取消
局限性:仅仅把测试作为在编码之后的一个阶段,未在需求阶段就进入测试
2)W模型
正在上传…重新上传取消正在上传…重新上传取消
W模型特点:测试的对象不仅是程序,需求、设计等同样要测试,测试与开发是同步进行的。
W模型优点:有利于尽早地全面的发现问题。例如,需求分析完成后,测试人员就应该参与到对需求的验证和确认活动中,以尽早地找出缺陷所在。同时,对需求的测试也有利于及时了解项目难度和测试风险,及早制定应对措施,显著减少总体测试时间,加快项目进度。
局限性:需求、设计、编码等活动被视为串行的;测试和开发活动也保持着一种线性的前后关系,上一阶段完全结束,才可正式开始下一个阶段工作。无法支持敏捷开发模式。
三、基础篇
1、软件测试的生命周期及各阶段概述
需求分析→测试计划→ 测试设计、测试开发→ 测试执行→ 测试评估
需求阶段
测试人员了解需求、对需求进行分解,得出测试需求
计划阶段
根据需求编写测试计划/测试方案
设计阶段
–测试人员适当的了解设计,对于设计测试用例是很有帮助的,测试人员搭建测试用例框架,根据需求和设计编写一部分测试用例
编码阶段
测试人员一般是不需要编码的,但已经编码的模块,专业的白盒测试人员可以计划执行单元测试,完善、细化测试用例以及调整测试计划和方案。
测试阶段
测试阶段是软件测试人员最为重要的工作阶段,根据测试用例和计划执行测试,在执行的过程中记录、管理缺陷,测试完成后编写测试报告。
运行维护
测试人员需要参与项目的实施工作。测试人员对项目产品的业务和操作非常了解,加上测试人员的沟通表达能力一般都比较强,所以测试人员可以参与用户使用软件的培训,在试运行项目时收集问题并及时反馈给相关负责人。
2、bug
如何描述一个bug:
发现问题的版本
问题出现的环境
环境分为硬件环境和软件环境,如果是web项目,需要描述浏览器版本,客户机操作系统等,如果是APP项目,需要描述机型、分辨率、操作系统版本等。
错误重现的步骤
描述问题重现的最短步骤。
预期行为的描述
如果是依据需求提出的故障,能写明需求的来源是最好的。
错误行为的描述
描述错误的现象。crash等可以上传log,UI问题可以有截图。
其他:如故障分类:功能故障、界面故障、兼容性故障等。还有优先级分类。
正在上传…重新上传取消正在上传…重新上传取消
bug等级:
Blocker(崩溃)、Critical(严重)、Major(一般)、Minor(次要)
bug生命周期:
bug状态转换图:
正在上传…重新上传取消正在上传…重新上传取消
3、跟开发产生争执怎么办
先检查自身,BUG描述是否清楚。正确地、高质量的录入一个BUG。如果词难达意,在提交BUG后,与开发人员进行当面沟通。
站在用户的角度考虑问题,让开发人员了解BUG可能对用户造成的困扰。
BUG定级有理有据。BUG定级时,参考BUG定级,还要考虑BUG是否影响流程,站在用户的角度给BUG定级。
提高自身的技术和业务水平,在提出问题的同时,也能提出解决方案 。
如果经过多轮沟通后,开发仍然不接受,可以发起BUG评审。(1)决定如何处理Bug。 (2)分析缺陷产生的原因,找出预防的对策。
四、测试用例篇
1、测试用例的基本要素
测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,包含:测试环境、操作步骤、测试数据、预期结果等要素。
2、设计用例的万能公式
功能测试+界面测试+功能测试+兼容性测试+易用性测试+安全测试
3、常见测试用例设计题型:软件/非软件/代码题型/个人项目
正在上传…重新上传取消正在上传…重新上传取消
代码题型
正在上传…重新上传取消正在上传…重新上传取消
4、基于需求设计测试用例
第一步就要分析测试需求,验证需求是否正确、完整、无二义性,并且逻辑自洽。在需求正确的基础上细化测试需求,从测试需求提炼出一个个测试点或者测试项,然后根据每一个测试点进行测试用例的设计。
分析测试需求时,分为功能需求测试和非功能需求测试。
5、测试用例具体设计方法
黑盒测试:等价类划分、边界值分析、因果图分析(判定表法)、正交法、错误猜测法、场景设计法
白盒测试:语句覆盖、判定覆盖、条件覆盖、条件覆盖、判定/条件覆盖、多重条件覆盖
接口测试
1、如何对接口设计测试用例
检查数据正确性:不同的参数对应的不同接口返回结果;检查数据库数据是否正确
不同的请求类型:get post不同的请求类型下是否符合预期
校验接口兼容性:传入异常数据接口是否会崩溃,接口之间互相调用的情况下是否兼容老版本的接口
校验接口的安全性:参数是否加密,SQL注入,XSS漏洞
自动化测试
正在上传…重新上传取消正在上传…重新上传取消
正在上传…重新上传取消正在上传…重新上传取消
1、什么是自动化测试
自动化测试是指软件测试的自动化,在预设状态下运行应用程序或者系统,最后评估运行结果。将认为驱动的测试转为机器执行的过程。
自动化测试包括UI自动化,接口自动化,单元测试自动化。
2、为什么要用自动化测试
可以对程序的新版本自动执行回归测试
可以执行手工测试困难或者不可能实现的测试,如压力测试,并发测试,
能够更好的利用资源,节省时间和人力 执行自动化测试之前首先判断这个项目是不是和推广自动化测试,然后对项目做需求分析,指定测试计划,搭建自动化测试框架,设计测试用例,执行测试,评估。
3、手动测试与自动化测试的优缺点
手工测试缺点:
1、重复的手工回归测试,代价昂贵、容易出错。
2、依赖于软件测试人员的能力。 手工测试优点:
1、测试人员具有经验和对错误的猜测能力。
2、测试人员具有审美能力和心理体验。
3、测试人员具有是非判断和逻辑推理能力。
自动化测试的优点:
1、对程序的回归测试更方便。这可能是自动化测试最主要的任务,特别是在程序修改比较频繁时,效果是非常明显的。由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行,可以极大提高测试效率,缩短回归测试时间。
2、可以运行更多更繁琐的测试。自动化的一个明显的好处是可以在较少的时间内运行更多的测试。
3、可以执行一些手工测试困难或不可能进行的测试。比如,对于大量用户的测试,不可能同时让足够多的测试人员同时进行测试,但是却可以通过自动化测试模拟同时有许多用户,从而达到测试的目的。
4、更好地利用资源。将繁琐的任务自动化,可以提高准确性和测试人员的积极性,将测试技术人员解脱出来投入更多精力设计更好的测试用例。有些测试不适合于自动测试,仅适合于手工测试,将可自动测试的测试自动化后,可以让测试人员专注于手工测试部分,提高手工测试的效率。
5、测试具有一致性和可重复性。由于测试是自动执行的,每次测试的结果和执行的内容的一致性是可以得到保障的,从而达到测试的可重复的效果。
6、测试的复用性。由于自动测试通常采用脚本技术,这样就有可能只需要做少量的甚至不做修改,实现在不同的测试过程中使用相同的用例。 7、增加软件信任度。由于测试是自动执行的,所以不存在执行过程中的疏忽和错误,完全取决于测试的设计质量。一旦软件通过了强有力的自动测试后,软件的信任度自然会增加。
自动化测试的缺点:
1、不能取代手工测试
2、手工测试比自动测试发现的缺陷更多
3、对测试质量的依赖性极大
4、测试自动化不能提高有效性
5、测试自动化可能会制约软件开发。由于自动测试比手动测试更脆弱,所以维护会受到限制,从而制约软件的开发。
6、工具本身并无想像力
3、为什么使用selenium作为web自动化工具?
免费开源
支持多浏览器
支持多
系统
支持多语言
底层丰富的API
4、UI自动化测试的适用对象
需求变动不频繁、项目周期足够长、自动化测试脚本可重复使用。
5、如何实施自动化测试
分析:总体把握系统逻辑,分析出系统的核心体系架构。
设计:设计测试用例,测试用例要足够明确和清晰,覆盖面广而精
实现:实现脚本,有两个要求一是断言,二是合理的运用参数化。
执行:执行脚本远远没有我们想象中那么简单。脚本执行过程中的异常需要我们仔细的去分析原因。
总结:测试结果的分析,和测试过程的总结是自动化测试的关键。
维护:自动化测试脚本的维护是一个难以解决但又必须要解决的问题。
分析:在自动化测试过程中深刻的分析自动化用例的覆盖风险和脚本维护的成本。
6、Selenium介绍
三个角色:
自动化脚本代码:编写的自动化测试用例
Webdriver浏览器驱动:执行程序
浏览器
工作流程:
正在上传…重新上传取消正在上传…重新上传取消
Webdriver的工作原理:
启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver的remote server。
客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:TheWebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。
Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。
7、Selenium定位元素的方法
id
name
class name
link text
partial link text
tag name
Xpath:绝对路径、相对路径
CSS selector:id选择器、class选择器定位、标签选择器定位、父级子级定位
8、Selenium常用函数
操作测试对象
click 点击对象
send_keys 在对象上模拟按键输入
clear 清除对象输入的文本内容
submit 提交表单
text 用于获取元素的文本信息
添加等待
sleep休眠
隐式等待:implicitly_wait() 方法
打印信息
打印title
driver.title
打印url
driver.current_url
浏览器操作
浏览器最大化
设置浏览器宽、高
操作浏览器前进、后退
控制浏览器滚动条
键盘事件
鼠标事件
上传文件
弹窗操作
下拉框处理
屏幕截图
9、Junit5
10、基于Web的自动化测试实战
性能测试
正在上传…重新上传取消正在上传…重新上传取消
正在上传…重新上传取消正在上传…重新上传取消
其他
1、为什么选择走测试为什么还要学这么多的开发知识?
从个人爱好出发:个人对开发技术比较感兴趣,所以在校期间看了较多开发方面的专业知识(目的是凸显自己爱学习)。
从工作性质出发:测试不仅包含黑盒测试,还有白盒测试。测试人员也需要具备扎实的开发能力来提高个人项目测试质量。另外测试人员也需要开发效能工具来辅助提高测试效率。(凸显自己对软件测试工作的了解)
结合上面两点进行表达。
2、为什么选择软件测试开发岗位而不是软件开发岗位?
回答思路:从岗位工作性质分析+个人性格/爱好+个人职业规划三个方面阐述
软件开发:主要以业务编码为主。
测试开发:不管是测试还是测试开发都统称为测试人员,所以测试人员主要以保障项目测试质量为主,通过开发一些效能工具(比如我们学的自动化就是效能工具,初次之外还有我们课件上写的内存泄漏工具等等)来提高测试效率。
3、个人职业规划
入职之后我将在一年内积极积累个人的测试经验,夯实测试能力和开发能力,做好个人的项目测试管理。提高个人的测试影响力,不管是项目测试还是技术能力上都能够独挡一面。
4、测试中遇到的问题如何解决
我写的web项目(仅设计到前端代码和后端代码)在测试的时候发现有个字段展示的数据不正确,我首先通过在页面上使用F12开发者工具查看接口的请求参数和返回值是否正确,当时发现接口返回值是正确的,所以我判定是前端代码写的有问题。如果是接口返回值就是错误的,那可能是代码逻辑出现了问题,需要对后端代码进行调试。
5、对自己的项目做过哪些测试工作?
1)对项目编写测试用例
参考测试用例对项目进行测试,选取几个用例把测试过程记录下来写一篇博客,把博客链接放到项目下面。
2)自动化测试
这里分两类同学,
第一类为简历上明确写了对自己的项目做过相关测试工作
可以针对自己写的selenium自动化讲解是如何实现的selenium自动化。
第二类为简历上没有写了对自己的项目做过相关测试工作
可以告诉面试官,我目前还没有针对自己的项目做特定的测试手段。但是我了解了selenium工具,能够使用selenium工具来针对个人的项目实现自动化测试,继续告诉面试官如果我针对自己的项目做自动化测试我会如何实现。
描述如何针对selenium工具来实现自动化测试?
首先针对自己的项目设计测试用例,再针对测试用例来实现自动化测试用例。
自动化测试用例采用到selenium包里提供的
1)元素定位、元素的操作实现页面的交互
2)获取页面相关元素并使用断言来校验元素或者文本是否符合预期
3)最后使用套件将我写的测试用例串起来,通过套件来批量执行测试用例。
6、项目研发流程中出现需求变更,测试人员应该怎么做
及时了解需求变更情况,对测试用例进行灵活的修改。
7、当不同的项目存在大量重复的用例,如何做使得用例的创建更高效?
使用用例库,预先把通用的用例编辑好,每次有项目存在大量重复的用例时可通过导入用例库的方式来提高用例创建的效率。
8、 如何提高测试人员和开发人员的沟通效率?
1)沟通之前准备好需要讨论的问题
2)沟通时注意合理且有礼貌的表达,若讨论出现对立意见,不要上升情绪,保持讨论对事不对人的原则
3)秉持批判性思维,反思自己,对他们的建议不排斥并辩证性吸取经验。
4)对于讨论会议要做好记录,避免会后遗忘造成无效的沟通
5)尽量采取面对面的高效沟通,减少低效的沟通工具来传递信息。
9、给项目测试留的时间只有3天,而测试评估需要5天,这种情况该怎么办?
第一步:秉持测试质量为上原则。询问是否可以适当压缩上流时间,从而增加保留的测试时间。
第二步:告知测试风险。是否可以接受只测试主要功能,次要功能可能会遗留风险。
第三步:向上反馈,若上述步骤都无法得到同意。将问题和历史沟通反馈给上级/测试经理并请求帮助。
1、什么是多态
多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
Java实现多态有三个必要条件:继承、重写、向上转型。 继承:在多态中必须存在有继承关系的子类和父类。 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。 Java中有两种形式可以实现多态,继承和接口: 基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。 基于接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。
2、集合类和内存
集合类。 Java中的集合包含多种数据结构,如链表、队列、哈希表等。从类的继承结构来说,可以分为两大类,一类是继承自Collection接口,这类集合包含List、Set和Queue等集合类。另一类是继承自Map接口,这主要包含了哈希表相关的集合类。
List、Set和Queue类的继承结构图:绿色的虚线代表实现,绿色实线代表接口之间的继承,蓝色实线代表类之间的继承。 Collection接口除了实现映射的集合类之外的所有集合类定义了一些方法 List集合类型:描述了一种按位置存储数据的对象,是有序的。用的比较多List包括ArrayList和LinkedList,这两者的区别:ArrayList的底层的通过数组实现,所以其随机访问的速度比较快,但是对于需要频繁的增删的情况,效率就比较低了。而对于LinkedList,底层通过链表来实现,所以增删操作比较容易完成,但是对于随机访问的效率比较低。 Queue:一般可以直接使用LinkedList完成,LinkedList继承自Deque,所以LinkedList具有双端队列的功能。PriorityQueue是为每个元素提供一个优先级,优先级高的元素会优先出队列。 Set:Set与List的主要区别是Set是不允许元素是重复的,而List则可以允许元素是重复的。HashSet和LinkedHashSet的区别在于后者可以保证元素插入集合的元素顺序与输出顺序保持一致。而TresSet的区别在于其排序是按照Comparator来进行排序的,默认情况下按照字符的自然顺序进行升序排列。 Iterable:Collection类继承自Iterable,该接口的作用是提供元素遍历的功能,也就是说所有的集合类(除Map相关的类)都提供元素遍历的功能。Iterable里面包含了Iterator的迭代器。
Map类型的集合:最大的优点在于其查找效率比较高,理想情况下可以实现O(1)的时间复杂度。Map中最常用的是HashMap,LinkedHashMap与HashMap的区别在于前者能够保证插入集合的元素顺序与输出顺序一致。这两者与TreeMap的区别在于TreeMap是根据键值进行排序的,其底层的实现也有本质的区别,HashMap底层是一个哈希表,而TreeMap的底层数据结构是一棵树。
内存
1、几种基本的数据结构
常见的基本的数据结构有链表、栈、队列、树
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,这些节点不必在内存中相连。每个节点由数据部分Data和链部分Next,Next指向下一个节点,这样当添加或者删除时,只需要改变相关节点的Next的指向,效率很高。
栈和队列是比较特殊的线性表 栈是限制插入和删除只能在一个位置上进行的表,后进先出;队列只允许在front端进行删除操作,在rear端进行插入操作。
树:树型结构是一类非常重要的非线性数据结构,考察主要以二叉树为主。
3、数组和链表的区别,以及优缺点,另外有没有什么办法能够结合两者的优点
数组: 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少插入和删除元素,就应该用数组。
链表: 链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表。
区别:(1)存储位置上: 数组逻辑上相邻的元素在物理存储位置上也相邻,而链表不一定; (2)存储空间上: 链表存放的内存空间可以是连续的,也可以是不连续的,数组则是连续的一段内存空间。一般情况下存放相同多的数据数组占用较小的内存,而链表还需要存放其前驱和后继的空间。 (3)长度的可变性: 链表的长度是按实际需要可以伸缩的,而数组的长度是在定义时要给定的,如果存放的数据个数超过了数组的初始大小,则会出现溢出现象。 (4)按序号查找时,数组可以随机访问,时间复杂度为O(1),而链表不支持随机访问,平均需要O(n); (5)按值查找时,若数组无序,数组和链表时间复杂度均为O(1),但是当数组有序时,可以采用折半查找将时间复杂度降为O(logn); (6)插入和删除时,数组平均需要移动n/2个元素,而链表只需修改指针即可; (7)空间分配方面: 数组在静态存储分配情形下,存储元素数量受限制,动态存储分配情形下,虽然存储空间可以扩充,但需要移动大量元素,导致操作效率降低,而且如果内存中没有更大块连续存储空间将导致分配失败;即数组从栈中分配空间,,对于程序员方便快速,但自由度小。 链表存储的节点空间只在需要的时候申请分配,只要内存中有空间就可以分配,操作比较灵活高效;即链表从堆中分配空间, 自由度大但申请管理比较麻烦。
哈希表可以结合数组和链表的优点。
1、常用的MySQL命令
【增】insert insert into 表名 values(值1,值2,…); insert into 表名(字段1,字段2…) values(值1,值2,…);(较常用) insert into 表名(字段1,字段2…) values(值1,值2,…),(值1,值2,…),(值1,值2,…); 【删】delete delete from 表名 where 条件 【改(更新)】update update 表名 set字段1 = 值1, 字段2 = 值2 where 条件 重要*【查】select select * from 表名 查询表中的所有数据 select 字段 from 表名 指定数据查询 select 字段 from 表名 where 条件 根据条件查询出来的数据 where 条件后面跟的条件 关系:>,<,>=,<=,!= 逻辑:or, and 区间:id between 4 and 6 ;闭区间,包含边界 【排序】 select 字段 from 表 order by 字段 排序关键词(desc | asc) 排序关键词 desc 降序 asc 升序(默认) 通过字段来排序 :select * from star orser by money desc, age asc; 多字段排序 :select 字段 from 表 order by 字段1 desc |asc,…字段n desc| asc; 【常用的统计函数】 sum,avg,count,max,min
2、多表联合查询
1.内连接 隐式内连接 select username,name from user,goods where user,gid=gods,gid; 显示内连接 select username,from user inner join goods on user.gid=goods.gid; select * from user left join goods on user.gid=goods.gid; 2.外链接 左/右连接 select * from user where gid in(select gid from goods); select * from user right jOin goods on user.gid=goods.gid; 3.数据联合查询 select * from user left join goods on user.gid=goods.gid union select * from user right join goods on user.gid=goods.gid; 4.两个表同时更新
正在上传…重新上传取消正在上传…重新上传取消
1、常用操作命令
shutdown -h now 立刻关机 shutdown -h 5 5分钟后关 poweroff 立刻关机 shutdown -r now 立刻重启 shutdown -r 5 5分钟后重启 reboot 立刻重启 cd / 切换到根目录cd /usr 切换到根目录下的usr目录 cd …/ 切换到上一级目录 或 cd … cd ~ 切换到home目录 cd - 切换到上次访问的目录 ls 查看当前目录下的所有目录和文件 ls -a查看当前目录下的所有目录和文件(包括隐藏的文件) ls -l 列表查看当前目录下的所有目录和文件(列表查看,显示更多信息) ls / 查看指定目录下的所有目录和文件 查找命令 grep 命令是一种强大的文本搜索工具 find 命令在目录结构中搜索文件,并对搜索结果执行指定的作。 locate 让使用者可以很快速的搜寻某个路径。 whereis 命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。 which 命令的作用是在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。 命令格式 crontab [-u user] file crontab [-u user] [ -e | -l | -r ] 参数说明: -u user:用来设定某个用户的crontab服务 file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。 -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。 -l:显示某个用户的crontab文件内容。如果不指定用户,则表示显示当前用户的crontab文件内容。 -r:删除定时任务配置,从/var/spool/cron目录中删除某个用的crontab 文件,如果不指定用户,则默认删除当前用户的crontab文件。 命令:pwd 查看当前目录路径 命令:ps -ef 查看所有正在运行的进程 命令:kill pid 或者 kill -9 pid(强制杀死进程) pid:进程号 ifconfig:查看网卡信息 命令:ifconfig 或 ifconfig | more ping:查看与某台机器的连接情况 命令:ping ip netstat -an:查看当前系统端口 命令:netstat -an 搜索指定端口 命令:netstat -an | grep 8080
2、目录操作【增,删,改,查】
【增】 mkdir mkdir aaa 在当前目录下创建一个名为aaa的目录 mkdir /usr/aaa 在指定目录下创建一个名为aaa的目录 【删】rm 删除文件: rm 文件 删除当前目录下的文件 rm -f 文件 删除当前目录的的文件(不询问) 删除目录: rm -r aaa 递归删除当前目录下的aaa目录 rm -rf aaa 递归删除当前目录下的aaa目录(不询问) 全部删除: rm -rf * 将当前目录下的所有目录和文件全部删除 rm -rf /* 【慎用!慎用!慎用!】将根目录下的所有文件全部删除 注意:rm不仅可以删除目录,也可以删除其他文件或压缩包,为了方便大家的记忆,无论删除任何目录或文件,都直接使用 rm -rf 目录/文件/压缩包 【改】mv 和 cp 重命名目录 命令:mv 当前目录 新目录 例如:mv aaa bbb 将目录aaa改为bbb 剪切目录 命令:mv 目录名称 目录的新位置(将/usr/tmp目录下的aaa目录剪切到/usr目录下面 mv/usr/tmp/aaa/usr) 拷贝目录 命令:cp -r 目录名称 目录拷贝的目标位置 -r代表递归 (将/usr/tmp目录下的aaa目录复制到 /usr目录下面 cp /usr/tmp/aaa /usr) 【查】find 命令:find 目录 参数 文件名称 示例:find /usr/tmp -name ‘a*’ 查找/usr/tmp目录下的所有以a开头的目录或文件
3、文件操作【增,删,改,查】
【增】touch touch 文件名(示例:在当前目录创建一个名为aa.txt的文件 touch aa.txt) 【删】 rm rm -rf 文件名 【改】 vi或vim vi编辑器的3种模式 基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下: 1、command mode 命令行模式下的常用命令: 【1】控制光标移动: ↑,↓,j 【2】删除当前行: dd 【3】查找:/字符 【4】进入编辑模式: i o a 【5】进入底行模式: : 2、Insert mode编辑模式 编辑模式下常用命令: 【1】ESC 退出编辑模式到命令行模式; 3、last line mode底行模式下常用命令: 【1】退出编辑: :q 【2】强制退出: :q! 【3】保存并退出: :wq 【查】文件的查看命令:cat/more/less/tail cat:看最后一屏 cat sudo.conf(使用cat查看/etc/sudo.conf文件,只能显示最后一屏内容) more:百分比显示more sudo.conf(使用more查看/etc/sudo.conf文件,可以显示百分比,回车可以向下一行,空格可以向下一页,q可以退出查看) less:翻页查看less sudo.conf(使用less查看/etc/sudo.conf文件,可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看) tail:指定行数或者动态查看tail -10 sudo.conf(使用tail -10 查看/etc/sudo.conf文件的后10行,Ctrl+C结束) 打包和压缩 Windows的压缩文件的扩展名 .zip/.rar linux中的打包文件:aa.tar linux中的压缩文件:bb.gz linux中打包并压缩的文件:.tar.gz Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。 命令:tar -zcvf 打包压缩后的文件名 要打包的文件,其中:z:调用gzip压缩命令进行压缩 c:打包文件 v:显示运行过程 f:指定文件名 示例:打包并压缩/usr/tmp 下的所有文件 压缩后的压缩包指定名称为xxx.tar tar -zcvf ab.tar aa.txt bb.txt 或:tar -zcvf ab.tar * 解压 命令:tar [-zxvf] 压缩文件 其中:x:代表解压 示例:将/usr/tmp 下的ab.tar解压到当前目录下 tar -zxvf ab.tar 示例:将/usr/tmp 下的ab.tar解压到根目录/usr下 tar -zxvf ab.tar -C /usr------C代表指定解压的位置
1、网络通信五元组
在TCP/IP协议中,用五元组来标识一个网络通信:
源IP:标识源主机
源端口号:标识源主机中该次通信发送数据的进程
目的IP:标识目的主机
目的端口号:标识目的主机中该次通信接收数据的进程
协议号:标识发送进程和接收进程双方约定的数据格式
2、OSI七层模型
3、TCP/IP五层(或四层)模型
应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。
传输层:负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。
网络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
数据链路层:负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。
物理层:负责光/电信号的传递方式。比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
正在上传…重新上传取消正在上传…重新上传取消
4、网络传输流程
正在上传…重新上传取消正在上传…重新上传取消
5、说明浏览器中输入url后,发生的事情(重点讲后端)
输入地址,浏览器查找域名的 IP 地址。 浏览器向 该 IP 地址的web 服务器发送一个 HTTP 请求,在发送请求之前浏览器和服务器建立TCP的三次握手,判断是否是HTTP缓存,如果是强制缓存且在有效期内,不再向服务器发请求,如果是HTTP协商缓存向后端发送请求且和后端服务器对比,在有效期内,服务器返回304,直接从浏览器获取数据,如果不在有效期内服务器返回200,返回新数据。 请求发送出去服务器返回重定向,浏览器再按照重定向的地址重新发送请求。 如果请求的参数有问题,服务器端返回404,如果服务器端挂了返回500。
如果有数据一切正常,当浏览器拿到服务器的数据之后,开始渲染页面同时获取HTML页面中图片、音频、视频、CSS、JS,在这期间获取到JS文件之后,会直接执行JS代码,阻塞浏览器渲染,因为渲染引擎和JS引擎互斥,不能同时工作,所以通常把Script标签放在body标签的底部。 渲染过程就是先将HTML转换成dom树,再将CSS样式转换成stylesheet,根据dom树和stylesheet创建布局树,对布局树进行分层,为每个图层生成绘制列表,再将图层分成图块,紧接着光栅化将图块转换成位图,最后合成绘制生成页面。
整个流程中涉及到浏览器的浏览器进程、网路进程和渲染进程
正在上传…重新上传取消正在上传…重新上传取消
7、传输层重点协议:TCP
特点:可靠、有连接、面向字节流
三次握手的基本流程
常见的状态码
常见的异常情况解决
流量控制/拥塞控制
对比UDP(使用UDP如何实现TCP)
8、HTTP协议
格式
GET vs POST
常见的响应状态:200、400、404、405、500(301、302、303、307)
正在上传…重新上传取消正在上传…重新上传取消
常见的Content-Type
Cookie + Session
9、HTTPS基本流程
传输安全:防窃听、防篡改、防伪造
获取证书:为什么要有证书、证书里有哪些信息、CA是什么
非对称加密彼此计算、沟通对称加密密钥
使用对称加密传输HTTP请求/响应
10、HTTP请求报文
请求方法 GET:请求获取Request——URL所标识的资源 POST:在Request——URL所标识的资源后附加资源 HEAD:请求获取由Request——URL所标识的资源的响应消息报头 PUT:请求服务器存储一个资源,由Request——URL作为其标识 DELETE:请求服务器删除由Request——URL所标识的资源 TRACE:请求服务器回送收到的请求信息(用于测试和诊断) CONNECT:保留 OPTIONS:请求查询服务器性能
URL URI全名为Uniform Resource Indentifier(统一资源标识),用来唯一的标识一个资源,是一个通用的概念,URI由两个主要的子集URL和URN组成。URL全名为Uniform Resource Locator(统一资源定位),通过描述资源的位置来标识资源。URN全名为Uniform Resource Name(统一资源命名),通过资源的名字来标识资源,与其所处的位置无关,这样即使资源的位置发生变动,其URN也不会变化。
协议版本 格式为HTTP/主版本号.次版本号,常用为:HTTP/1.1 HTTP/1.0
请求头部 Host:接受请求的服务器地址,可以是IP或者是域名 User-Agent:发送请求的应用名称 Connection:指定与连接相关的属性,例如(Keep_Alive,长连接) Accept-Charset:通知服务器端可以发送的编码格式 Accept-Encoding:通知服务器端可以发送的数据压缩格式 Accept-Language:通知服务器端可以发送的语言
11、TCP和UDP的区别
TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接 。
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付。
TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信 。
TCP首部开销20字节;UDP的首部开销小,只有8个字节。
TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。
3、TCP三次握手、四次挥手
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers);
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
为什么不是两次: 在服务端对客户端的请求进行回应(第二次握手)后,就会理所当然的认为连接已建立,而如果客户端并没有收到服务端的回应呢?此时,客户端仍认为连接未建立,服务端会对已建立的连接保存必要的资源,如果大量的这种情况,服务端会崩溃。
4、为什么TCP可靠,哪些方法保证可靠
4、http协议和https协议的区别
传输信息安全性不同、连接方式不同、端口不同、证书zhuan申请方式不同、传输信息安全性不同
http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息;
https协议:是具有安全性的ssl加密传输协议,为浏览器和服务器之间的通信加密,确保数据传输的安全。
连接方式不同
http协议:http的连接很简单,是无状态的;
https协议:是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。
端口不同,http协议:使用的端口是80;https协议:使用的端口是443。
证书申请方式不同,http协议:免费申请; https协议:需要到ca申请证书,一般免费证书很少,需要交费
5、GET和POST的区别
GET请求在URL中传送的参数是有长度限制的,而POST没有
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET在浏览器回退时是无害的,而POST会再次提交请求。
6、HTTP常见错误状态码
正在上传…重新上传取消正在上传…重新上传取消
如何区分BUG来源
先抓包看请求报文,对着接口文档,看请求报文有没问题,有问题就是前端发的数据不对;请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。