一些测开面试题及答案(个人梳理)

这里写目录标题

  • 答案对错自辨,文明观看,有错给我说我改
  • 1.白盒测试/黑盒测试
    • 1.1白盒测试
    • 1.2黑盒测试
  • 2.测试流程
  • 3.bug流程
  • 4.压力测试
  • 5.selenium原理
  • 6.选取元素方法
  • 7. servlet生命周期
  • 8. Java线程池
  • 9.状态码
  • 10.抽象类/接口
  • 11.sql查询id重复的人
  • 12.单例模式
    • 13.1定义
    • 13.2实现
      • 13.2.1饿汉模式
      • 13.2.2懒汉模式
    • 13.3如何保证懒汉模式线程安全
  • 14.你了解的测试
  • 15.求学生总数
  • 16Linux,常用指令
  • 17.hashmap的结构
  • 18.treemap的key值是否可以为空
  • 19. 怎么启动一个线程
  • 20. 实现多线程有哪几种方式,继承Thread类和实现runnable接口有什么区别
  • 21.创建线程的方法
  • 22.自己测试怎么考虑设计测试用例
  • 23.对测开的理解
  • 24.知道哪些测试工具
  • 25.postman怎么用的,用过哪些功能
  • 26.对自动化测试的了解
  • 27什么样的情况适合做web自动化测试,什么时候不适合
  • 28需求临上线发现个bug,开发说不要紧,怎么办
  • 29. 怎么生成测试报告
  • 30HTML报告
  • 31输入url到显示页面的过程
  • 32.postman接口测试,调用接口权限之前如何进行身份认证
  • 33. 测试工程师具备哪些能力
  • 34.1个客户端500个用户,500个客户端500个用户,客户端同时对服务器施压,有什么区别?
  • 35.场景题:携程10月1日9:30上线一个跟团游秒杀活动,10点活动截至,测试重点是什么(性能测试,服务器能否承载预估的人流量)
  • 36手撕:输出字典
  • 37.手撕:冒泡或快排
  • 38.JAVA三大特性
  • 39序 选择排序
  • 40.强引用弱引用
  • 40.软件质量怎么把关
  • 41自动化测试框架
  • 42、计算机网络里有哪些协议
  • 43.让你测一款浏览器,一周内完成任务,你如何规划测试流程
  • 44.给你50个测试用例,时间很紧,你怎么选择浏览器版本并如何规划测试任务完成最终交付(这个问题一直在挖,疯狂的试探,整个流程一直在针对这个问题问我如何进行)
  • 45场景题:测试微信转发消息功能
  • 46.题:10000以内能被自身每一位数字整除的数字
  • 47.质数
  • 50.测试用例去冗余
  • 51http协议有哪些方法以及作用
  • 52get和post的区别是什么
  • 53.浏览器里cookie、session和token的区别
  • 54.mysql里有哪些锁
  • 55错误推测法如何理解
  • 56 设计测试用例:页面上有一个搜索框和搜索按钮,下方是搜索结果列表展示的各个产品信息(包括预定按钮、价格、产品名称、标签等)、底部的翻页按钮(上一页、下一页、第一页、第二页...、最11后一页)

答案对错自辨,文明观看,有错给我说我改

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.压力测试

一些测开面试题及答案(个人梳理)_第1张图片
一些测开面试题及答案(个人梳理)_第2张图片
一些测开面试题及答案(个人梳理)_第3张图片
源于:性能与压力测试

响应时间
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.强引用弱引用

一些测开面试题及答案(个人梳理)_第4张图片

40.软件质量怎么把关

1、在软件开发中,可以采用以下措施保证软件的质量;

2、审查。在生命周期每个阶段结束之前,都要使用标准对该阶段生产的软件配置进行严格的技术审查;

3、复查和管理复审。复查是检查已有的材料,以断定某阶段的工作是否能够开始或继续;管理复审是向开发组织或使用部门的管理人员,提供有关项目的总体状况、成本和进度等方面的情况,以便他们从管理角度对开发工作进行审查。

4、测试。通过测试计划、测试过程与测试结果对软件质量进行保证;

5、软件质量保证活动。以上各项活动内容都须写入质量保证计划,并由质量保证小组监督实施。由此可见,质量保证既是技术活动,也是管理活动;

6、软件评审。评审是以提高软件质量为目的的技术活动。要通过对软件的规格说明、可靠性、性能实现、可修改性、可扩充性、可移植性、可测试性、可复用性以及评审的实施等方面对软件项目做好严格的评审,以确保软件质量;

7、采用质量保证标准。质量标准用于实现质量管理的组织结构、责任、规程、过程和资源。采用ISO质量保证模型。可以用于质量计划、质量控制、质量保证和质量改经所需的组织结构、规程、过程和资源;

8、结构化的软件测试。经过严格的软件测试,尽可能找出软件计划、总体设计、详细设计、软件编码的错误,并加以纠正,才能提高软件的质量。测试要覆盖整个软件的生存周期,而不限于程序的编码阶段。

9、软件维护。采用结构化维护,完整的软件配置为基础,通过完善性维护、纠错性维护、适应性维护及预防性维护提高软件质量。

来源:软件质量

41自动化测试框架

https://blog.csdn.net/weixin_45417628/article/details/119960058

42、计算机网络里有哪些协议

一些测开面试题及答案(个人梳理)_第5张图片

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有几种锁

55错误推测法如何理解

错误推测法

56 设计测试用例:页面上有一个搜索框和搜索按钮,下方是搜索结果列表展示的各个产品信息(包括预定按钮、价格、产品名称、标签等)、底部的翻页按钮(上一页、下一页、第一页、第二页…、最11后一页)

你可能感兴趣的:(面试题梳理,单元测试,java,面试)