面试经典问题整理(持更)

操作系统

1. 进程和线程的区别

进程 :一个程序在一个数据集上运行或一个程序在同样数据集上的多次运行都是不同的进程。mnjm

​ 进程是独立的,有自己的内存空间和上下文环境,无法获取其它进程的存储空间。同一进程的两段代码不能同时执行,除非引入线程。

线程 :进程的一个实体,是被系统独立调度和执行的基本单位,CPU使用的基本单位。

​ 同一进程的线程可以共享同一内存空间。

​ 线程是属于进程的,进程退出时产生的线程都会被强制退出并清除。

​ 线程占用的资源少于进程占用的资源。

进程和线程可以有优先级。

2. 内存中的进程结构

栈区 : 函数参数、返回地址、局部变量(运行入口知道大小)

堆区 :运行期间动态分配的内存空间(运行时才知道大小)

数据段 : 全局变量、静态变量、常量

3. 进程状态

创建 : 信息设置完但资源有限

运行 :占用CPU

就绪 :等待分配CPU

等待、终止 :进程完成执行

4. 进程间的通信如何实现

信号 :比较复杂的通信方式,用于通知接收进程某个事件已发生

信号量 :是一个计数器,用来控制多个进程对资源的访问,通常用来作为一种锁机制

管道 :是一种半双工的通信方式,数据只能单向流动,并且只能在具有亲缘关系的进程间流动,进程的亲缘关系通常是父子进程。

命名管道 :也是半双工的通信方式,它允许无亲缘关系的进程间进行通信

消息队列 :消息的链表,存放在内核中并由消息队列标识符标识。

共享内存 :映射一段能被其它进程访问的内存,这段共享内存由一个进程创建,但是多个进程可以访问。

5. 死锁

产生条件

​ 互斥:一个资源只能被一个进程使用

​ 占有并等待:一个进程至少占有一个资源并等待一个其他进程占有的资源

​ 非抢占:资源不能被抢占,只能完成后释放

​ 循环等待:若干进程之间形成一种头尾相接的循环等待资源的关系

死锁预防

​ 互斥:共享资源不要求互斥访问(是共享设备必须的,所以不能改变)

​ 占有并等待:保证进程申请资源时不能占有其它资源:1.执行前一次性申请获得所有资源,2.没有资源时才可申请资源 优点:简单、安全;缺点:资源浪费,降低系统利用率

​ 非抢占:资源可被抢占 缺点:实现复杂,代价大。反复申请和是否资源,导致进程的执行被无限推迟,延长了进程的周转时间,增加系统开销,降低了系统吞吐量。

​ 循环等待:对资源进行完全排序,进程按递增顺序申请资源。 缺点:限制了用户编程;进程使用资源顺序和系统规定顺序不同会造成资源浪费。

6.作业调度

先来先服务(FCFS)

短作业优先调度(SJF) :平均等待时间最短,必须知道作业运行时间,对长作业不利。

优先级调度(PSA)

7. 临界区和临界资源

临界资源 :临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。

临界区 :每个进程中访问临界资源的那段代码称为临界区(criticalsection),每次只允许一个进程进入临界区,进入后,不允许其他进程进入。不论是硬件临界资源还是软件临界资源,多个进程必须互斥的对它进行访问。多个进程涉及到同一个临界资源的的临界区称为相关临界区。使用临界区时,一般不允许其运行时间过长,只要运行在临界区的线程还没有离开,其他所有进入此临界区的线程都会被挂起而进入等待状态,并在一定程度上影响程序的运行性能。

在Linux环境下,没有Windows下的临界区的概念,但是也可以利用互斥量实现该功能。

1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。
2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。
3、临界区和互斥体在Windows平台都下可用;Linux下只有互斥体可用。
4、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
5、互斥量:为协调共同对一个共享资源的单独访问而设计的。

8.线程共享数据的方式

1.如果每个线程执行的代码相同,可以用一个Runnable对象,这个Runnable对象中存放那个共享数据(卖票系统可以这样做)。

2.如果每个线程执行的代码不同时,就需要不同的Runnable对象:

a. 将共享数据封装在一个对象中,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据操作的方法也分配到这个对象中,这样容易实现针对该数据进行的各个操作的互斥通信。

b. 将Runnable对象作为某一个类的内部类,共享数据作为这个外部类的成员变量,每个线程对共享数据的操作方法也分配到外部类中,实现共享数据的互斥和通信操作,作为内部类的各个Runnable对象调用外部类的这些方法。

c. 以上两种方法的组合:将共享数据封装到一个对象中,每个线程对共享数据的操作方法也分配到对象中,对象作为外部类的成员变量或方法中的局部变量,每个线程的Runnable作为成员内部类或局部内部类。

数据库

1. 事务四大特性

原子性 :要么执行,要么都不执行

隔离性 :所有操作全部执行完以前,其它会话不能看到过程

一致性 :事务前后,数据总额一致

持久性 :一旦事务提交,对数据的改变就是永久的

2. 索引优缺点

索引最大的好处是提高查询速度,

缺点是更新数据时效率低,因为要同时更新索引

对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引

3. join

inner join : 内连接,连接匹配的就可以。

select column_name(s)
from table 1
INNER JOIN table 2
ON
table 1.column_name=table 2.column_name

select * from Table A inner join Table B
on Table A.id=Table B.id

left join :左连接,返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替。

elect column_name(s)
from table 1
LEFT JOIN table 2
ON table 1.column_name=table 2.column_name

select * from Table A left join Table B
on Table A.id=Table B.id

right join : 右连接,返回右表的全部行和左表满足ON条件的行,如果右表的行在左表中没有匹配,那么这一行左表中对应数据用NULL代替。

select column_name(s)
from table 1
RIGHT JOIN table 2
ON table 1.column_name=table 2.column_name

select * from Table A right join Table B
on Table A.id=Table B.id

full outer join :会从左表 和右表 那里返回所有的行。如果其中一个表的数据行在另一个表中没有匹配的行,那么对面的数据用NULL代替.

select column_name(s)
from table 1
FULL OUTER JOIN table 2
ON table 1.column_name=table 2.column_name

select * from Table A full outer join Table B
on Table A.id=Table B.id

cross join :笛卡儿积。把表A和表B的数据进行一个N*M的组合,即笛卡尔积。

select* from Table A cross join Table B
or
select* from Table A, Table B
4. 视图

是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改会影响基本表。它使得我们获取数据更容易,相比多表查询。

5. 游标

是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

6. 主键和外键

主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。

外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(尽管可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。

主键在本表中是唯一的、不可为空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键。

7. 常用语句

创建数据库 :CREATE DATABASE database-name

删除数据库 :drop database dbname

创建表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

–根据已有的表创建新表:

A:create table tab_new like tab_old (使用旧表创建新表)

B:create table tab_new as select col1,col2… from tab_old definition only

删除表 : drop table tabname

增加列 :Alter table tabname add column col type

添加主键 :Alter table tabname add primary key(col)

创建索引 :create [unique] index idxname on tabname(col….)

创建视图 :create view viewname as select statement

常用语句

--选择:
        select * from table1 where 范围

--插入:
        insert into table1(field1,field2) values(value1,value2)

--删除:
        delete from table1 where 范围

--更新:
        update table1 set field1=value1 where 范围

--查找:
        select * from table1 where field1 like%value1%---like的语法很精妙,查资料!

--排序:
        select * from table1 order by field1,field2 [desc]

--总数:
        select count as totalcount from table1

--求和:
        select sum(field1) as sumvalue from table1

--平均:
        select avg(field1) as avgvalue from table1

--最大:
        select max(field1) as maxvalue from table1

--最小:
		select min(field1) as minvalue from table1

计网

1.Http和Https的区别

Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。

二者之间存在如下不同:

​端口不同:Http与Http使用不同的连接方式,用的端口也不一样,前者是80,后者是443;

资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;

开销:Https通信需要证书,而证书一般需要向认证机构购买;

2.三次握手与四次挥手

(1).三次握手 (我要和你建立链接,你真的要和我建立链接么,我真的要和你建立链接,成功):

第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。 

第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。 

第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。 

(2).四次挥手 (我要和你断开链接;好的,断吧。我也要和你断开链接;好的,断吧):

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。 


第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。此时TCP链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。 

第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。 

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。 
3.为什么TCP需要三次握手,两次不可以么

为了防止已失效的链接请求报文突然又传送到了服务端,因而产生错误。

客户端发出的连接请求报文并未丢失,而是在某个网络节点长时间滞留了,以致延误到链接释放以后的某个时间才到达Server。这时,Server误以为这是Client发出的一个新的链接请求,于是就向客户端发送确认数据包,同意建立链接。若不采用“三次握手”,那么只要Server发出确认数据包,新的链接就建立了。由于client此时并未发出建立链接的请求,所以其不会理睬Server的确认,也不与Server通信;而这时Server一直在等待Client的请求,这样Server就白白浪费了一定的资源。若采用“三次握手”,在这种情况下,由于Server端没有收到来自客户端的确认,则就会知道Client并没有要求建立请求,就不会建立链接。 
4. TCP与UDP的区别

TCP和UDP协议属于传输层协议,它们之间的区别包括:

TCP是面向连接的,UDP是无连接的;

TCP是可靠的,UDP是不可靠的;

TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;

TCP是面向字节流的,UDP是面向报文的;

TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信;

TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;

5. Session与Cookie的对比

实现机制 :Session的实现常常依赖于Cookie机制,通过Cookie机制回传SessionID;

大小限制 :Cookie有大小限制并且浏览器对每个站点也有cookie的个数限制,Session没有大小限制,理论上只与服务器的内存大小有关;

安全性 :Cookie存在安全隐患,通过拦截或本地文件找得到cookie后可以进行攻击,而Session由于保存在服务器端,相对更加安全;

服务器资源消耗 :Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。

6.get和post的区别
  • get参数通过url传递,post放在request body中。

  • get请求在url中传递的参数是有长度限制的,而post没有。

  • get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。

    • get请求只能进行url编码,而post支持多种编码方式
    • get请求会浏览器主动cache,而post支持多种编码方式。
    • get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
  • GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

  • GET产生一个TCP数据包;POST产生两个TCP数据包。

长的说:

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

(据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。)

7. 常见状态码及原因短语

HTTP请求结构: 请求方式+请求URI +协议及其版本

HTTP响应结构: 状态码+原因短语+协议及其版本

1××:请求处理中,请求已被接受,正在处理

2××:请求成功,请求被成功处理

200 OK

3××:重定向,要完成请求必须进行进一步处理

301 :永久性转移

302:暂时性转移

304: 已缓存

4××:客户端错误,请求不合法

400:Bad Request,请求有语法问题

403:拒绝请求

404:客户端所访问的页面不存在

5××:服务器端错误,服务器不能处理合法请求

500:服务器内部错误

503: 服务不可用,稍等

8. 在浏览器中输入url地址->>显示主页的过程

https://blog.csdn.net/alwanyslongjing/article/details/52601920

9. https的加密方式

对称秘钥:对称密钥加密又叫专用密钥加密,即发送和接收数据的双方必使用相同的密钥对明文进行加密和解密运算。通常有两种模式:流加密和分组加密。

非对称秘钥 :非对称加密算法需要两个密钥:公开秘钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

Https加密

对称加密和非对称加密结合方式

浏览器使用Https的URL访问服务器,建立SSL链接。
服务器收到SSL链接,发送非对称加密的公钥A返回给浏览器
浏览器生成随机数,作为对称加密的密钥B
浏览器使用公钥A,对自己生成的密钥B进行加密,得到密钥C
浏览器将密钥C,发送给服务器。
服务器用私钥D对接受的密钥C进行解密,得到对称加密钥B。

10.为什么要有四次握手的TIME_WAIT状态

(1)第一是为了保证最后一个的一个ACK报文能到达B。这个ACK报文有可能丢失,因而使得处在LAST_ACK状态得不到对已发送的FIN+ACK报文的确认,B会超时重传这个FIN+ACk ,而A就能在这TIME_WAIT时间(2MSL)里收到这个重传的报文,A就可以重传一次确认,如果没有这个TIME_WAIT, 那B重传的FIN_ACK,可A早就走了,自然不会再重发确认,这样B就无法按照正常步骤进入CLOSE 状态。

(2)第二是防止“已失效的报文连接请求”,A在TIME_WAIT中,经过这2MSL的时间,就可以使本链接持续的时间内产生的所有连接消失,这样就可以使下一个新的连接中不会出现这样旧的连接请求报文段。

https://blog.csdn.net/diediexiaomi/article/details/77825793

https://blog.csdn.net/qq_38950316/article/details/81087809

Linux

1.文件类型和权限

一共有10个字符,下面逐一解释每个字符的含义和取值。范例:-rwxrwx—

第一个字符代表这个文件是【目录、文件或者链接文件等】

*当为【d】则是目录 

*当为【-】则是文件(范例就表示一个文件) 

*当为【l】则表示连接档(类似Windows下的快捷方式) 

接下来的字符中,以三个为一组,且均为【rwx】三个参数的组合,其中,【r】表示可读,【w】表示可写,【x】表示可执行(如果是目录表示是否有进入此目录工作的权限,linux系统中某一个文件是否可执行是此权限定义,但是,是否能够执行成功则是文件内容决定,一般程序才可执行成功)要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现【-】 

第一组为【文件拥有者可具备的权限】,范例中可读可写可执行 

第二组为【加入此群组账号的权限】,范例中可读可写可执行 

第三组为【非本人且没有加入此群组的其他账号的权限】,范例中没有什么权限 
2. 改变文件属性和权限

chgrp:改变文件所属群组

语法:chgrp [-R] groupname dirname/filename(-R表示进行递归的持续变更,也就是连同次目录下所有文件、目录都会更新成这个群组的意思)

举例:chgrp user initial.cfg

chown:改变文件拥有者

语法:chown [-R] username:group dirname/filename(冒号也可以改变成.)

举例:chown root:root initial.cfg

3. 改变权限

3.1数字类型改变权限

linux文件基本权限有9个,分别是owner/group/others三种身份各有自己的read/write/execute权限,而[rwx]权限对应数字如下r:4,w:2,x:1

举例:chmod [-R] 777 .bashrc

**3.2符号类型改变文件权限 **

Linux三种身份user/group/others分别用u,g,o来代表,此外,a代表all也就是全部身份。

范例:chmod u=rwx,go=rx .bashrc(go连在一起,中间没有空格)

4. 查看端口号占用并杀掉进程
  1. 查看端口号占用情况

    netstat -apn|grep 11305

tcp 0 0 10.65.42.27:80 172.22.142.20:62771

ESTABLISHED9435/lighttpd

  1. 确定进程号

为上面加粗显示

找到进程号以后,再使用以下命令查看详细信息:

ps -aux|grep <进程号>

eg: ps -aux | grep 9435

bae 9435 0.0 0.2 133724 22848 ? Sl Feb27 10:22 /kingdee/eas/java

  1. 杀掉该进程

kill -9 <pid>

C++

三大特性

继承 :使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”。

被继承的类称为“基类”、“父类”或“超类”。

1,提高了代码的复用性。

2,让类与类之间产生了关系。有了这个关系,才有了多态的特性。

多态 :将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

父类的引用指向了自己的子类对象。

父类的引用也可以接收自己的子类对象。

封装 :就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

private:关键字

A:用于修饰成员变量和成员方法。

B:被修饰的内容在其他类中是不可以被访问的。

虚函数与纯虚函数

虚函数 :在基类中冠以关键字 virtual 的成员函数。 它提供了一种接口界面。允许在派生类中对基类的虚函数重新定义。
纯虚函数 的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用。
从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。

抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。

重载和重写

重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

重写:是指子类重新定义父类虚函数的方法。

从实现原理上来说:

重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!

重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。

main函数之前执行的代码

全局对象的构造函数会在main 函数之前执行

内存分配方式

从静态存储区域分配 。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。

在栈上创建 。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

从堆上分配 ,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

引用和指针的区别
  1. 引用必须被初始化,指针不必。

  2. 引用初始化以后不能被改变,指针可以改变所指的对象。

  3. 不存在指向空值的引用,但是存在指向空值的指针。

const和define

(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。

(2) 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。

static和const

static关键字 至少有下列5个作用:
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

const关键字至少有下列5个作用:
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的 成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

软件测试

通常说来,我们考虑一个测试对象的时候至少从以下六方面来考虑:

功能性
易用性
可靠性
性能
安全
兼容性

比如下面的两个测试对象

1、微信点赞功能测试用例?
  ①点赞和取消点赞功能
  ②点赞是否按时间顺序显示
  ③点赞是否正确显示昵称或备注
  ④点赞之后是否还能评论
  ⑤弱网络的情况下点赞能否实时更新
  ⑥点赞时有短信或电话进来,能否显示点赞情况
  ⑦点赞的人是否在可见分组里
  ⑧点赞之后共同好友的点赞和评论是否会提醒你

2、APP测试需要考虑的点都有哪些?

性能测试:
  CPU,内存,耗电量,耗流量,流畅度,APP的安装和卸载和启动的耗时
适配兼容性:
  在不同的操作系统上的安装,拉起,点击,和卸载是否正常
耗电量测试:
  当手机冲满格电的时候能玩多久,挂机10分钟耗多少电,APP每小时耗电多少
中断测试:
  app在前台和后台运行状态时与来电,文件下载,音乐等关键运行的交互情况测试,测试电话,短信,微博或其他通知进来是APP的反应

弱网络测试

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值