测试工程师面试题

1、判断ip合法性

5类地址:A,B,C,D,E

2、黑盒测试和白盒测试

白盒测试:是通过程序的源代码进行测试而不使用用户界面。这种类型的测试需要从代码句法发现内部代码在算法,溢出,路径,条件等等中的缺点或者错误,进而加以修正。黑盒测试:又被称为功能测试、数据驱动测试或基于规格说明的测试,是通过使用整个软件或某种软件功能来严格地测试, 而并没有通过检查程序的源代码或者很清楚地了解该软件的源代码程序具体是怎样设计的。

一.功能测试用例的设计

举例:

(一).我想要回家,让你给我买一张票,然后设计测试用例

答案:

1.确定需求(回家回哪,需要什么票,买什么时候的票)

2.开始测试

2.1功能测试(我去买票(买火车票,飞机票),买到票(什么时候),回来给你)

2.2可靠性测试(我去买票过程中被撞死了,票买不到怎么办,延期了,买那个点的票没了怎么办让我帮他买票的人的身份,比如是否有特殊优待,如军人,1米2以下儿童等,身份证丢了,或者票丢了,责任划分)

2.3可维护性测试(票是否可保存完好)

2.4兼容性(还不同人的去买,我中间招人去买,我坐车走路)

2.5算法测试(我通过不同的渠道买票花费的时间)

2.6竞品测试(别的人怎么买的票)

2.7安全性测试(身份信息保密)

2.8性能测试(一个身份证买多张票,同时多张身份证买多张票)

二.工作测试流程:

(一).功能测试流程

1.需求评审(重点,你发挥的作用是什么,需求可执行性,关联影响的功能模块,异常情况处理)

2.评估测试时间(测试计划)

3.测试用例设计(正交,边界值,等价类。。)

4.用例review(领导,开发,产品)

5.提测(确认开发进行过自测,功能主流程畅通,然后开始介入测试)(产品开发测试一块走流程)

6.codediff(代码改动点,从根源发现开发的问题,代码中明显测试代码(return,写死值),

公共静态变量在发生高并发时容易出问题,所以不能让这个变量的值去内存里面取)

7.执行用例

8.提bug(jira)

9.回归测试

10.确认测试(准生产环境确认)(分情况)

11.发布(线上回归))

12.BUG review(总结问题)

注意点:

发布测试来控制,测试环境部署测试来控制

发布过程中,开发运维做监控。(分批发布)

三.app专项测试:

1.CPU,内存,流量,电量,弱网,兼容性,FPS,中断,安装,稳定性

   怎么自动化实现,写一些自动化框架方法封装起来,重复的使用

2.冷热启动的区别

冷启动:在个人电脑中,冷启动是切断电源后重新启动。App类似,就是完全退出(不在后台运行)后重启启动。

热启动:非冷启动情况都可以称为热启动。热启动比冷启动多了一个触发点,那就是在后台启动App,比如双击苹果的HOME键,进行App的热启动。同时热启动通常会有一个计时器,特别是一些理财和银行的类的App会做此处理,当你间隔一段时间触发了热启动后,会让你再次登录(通过密码/手势/指纹)。也有比如网易新闻客户端这样的,当你间隔一段时间后触发热启动,会弹出广告页。

四.工具使用:

postman:接口,功能测试,可以做参数化

httprequester:接口,功能测试

jemter:接口功能性能工具

lr:接口功能性能

fiddler:抓包,设置代理,设置断点,mock数据

charles:抓包,设置代理,设置断点,mock数据

robot:功能自动化

uft(qtp):功能自动化

docker:容器

monkey:性能稳定性(app)

jenkins:自动持续集成

git,svn:代码管理

xmind/visio:脑图

soapUI:接口功能测试(HTTP,WEBSERVICE协议)

xshell/SecureCRT/putty:

slor:关键字分词

slor:我测试:我   测试分别去数据库搜索结果

nginx(反向代理)

tomcat(动态网页发布)

五.基础概念:

1.什么是性能测试

性能测试是指被测系统,在一定的负载下运行,监控系统的各项指标,是否符合需求(指标,指的CPU,内存,事务响应时间,等)如果不符合,就发现了系统的性能瓶颈

性能测试的目的?

识别系统的弱点,评估系统能力,发现系统性能瓶颈,提高系统可靠性能和稳定性

2.HTTP协议(哪些方法,什么区别(GET\POST),怎么组成,状态码)

HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

基于TCP/IP协议栈来传递数据

应用层

哪些方法

1.GET:GET可以说是最常见的,它本质就是发送一个请求来获取服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等等)返回给客户端。GET请求中不会包含呈现数据。

2.HEAD:HEAD和GET本质一样,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但是这里使用HEAD则意义更加明确。

3.PUT:PUT和POST极为相似,都是像服务器发送数据,但他们之间有一个重要的区别,PUT通常指定了资源的存放位置,而POST没有,POST的数据存放位置由服务器自己决定。

4.DELETE:删除某一个资源。

5.POST:向服务器提交数据。这个方法用途广泛,几乎所有的提交操作都是靠这个完成。

6.OPTIONS:它用于获取当前URL所支持的方法,若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET,POST”。

以上六种方法,我们可以跟数据库的CRUD增删改查操作对应起来:CREATE:PUT     RETRIEVE:GET    UPDATE:POST   DELETE:DELETE

什么区别(GET\POST)

GET /books/?sex=man&name=Professional HTTP/1.1

Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

Gecko/20050225 Firefox/1.0.1

Connection: Keep-Alive

注意最后一行是空行

POST / HTTP/1.1

Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

Gecko/20050225 Firefox/1.0.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 40

Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

1)GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),如果数据是英文字母/数字,原样发送;如果是空格,转换为+;如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据。

因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变。

2)传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。而在实际开发中存在的限制主要有:

GET:特定浏览器和服务器对URL长度有限制.

POST:由于不是通过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

3)安全性: POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为 (1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。

4)GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

注:HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全

TCP三次握手四次离手

线程,进程区别联系

1.定义

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

2.关系

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

3.区别

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

4.优缺点

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

内存泄露,内存溢出

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

死锁

六.自动化测试:

自动化测试脚本的应用场景:

1.重复性较多的,写脚本能省时间,节省效率,

接口重复回归,功能重复回归

2.手动做不了的测试

上万数据的准确性校验,脚本跑,错误数据筛选出来

数据更新机制的调整,全量变成增量更新()

自动化框架的搭建:

接口自动化框架

1.结构(1.框架思想(数据,关键字,行为,事件,混合)

2.读取用例的模块(excel,txt,mysql,xml)

3.发请求的模块(requests封装)

4.断言模块(re,遍历断言)

5.日志模块

6.测试报告生成模块

7.发邮件模块

8.配置文件)

2.怎么设计测试用例,注意哪些点()

3.怎么断言

功能自动化框架

1.和接口自动化类似

2.对页面各个控件的api封装(哪些封装,下拉框,选择框,对隐形控件怎么处理)

3.不同环境处理

4.xpath定位方法()

5.js定位方法()

平台工具:

1.接口自动化集成到平台上;

2.平台做测试环境,线上环境的监控

3.做公用统计线上badcase的统计

七.算法:

(会多门语言(前端了解。java熟练,python熟练))

排序算法:

冒泡

快排

package main;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
    	Scanner in=new Scanner(System.in);
    	String str=in.nextLine().toString();
    	in.close();
    	String[] arr=str.split(",");
    	int[] nums=new int[arr.length];
    	for(int i=0;i<nums.length;i++) {
    		nums[i]=Integer.parseInt(arr[i]);
    	}
        sort(nums,0,nums.length-1);
        for(int i=0;i<nums.length;i++)
        	System.out.println(nums[i]);
    }
    public static int[] sort(int[] nums,int start,int end) {
    	if(start>=end)
    		return nums;
    	int i=start+1,j=end;
    	while(i<j) {
    		while(nums[j]>=nums[start]&&i<j)
    			j--;
    		if(j==i)
    			break;
    		while(nums[i]<nums[start]&&i<j)
    			i++;
    		if(i<j)
    			swap(nums,i,j);
    	}
    	swap(nums,start,j);
    	sort(nums,start,j-1);
    	sort(nums,j+1,end);
		return nums;
    }
    public static int[] swap(int[] nums,int a,int b) {
    	int temp=nums[a];
    	nums[a]=nums[b];
    	nums[b]=temp;
    	return nums;
    }
}

查找算法:

二分查找

/**
 * 二分查找,找到该值在数组中的下标,否则为-1
 */
static int binarySerach(int[] array, int key) {
    int left = 0;
    int right = array.length - 1;

    // 这里必须是 <=
    while (left <= right) {
        int mid = (left + right) / 2;
        if (array[mid] == key) {
            return mid;
        }
        else if (array[mid] < key) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }

    return -1;
}

队列,堆,栈实现:

八.linux:

常用命令背下来,熟悉,知道怎么用

ls -alih()

看日志(cat,head,tail,more)

grep|wc -l

九.数据库:

关系型数据库:

mangodb

mysql(sql,慢查询,配置)

oracal

GP数据库

非关系型数据库:

redis

十.服务架构:

服务分布式架构(超融合):概念实现理解

十一.网络

IP

网关

路由

根据子网掩码算网关

NAT

VPN

交换机配置

十二.典型例题

(一).Web页面出现空白页怎么定位问题

1.抓包(抓包)

2.看服务日志

3.看你当前url 用接口实际访问模拟下请求

4.mock数据,给请求,确认是那部分问题

(二).Web页面响应过慢怎么定位问题

从一个浏览器输入url到形成页面经历了什么

(三).你所测试的系统架构
 

猜你喜欢

转载自blog.csdn.net/cowboy0226/article/details/89532086