目录

Interview:编程思想

编程思想

数据结构

  • 平衡二叉树 待补充

  • 排序算法(待补充)

    • 归并排序
    • 冒泡排序
  • B+树 数据结构

    • 待补充
  • 红黑树 数据结构

    • 待补充

测试设计

  • 传入不同的值会有什么不同的测试效果(数据存储的空间不一样,存在预制的数据)

  • 测试用例设计方法

    • 因果图、等价类、边界值、场景法
测试设计 怎么保证不漏测,版本高质量
从源头出发
播放器测试设计
  • 样式
  • 功能
  • 性能
  • 安全性
  • 可靠性
三角形测试设计

五分钟,简洁,全面用例

  • 确认需求的完备性
  • 测试设计 微信传送功能测试用例设计的思路/测试方案

  • 用例设计:淘宝购买产品页面

    • 首先从功能、展示上面出发,然后延展到性能、安全、易用性、可移植性、可靠性、可复制性上从容考虑
登录界面(含验证码)测试设计

五分钟,简洁,全面用例

  • 确认需求的完备性

  • 登录界面(含验证码)测试设计

    • 含有多少条测试用例(30+)

      • 账户(5条)

        • 字符长度

          • 0
          • 正常
          • 上限
          • 超过上限
        • sql注入

          • abc or ‘1’ ='1’;
      • 密码(5条)

        • 同账户
      • 验证码(5条)

        • 同账户
      • 账户、密码、验证码 正误排列组合(8条)

        • 2 x 2 x 2
      • 跳转

      • 跳转拦截

      • 性能

        • 可靠性(服务器性能注入)

          • 内存
          • CPU
          • 磁盘
          • 弱网
        • 并发场景

语音聊天功能
  • 测试设计 语音聊天功能
取款机取款功能
  • 远程有钱与否
  • 取款机有钱与否
  • 数据传递过程
  • 数据校验
点赞失败会是哪些原因导致的
  • 页面
  • 信息传递
  • 反向代理
  • 路由规则
  • 服务依赖
  • 消息传递
  • 页面展示

脚本编写

脚本过程中有没有遇到什么问题
自动化用例生成脚本细节
  • 自动化用例生成脚本细节
首先抓包,导出为HAR文件,然后对数据进行解析,然后生成对应的数据格式的文件,然后再把这些文件做格式化处理(对异常的参数校验做自动化生成的操作)
  • 分享

    • 最开始怎么测试
    • 后来怎么测试
    • 使用Python自动化框架
    • RF推动后反馈慢、服务多、任务重、不好管理、难以追溯
    • 测试工具编写
    • 测试用例自动生成
  • 怎么保证覆盖度

  • 怎么度量接口覆盖率

  • 关键字底层封装有哪些注意点

    • 关键字底层封装有哪些注意点(error 统一返回,考虑复用性函数封装)
脚本过程中有没有遇到什么问题
  • 操作JIRA脚本实现机制/定期从JIRA上获取数据,在钉钉群进行通知

    • 提供接口,调用JIRA接口,上传数据
处理多层json信息
  • 处理多层json信息

web开发(对html不是太熟悉,没有做太深的研究?)
  • web开发(对html不是太熟悉,没有做太深的研究?)
测试工具开发细节
  • 测试工具开发细节
埋点服务测试细节
  • 埋点服务测试细节

脚本过程中有没有遇到什么问题
  • shell脚本遍历文件夹下所有文件

    • find . -name ‘.java
    • function getdir(){
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
for element in `ls $1`

do

dir_or_file=$1"/"$element

if [ -d $dir_or_file ]

then

getdir $dir_or_file

else

echo $dir_or_file   

fi

done

}



root_dir="/home/"

getdir $root_dir

服务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最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。