Interview:编程思想
编程思想
数据结构
-
平衡二叉树 待补充
-
排序算法(待补充)
- 归并排序
- 冒泡排序
-
B+树 数据结构
- 待补充
-
红黑树 数据结构
- 待补充
测试设计
-
传入不同的值会有什么不同的测试效果(数据存储的空间不一样,存在预制的数据)
-
测试用例设计方法
- 因果图、等价类、边界值、场景法
- 样式
- 功能
- 性能
- 安全性
- 可靠性
五分钟,简洁,全面用例
- 确认需求的完备性
-
测试设计 微信传送功能测试用例设计的思路/测试方案
-
用例设计:淘宝购买产品页面
- 首先从功能、展示上面出发,然后延展到性能、安全、易用性、可移植性、可靠性、可复制性上从容考虑
五分钟,简洁,全面用例
-
确认需求的完备性
-
登录界面(含验证码)测试设计
-
含有多少条测试用例(30+)
-
账户(5条)
-
字符长度
- 0
- 正常
- 上限
- 超过上限
-
sql注入
- abc or ‘1’ ='1’;
-
-
密码(5条)
- 同账户
-
验证码(5条)
- 同账户
-
账户、密码、验证码 正误排列组合(8条)
- 2 x 2 x 2
-
跳转
-
跳转拦截
-
性能
-
可靠性(服务器性能注入)
- 内存
- CPU
- 磁盘
- 弱网
-
并发场景
-
-
-
- 测试设计 语音聊天功能
- 远程有钱与否
- 取款机有钱与否
- 数据传递过程
- 数据校验
- 页面
- 信息传递
- 反向代理
- 路由规则
- 服务依赖
- 消息传递
- 页面展示
脚本编写
- 自动化用例生成脚本细节
-
分享
- 最开始怎么测试
- 后来怎么测试
- 使用Python自动化框架
- RF推动后反馈慢、服务多、任务重、不好管理、难以追溯
- 测试工具编写
- 测试用例自动生成
-
怎么保证覆盖度
-
怎么度量接口覆盖率
-
关键字底层封装有哪些注意点
- 关键字底层封装有哪些注意点(error 统一返回,考虑复用性函数封装)
-
操作JIRA脚本实现机制/定期从JIRA上获取数据,在钉钉群进行通知
- 提供接口,调用JIRA接口,上传数据
- 处理多层json信息
- web开发(对html不是太熟悉,没有做太深的研究?)
- 测试工具开发细节
- 埋点服务测试细节
-
shell脚本遍历文件夹下所有文件
- find . -name ‘.java’
- function getdir(){
|
|
服务mock
-
每一层均使用 mock 框架屏蔽下层的具体实现
-
服务mock细节
-
mock服务化
- 集群内部部署Yapi
-
接口级别
- flask框架直接实现
-
函数级别
-
对应的类库实现
-
Python
- mock库
-
Golang
- httptest(原生库)
- gomock
-
-
Python 特性
-
Python 语法
-
异常处理Python
- try…except…finally(最后这个步骤不管发生什么都执行)
-
Python 装饰器
- 闭包,将一个未执行的函数返回,主线程可以选择执行或者不执行,可以无侵入的添加代码逻辑。
-
Python 私有变量(不存在真正的私有变量/用下划线来标记这是私有变量)
-
-
Python 运行机制
-
Python 协程
-
Python内存回收策略
-
引用计数
- 引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用时其引用计数增加1,当其不再被引用时引用计数减1,当引用计数等于0的时候,对象就被删除了。
-
垃圾回收
-
内存池
-
python内有个定时器,定期的会刷新,如果发现内存中数据被引用了,就会被回收,这个就是内存的回收机制
-
何时回收
-
通过gc模块的get_threshold()方法,查看该阈值:
- import gc
-
print(gc.get_threshold())
-
返回(700, 10, 10),后面的两个10是与分代回收相关的阈值,后面可以看到。700即是垃圾回收启动的阈值。阈值可以通过gc中的set_threshold()方法重新设置。
-
手动启动垃圾回收
-
gc.collect()
-
-
-
-
-
-
Python 数据结构
-
列表、元组、字典、set、栈、队列(先进先出-queue)
-
Python tuple、list区别
- 前者不能修改变更
-
-
python 包
- xlrd、copy、requests、os、time、sys、log、json、importlib、base64、collection、testlink、re、matplotlib
- socket的使用,链接的建立主要有哪几个步骤
- Python init.py 的作用 –> 声明这是一个包
- 对pyunit源码的理解
Java特性
- ArrayList与linkedlist异同,时间复杂度
Golang特性
-
make 和new 的区别
-
new
- 即内建函数 new 用来分配内存,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针
- new和其他语言中的同名函数一样:
- new(t)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*t类型的值。
- 它并不初始化内存,只是将其置零。*t指向的内容的值为零(zero value)。注意并不是指针为零。
-
make
- 即内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型,
- make(t, args)与new(t)的功能区别是,make只能创建slice、map和channel,,并且返回一个初始化的(而不是置零),类型为t的值(而不是*t)。
-
-
defer 退出机制
- 先进后出
-
go pprof
-
内置获取程序获取运行数据
-
runtime/pprof
- 采集工具型应用运行数据进行分析
-
net/http/pprof
- 采集服务型应用运行时数据进行分析
-
信息收集策略收集
- 每隔一段时间(10ms)就会收集下当前的堆栈信息获取格格函数占用的CPU以及内存资源;最后通过对这些采样数据进行分析,形成一个性能分析报告。
-
-
使用方法
-
CPU
-
开启CPU性能分析
- pprof.StartCPUProfile(w io.Writer)
-
停止CPU性能分析
- pprof.StopCPUProfile()
-
应用执行结束后,就会生成一个文件
- go tool pprof工具进行CPU性能分析。
-
-
内存
-
记录程序的堆栈信息
- pprof.WriteHeapProfile(w io.Writer)
-
得到采样数据之后,使用go tool pprof工具进行内存性能分析。
-
-
-
go-torch
- 火焰图
-
-
golang能不能实现泛型
-
go 函数命令 不同协程之间数据怎么传递
- chan
代码设计
-
Python 统计第一个至出现一次的字符
-
最近写代码时间,需求,代码行数 –> 7个文件,300行以上
- RF自动生成自动化用例工具,1000行+
-
手写代码(五个一排少两个,…,十七个一排少十四个)while ..:for …if .. a++
-
Python tail命令?没反应过来是什么,不是telnet
-
单例模式使用场景
- 单例对象的类必须保证只有一个实例存在。
-
手写代码:复制一个每个节点都有随机指针的单链表
-
Python 怎么获取最新的报告
- os.path.getmtime,sort,key排序
-
Python 怎么打出信息全面的日志
-
Python 99乘法口诀表
- for i in range(10):
-
for j in range(1, i+1):
-
print(f"{j} + {i} = {j + i} ", end="")
-
print()
-
深浅拷贝
- 深拷贝的是复制对象
- 浅拷贝是直接指定内存地址
- 补充:Python的赋值语句针对不同的数据类型,使用的不同的赋值策略
-
1000瓶毒药
-
tcp/ip的python实现(socket编程)
-
回文数列表/列表中字符串回文数
-
go 和C++ 的区别(优缺点比较)
-
程序设计:【2、9、5、6、3】 找出哪两个元素能相加等于8
-
算法 针对自己写的函数进行测试(二叉树查找)
-
求一个数的最大约数
- 有什么优化的方案
-
算法:偶数位升序、奇数位降序,什么方法最快,代码复杂度多少
-
读取日志,获取日志级别,并打印行数
-
进行测试设计
- 从输入文件
- 文件大小
- 中断断点续传
-
-
怎么进行数据分析?
-
统计第一个只出现一次的字符
-
阿里笔试题
- 待补充
-
一个列表中又一个元素出现了两次,每个元素只能访问一次,怎么找出这个元素
- 如果是有序的话,直接遍历一次就能找出
系统运行
-
线程、进程、协程区别
-
进程
- 优点:( 程序)相对比较稳定安全(进程拥有独立的系统资源,进程间不容易相互影响)
- 缺点:进程切换的时空开销比较大(涉及到很多系统资源的切换)
- 缺点:进程间通信(IPC)较为复杂和耗时
-
线程
- 线程包含在进程中,也叫轻量级进程。线程是进程中一个单一顺序的控制流,像“线”一样(或许是其译名的由来),它是系统进行运算调度(即如何分配CPU去执行不同任务)的基本单位,一个进程的多个线程在执行不同任务的同时共享进程的系统资源(如虚拟地址空间,文件描述符等)
- 线程切换的开销比进程切换的开销小,减少了任务切换的消耗,提高了操作系统的并发性能。
- 相比进程不够稳定,多线程在操作共享数据时容易出错(比如丢失数据、产生死锁)
-
协程
- 协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显,在处理大规模并发连接(IO密集型任务)时,协程要优于线程。
- 协程不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好了。
-
利用多核CPU最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
-