答案对错自辨,文明观看,有错给我说我改
1.白盒测试/黑盒测试
1.1白盒测试
- 测试程序的内部的逻辑,结构的实现,是否实现了相应的功能。
- 单元测试:Junit框架
- 语句覆盖
- 逻辑覆盖(判定覆盖,条件覆盖,判定组合,条件组合,判定和条件组合)
- 路径覆盖
- 循环覆盖
1.2黑盒测试
- 不关心软件内部代码的逻辑,结构实现,只关心输入和输出
- 等价类划分法,边界值分析法 ,因果图法,正交实验法,场景设计法,错误推测法
2.测试流程
- 第一种答案:1、测试需求分析阶段;2、测试计划阶段;3、测试设计阶段;4、测试执行阶段;5、测试评估阶段。
- 第二种答案::单元测试、集成测试、确认测试、系统测试、验收测试
3.bug流程
-
1.测试人员发现bug
-
2.描述bug
测试版本
测试环境(设备,系统)
测试步骤
测试数据
预期结果
实际结果
附件(错误截图,错误日志)
测试方案, -
3.开发人员确认是否是bug,是的话修改bug,并改bug状态为已经解决
-
4.不是的话 ,退回给测试人员并描述退回原因,或为设计如此,或为外部原因,或者不能重现。
-
5、 开发人员修改完成的bug,由测试人员进行验证,确认修改正确,关闭bug。
-
6、 验证未通过的bug重新激活,开发人员继续修改,直至验证通过,关闭bug。
-
7、 测试人员需要对开发人员退回的bug进行确认。
-
8、 确认不是bug关闭。
-
9、 如与开发人员意见不一致,认为是bug,需提交项目负责人仲裁。
-
10、项目负责人确认是bug由开发人员修改,不是bug由测试人员关闭。
参考: bug流程处理
4.压力测试
源于:性能与压力测试
响应时间
tps(HTTP per second)
吞吐量
系统运行时占用的系统资源的情况
5.selenium原理
2.selenium原理(3个)
1.测试脚本:python,java编写脚本程序
2.浏览器驱动:不同的驱动对应不同的版本
3.浏览器:IE,Firefox,Chrome,Safari
参考自此处
6.选取元素方法
定位元素的方式
1.id
2.name
3.class-name
4.tag-name
5.link-text
6.partial link text
7.xpath
8.css selector
7. servlet生命周期
1、初始化阶段 , 调用init()方法; 2、响应客户请求阶段, 调用service()方法; 3、终止阶段, 调用destroy()方法。
8. Java线程池
(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
(3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
参考此处
9.状态码
1**:请求正在处理
2**:请求成功
200:请求正在处理
204:请求处理成功,但没有任何资源返回给客户端,常用于单向通信
206: 请求成功,响应报文中包含由 Content-Range 指定范围的实体内容
3**:重定向,需要附加操作已完成请求
301:永久重定向,表示请求的资源已经永久的搬到了其他位置
302:临时重定向,表示请求的资源临时搬到了其他位置
303表示请求资源存在另一个URI,应使用GET定向获取请求资源
303功能与302一样,区别只是303明确客户端应该使用GET访问
304:资源已找到,但不满足条件
4**:客户端错误
400:请求存在语法或者参数错误,服务器不理解
403:对请求资源的访问被禁止
404:服务器找不多请求的资源
5**:服务器错误
500:服务器执行请求的时候出错
503:服务器无法处理请求,服务器正在维护或者超负载运行。
源自: 面试问题:常见的http状态码
10.抽象类/接口
一、继承(抽象类/普通类)类与实现接口的区别
1、继承抽象类,必须重写抽象类中所有抽象方法。
2、继承普通类,可以重写也可以不重写父类的方法。
3、实现接口则必须实现接口中的所有方法。(接口中的方法均为抽象方法)。
二、抽象类、接口的区别
1、类要被子类继承,接口要被子类实现。
2、接口里不能定义普通变量,而抽象类中可以,接口只能定义公共的静态常量。
3、抽象类里可以没有抽象方法,可以有普通方法,就算全是普通方法也没关系。
4、普通类和抽象类(它的实例化方式并不是通过普通的new方式来创建对象,而是通过父类的应用来指向子类的实例间接地实现父类的实例化,因为子类在实例化之前,一定会先实例化它的父类。)可以实例化,接口不可以实例化。
原文链接: 原文链接
11.sql查询id重复的人
select * from [表A] where id in (select id from [表A] group by id having count(id) >1 )
12.单例模式
13.1定义
- 是一种设计模式,在代码中有些对象应该只有一个实例,就称为“单例”
- eg:数据库的DataSource应该就是一个单例
- 有些负责加载数据到内存的类也应该是单例
- 强制性某个类只有一个实例
13.2实现
- 主要依托于static关键字,静态成员
13.2.1饿汉模式
/**
* User:yang
*/
public class ThreadDemo16 {
//饿汉模式
//实例创建出现在类加载阶段
static class Singleton {
//希望是单例类,只有一个实例
//县创建一个成员,保存唯一的实例
private static Singleton instanse = new Singleton();
//在提供方法获取实例
public static Singleton getInstance() {
return instanse;
}
//把构造方法私有,防止其他代码创建实例
private Singleton() {
}
}
public static void main(String[] args) {
//如何获取这个实力
Singleton singleton=Singleton.getInstance();
}
}
13.2.2懒汉模式
/**
* User:yang
*/
public class ThreadDemo17 {
//懒汉模式
//创建实例是在第一次使用getinstance的时候,比饿汉模式迟
static class Singleton {
private static Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
private Singleton() {
}
}
public static void main(String[] args) {
Singleton singleton=Singleton.getInstance();
}
}
13.3如何保证懒汉模式线程安全
- 加锁
- 以效率为代价保证安全
/**
* User:yang
*/
public class ThreadDemo18 {
//线程安全版本懒汉模式
//创建实例是在第一次使用getinstance的时候,比饿汉模式迟
static class Singleton {
private static Singleton instance = null;
public static Singleton getInstance() {
synchronized (Singleton.class){
if (instance == null) {
instance = new Singleton();
}
}
return instance;
}
private Singleton() {
}
}
public static void main(String[] args) {
Singleton singleton=Singleton.getInstance();
}
}
- 优化,当已经创建实例后,不进入加锁,并且volatile防止寄存器优化
/**
* User:yang
*/
public class ThreadDemo18 {
//线程安全版本懒汉模式
//创建实例是在第一次使用getinstance的时候,比饿汉模式迟
static class Singleton {
private static Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
private Singleton() {
}
}
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
}
}
14.你了解的测试
软件测试就是验证软件是否满足客户的需求
15.求学生总数
select count(studentid) from t_student;
16Linux,常用指令
看这个:linux
17.hashmap的结构
HashMap
hashmap是非线程安全的,多线程下可以用concurrentHashmap或者Collections.synchronized()来代替。
首先两种数据结构
数组:存储区间连续,占用内存严重,寻址容易,插入删除困难;
链表:存储区间离散,占用内存比较宽松,寻址困难,插入删除容易;
HashTable
hashtable的数据结构和hashmap几乎相同
hashtable和hashmap的主要区别是
1.hashtable线程安全,内部的相关读写操作添加了锁
hashmap非线程安全。
2.hashtable不允许key为空值,当key为空时,会抛出空指针
hashmap允许一个为空的key,放在index为0的位置
3.迭代器不一样。
fail-fast迭代器:如果有其它线程对集合进行的添加/删除元素,将会立刻抛出ConcurrentModificationException.
HashMap的迭代器(Iterator)是fail-fast迭代器,Hashtable的迭代器(enumerator)不是fail-fast的。
4.hashtable初始容量11,扩容因子0.75
HashSet
作为Set集合的一种,首先是无序的,不可重复的;
允许存放null值;
底层封装HashMap;
实现是不同步的,线程不安全;
hashset底层封装了hashmap,将值c存放在hashmap的key中,hashset的add方法底层调用了hashmap的put,而判断key是否相同,是通过hashcode和equals方法,所以如果hashset中想要存放object并且不重复的话,需要重写hashcode和equals方法。
原文链接:HashMap和HashTable和HashSet的理解
18.treemap的key值是否可以为空
put(key,value): 注意key不能为空,但是value可以为空
key如果为空,会抛出空指针异常
19. 怎么启动一个线程
线程.start
20. 实现多线程有哪几种方式,继承Thread类和实现runnable接口有什么区别
21.创建线程的方法
- 1.继承自Thread,重写run方法,
/**
* User:yang
*/
class MyThread extends Thread{
@Override
public void run() {
//线程要执行的代码
while (true){
System.out.println("这是新线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
System.out.println("hello world");
MyThread myThread=new MyThread();
myThread.start();
while(true){
System.out.println("这是主线程");
Thread.sleep(1000);
}
}
}
- 2.实现runnable接口,把runnable接口的实例赋值给Thread
import java.util.TreeMap;
/**
* User:yang
*/
class MyTask implements Runnable{
@Override
public void run() {
while (true){
System.out.println("hello");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadDemo2 {
public static void main(String[] args) {
Runnable myTask=new MyTask();
Thread t=new Thread(myTask);
t.start();
}
}
- 3.匿名内部类(thread)
Thread t2=new Thread(){
@Override
public void run() {
long b=0;
for (long i = 0; i <count ; i++) {
b++;
}
}
};
- 4.匿名内部类(runnable)
public static void main(String[] args) {
Thread t=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
});
t.start();
}
- 5.使用lambda表达式创建线程
public static void main(String[] args) {
Thread t=new Thread(()->{
System.out.println("hello");
});
t.start();
}
22.自己测试怎么考虑设计测试用例
23.对测开的理解
参考这个测试开发
24.知道哪些测试工具
Selenium(自动化测试),禅道(管理),loadrunner(性能),fidder(抓包), postman(接口测试)
25.postman怎么用的,用过哪些功能
26.对自动化测试的了解
27什么样的情况适合做web自动化测试,什么时候不适合
功能成熟(产品稳定,功能稳定)
周期长
可测性强(人工干预的多不多)
参考自动化测试
28需求临上线发现个bug,开发说不要紧,怎么办
让开发人员发邮件,说明情况,邮件抄送开发领导,测试领导,产品经理
等待领导层处理
因为对于你和开发你们并不能非常绝对的判断bug严不严重,所以一定要和领导去沟通。
29. 怎么生成测试报告
30HTML报告
- 总结分析测试用例执行的过程那些成功,那些事败,并分析失败原因,记录结果。
import HTMLTestRunner
import os
import sys
import time
import unittest
def createsuite():
discovers = unittest.defaultTestLoader.discover("../src0811", pattern="testbaidu*.py", top_level_dir=None)
print(discovers)
return discovers
if __name__ == "__main__":
# 1,创建一个文件夹
# 当前的路径
curpath = sys.path[0]
# sys.path 是一个路径集合数组
print(sys.path)
print(sys.path[0])
# 当前路径下resultreport文件夹不存在的时候,就创建一个
if not os.path.exists(curpath + '/resultreport'):
os.makedirs(curpath + '/resultreport')
# 2,解决重复命名的问题
now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
print(time.time())
print(time.localtime(time.time()))
# 文件名是路径加上文件的名称
# 准备HTML报告输出的文件
filename = curpath + '/resultreport/' + now + 'resultreport.html'
# 打开 HTML 文件, wb 以写的方式
with open(filename, 'wb') as fp:
# 括号里的参数是 HTML 报告里面的参数
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"测试报告",
description=u"用例执行情况", verbosity=2)
suite = createsuite()
runner.run(suite)
31输入url到显示页面的过程
参考:从输入URL到浏览器显示页面发生了什么
32.postman接口测试,调用接口权限之前如何进行身份认证
什么是token
token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。 ‘
’参考token
33. 测试工程师具备哪些能力
- 思维灵敏,细心,耐心,好奇心,不浮躁,善于怀疑
批判性思维:清楚–准确、切题–深刻,有意义,有逻辑性–公正、全面
,快速学习能力,沟通能力,文字表达能力,开发能力,责任感和压力
34.1个客户端500个用户,500个客户端500个用户,客户端同时对服务器施压,有什么区别?
35.场景题:携程10月1日9:30上线一个跟团游秒杀活动,10点活动截至,测试重点是什么(性能测试,服务器能否承载预估的人流量)
36手撕:输出字典
37.手撕:冒泡或快排
交换排序(冒泡排序,快速排序)
38.JAVA三大特性
39序 选择排序
40.强引用弱引用
40.软件质量怎么把关
1、在软件开发中,可以采用以下措施保证软件的质量;
2、审查。在生命周期每个阶段结束之前,都要使用标准对该阶段生产的软件配置进行严格的技术审查;
3、复查和管理复审。复查是检查已有的材料,以断定某阶段的工作是否能够开始或继续;管理复审是向开发组织或使用部门的管理人员,提供有关项目的总体状况、成本和进度等方面的情况,以便他们从管理角度对开发工作进行审查。
4、测试。通过测试计划、测试过程与测试结果对软件质量进行保证;
5、软件质量保证活动。以上各项活动内容都须写入质量保证计划,并由质量保证小组监督实施。由此可见,质量保证既是技术活动,也是管理活动;
6、软件评审。评审是以提高软件质量为目的的技术活动。要通过对软件的规格说明、可靠性、性能实现、可修改性、可扩充性、可移植性、可测试性、可复用性以及评审的实施等方面对软件项目做好严格的评审,以确保软件质量;
7、采用质量保证标准。质量标准用于实现质量管理的组织结构、责任、规程、过程和资源。采用ISO质量保证模型。可以用于质量计划、质量控制、质量保证和质量改经所需的组织结构、规程、过程和资源;
8、结构化的软件测试。经过严格的软件测试,尽可能找出软件计划、总体设计、详细设计、软件编码的错误,并加以纠正,才能提高软件的质量。测试要覆盖整个软件的生存周期,而不限于程序的编码阶段。
9、软件维护。采用结构化维护,完整的软件配置为基础,通过完善性维护、纠错性维护、适应性维护及预防性维护提高软件质量。
来源:软件质量
41自动化测试框架
https://blog.csdn.net/weixin_45417628/article/details/119960058
42、计算机网络里有哪些协议
43.让你测一款浏览器,一周内完成任务,你如何规划测试流程
44.给你50个测试用例,时间很紧,你怎么选择浏览器版本并如何规划测试任务完成最终交付(这个问题一直在挖,疯狂的试探,整个流程一直在针对这个问题问我如何进行)
45场景题:测试微信转发消息功能
测试人员常用的测试用例——QQ、微信发消息功能通用哦!一起来展现你的智慧吧
46.题:10000以内能被自身每一位数字整除的数字
47.质数
/**
* 判断一个数是不是质数
*/
public static boolean isPrime(int number){
if(number<2){//若此数小于2,则不是质数
return false;
}
//从1-number本身循环取余计算
for(int i=1;i<number;i++){
if(number % i == 0){//余数为0,能整除
if(number == i){//是否是本身
return true;
}else if(i!=1){//是否是1
return false;
}
}
}
return true;
}
50.测试用例去冗余
51http协议有哪些方法以及作用
参考:HTTP权威指南 – HTTP协议有哪些请求方法(Method)?
52get和post的区别是什么
get,post区别
get===>url,请求长度:1024kb,可以被缓存/收藏/保留浏览记录,常用于请求查询数据,
post===>body,post不限,不可以缓存/收藏body/保留浏览记录,常用于提交数据,
相对而言,post更安全,不会在url被劫持,
querystring 是url的一部分
get、post都可以带上。
get的querystring(仅支持urlencode编码)
post的参数是放在body(支持多种编码)
53.浏览器里cookie、session和token的区别
cookie、session和token
54.mysql里有哪些锁
MySQL】MySQL有几种锁
文章来源:https://www.toymoban.com/news/detail-448765.html
55错误推测法如何理解
错误推测法文章来源地址https://www.toymoban.com/news/detail-448765.html
56 设计测试用例:页面上有一个搜索框和搜索按钮,下方是搜索结果列表展示的各个产品信息(包括预定按钮、价格、产品名称、标签等)、底部的翻页按钮(上一页、下一页、第一页、第二页…、最11后一页)
到了这里,关于一些测开面试题及答案(个人梳理)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!