字节日常实习测试开发一面复盘
面试题目:https://www.nowcoder.com/discuss/452780062417457152
1)自我介绍
简单介绍了一分钟,只有基本信息和项目的名称和选择测开岗位的原因.
2)了解一下基本情况,目前所在地,能实习几个月。。。
字节希望能实习至少六个月, 我说大约五六个月
3)介绍简历中的第一个项目
问的比较细致,大概十分钟,有时候可能不知道面试官到底想问的是什么点u
4)测试的基础理论了解程度
回答:知道一些简单的理论知识,比如黑盒测试当中的等价类划分、边界值分析,白盒测试的静态源码分析。
又问给一个实际案例能用这些方法写出测试值吗,回答了不能哈哈哈哈哈
【在此总结一下软件测试相关知识点吧】
见帖子:https://www.nowcoder.com/discuss/454219091373518848?sourceSSR=users
5)在浏览器输入一个网址后会发生什么
回答:域名解析,建立HTTP/HTTPS连接等等,具体流程没有完全记清楚,回答了个大概流程
又问:都设计到哪些通信协议呢?ARP协议和RARP协议?
6)了解洪泛攻击吗?原理是什么
补充回答:
( 洪泛攻击利用TCP三次握手机制,利用伪造的IP地址向被攻击端发送请求,而被攻击端发出的响应报文将永远到达不了,从而 等待连接关闭的过程资源浪费。如果有大量的连接,主机的资源将被耗尽,从而达到攻击的目的
洪泛攻击也是DOS攻击的一种)
7)一个智力题
你雇用了一个矿工,需要工作一周,报酬是一根金条。你需要每天都付给矿工报酬,也就是每天给1/7根金条,但是你只能切 两次金条,问你怎么支付。
在面试官的引导下勉强回答了出来,在1/7和3/7处各切一刀
- 主要用的开发语言
回答python,然后问了一些语法相关的内容:元组和列表的区别,python3和python2的区别,python的多线程如何实现的 (用了什么锁我记得),python如何捕获异常,深拷贝浅拷贝的区别,使用深拷贝用什么方法(deepcopy()函数),python的 内存管理(如何管理的,以及内存空间有哪些类型,堆和栈的区别,如何申请堆空间),python中闭包的概念
补充回答:
8)元组和列表的区别:
列表用[]表示,元组用()表示
列表中的数据可变,元组不可变
列表中一般存放同构元素(数据类型一致的元素),元组一般用于存放异构数据(比如 一个人的姓名,升高,体重,类似数据库的一个记录)
9)python3和python2的区别:
print函数
/除法,python2中结果是整形,python结果是浮点类型
捕获异常的语法有变化: except exc,val ---> except exc as val (except 异常类型 as 异常值, 异常值在2和3中都可以省略)
python2中不等号有两种表示方式:<> 和 !=, python 只能用!=表示\
另外还有一些模块被改名
10)python如何实现多线程:
有两种方式来创建多线程, 一种是继承threading.Thread类, 重写run方法 ,另一种是实例化threading.Thread类方法, 将线程需要执行的任务函数作为参数传入线程 (两种方法都是使用threading模块)
Thread类中常用方法:
start() 启动线程,等待cpu调度
run() 线程被cpu调度后自动执行的方法
join() 调用该方法会使主调用线程阻塞,直到被调用线程线程运行结束或超时
线程锁:
cpu在多个线程之间随机调用, 不加锁的话会造成程序结果不可预期,为了保证数据安全,需要使用线程锁,即同一时刻只允许一个线程操作(使用join方法,会让多线程变成顺序执行, 属于因噎废食的做法)
python在threading模块中定义了几种线程锁类,分别是:
Lock 互斥锁: 互斥锁是一种独占锁,同一时刻只有一个线程可以访问共享的数据
RLock 可重入锁
Semaphore 信号锁: 非互斥锁,允许一定数量的线程同时更改数据
Event 事件锁
Condition 条件锁
全局解释锁:
GIL(global interpreter Lock)使得即使在多核CPU的情况下一个时刻只能执行一个线程
python对多线程下的CPU密集型任务不够友好,对IO密集型的任务友好
为什么不能去掉GIL: 难度过大,牵扯东西过多,一直没能去除成功
因此在python中想要充分利用多核CPU,就用多进程.因为每个进程有独立的GIL,互不干扰
参考:
https://www.liujiangblog.com/course/python/79
11)数据类型转换:
可以分为两种:
隐式类型转换-自动完成 (比如int+float=float)
显示类型转换-使用类型转换函数 (比如,int(), float(), str(),list())
12)如何捕获异常
try except else语句
try{}
except 异常类型
else...
13)python内存管理
python内存管理机制有:引入计数、垃圾回收、内存池机制
在python中每个对象都有指向该对象的引用总数---引用计数
当一个对象的引用计数降为0时,该对象就要被回收
内存池机制:python中分为大内存和小内存,大内存使用malloc分配,小内存使用内存池分配
14)python内存分区:
python内存划分为五个部分:
栈:存储python的变量
堆:存储python的对象
方法区:存储python的.class 和 .function
本地方法栈:存储和操作系统相关的变量
寄存器:存储和cpu相关的变量
15)python深拷贝和浅拷贝:
浅拷贝是对引用的拷贝,仅复制地址,不开辟新的空间,使用copy.copy()或者直接赋值=
深拷贝是对对象的资源拷贝,需要开辟新的地址来存放数据,使用copy.deepcopy()
16)闭包:
概念: 在一个函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数变量,则可能产生闭包
简单来说就是:某个内部函数被当作对象返回时,夹带了这个内部函数之外的变量,这就形成了一个闭包
装饰器:
「装饰器」作为 Python 高级语言特性中的重要部分,是修改函数的一种超级便捷的方式,适当使用能够有效提高代码的可读性和可维护性,非常的便利灵活。
「装饰器」本质上就是一个函数,这个函数的特点是可以接受其它的函数当作它的参数,并将其替换成一个新的函数(即返回给另一个函数)
def first(fun): def second(): print('start') fun() print('end') print fun.__name__ return second
17)算法题:用两个栈模拟队列
见过这题,但是没实际做过哈哈哈哈哈哈,只记得大致思路
面试官耐心的提示了半天...... 最终写的也不是很满意
(面试中算法题不需要实际运行,能写出大致思路就行)
leetcode: 232. 用栈实现队列