近期面试汇总之自如篇
20190611自如面试
招聘链接:https://www.lagou.com/jobs/5283530.html?source=pl&i=pl-4
一、经过
应聘自如智能家居部门的高级测试工程师岗位,主要负责智能硬件相关测试,从面试官口中得出近阶段不会主力开展自动化相关测试,还是会以功能为主,此时心已凉凉,因为这次跳槽的一个很重要原因就是想在自动化测试上再加深入,并学习目前主流互联网公司的测试实战落地。虽然此时心里已经不太愿意,但是毕竟是第二份工作这两年来第一次正儿八经的面试,于是还是选择把能面的都面一遍。
先笔试题再face to face,共三轮面试。
- 第一轮是智能家居部门的测试leader,感觉比我还腼腆的一个小哥,问的内容:正常自我介绍、技能介绍、项目介绍、分层自动化介绍,感觉他对我的印象还不错。
- 第二轮面试是据说是他的领导,内容还是自我介绍、项目介绍、主要负责的工作、我们公司的迭代速度,印象较深的有两点:一个编程题,第二部会详细说,还有就是对我介绍的智能体育项目的硬件层面的测试做了比较多的询问,但是这块当时确实没做,所以回答的不是很好,待改进。
- 第三轮面试,时间从下午2点拖到3点,前面的人说是CTO,我以为会问一些宏观的问题,结果真正到面的时候感觉有点被动,此轮印象较深的两点:一个编程题、一个设计微信发送消息的题,感觉答的马马虎虎。
二、面试题
2.1 笔试
笔试题不算很难,如下图,主要考了三方面:
- 理论基础
- 数据库 - 还需要再复习
- Linux
- 在当前目录查找文件名包含字符串'Ziroom'的文件
正确的写法应该是:find ./ -name '*Ziroom*'
-
Nginx原理和配置文件使用
是介于客户端和服务端之间的一个东西,通过方向代理的方法,把客户端请求的分发的不同的服务器,实现负载均衡的效果
配置文件分为四部分:main - 全局设置,server - 主机设置, upstream - 负载均衡服务器设置,location - url匹配特定服务器设置
- 在当前目录查找文件名包含字符串'Ziroom'的文件
- 编程,用一个熟悉的框写一个简单的自如登录接口脚本
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Desc: A demo of ziroom login
import unittest, requesrs
Class ZiroonLogin(unittest.TestCase):
def setUp(self, username, pwd):
print('--start--')
self.url = 'http://www.ziroom.com/'
self.username = username
self.pwd = pwd
def test_login_succ(self):
payload = {
'username': self.username,
'password': self.pwd
}
resp = requests.get(url=self.url, params=payload, timeout=60).json()
self.assertEqual(resp['error code'], '200')
self.assertEqual(resp['username'], self.username)
def tearDown(self):
print('--test over--')
if __name__ == '__main__':
unittest.main()
-
笔试题实拍图
笔试题
2.2 面试编程题
- 面试官2问
给定一个列表和一个目标值,找出这个列表中两数之和等于目标值的那两个数的下标?
p.s. 这是我在leetcode上刷的第一个题,但是当时竟然写错了,更有趣的是我写错了,面试官好像也没看出来,正确的写法如下
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# method 1
def get2NumIndex(lst, targ):
_len = len(lst)
for i in range(_len-1):
for j in range(i + 1, _len):
if lst[i] + lst[j] == targ:
return i, j
return None
# method 2
def get2NumIndex2(lst, targ):
for i, m in enumerate(lst):
if targ - m in lst:
return i, lst.index(targ - m)
return None
if __name__ == '__main__':
lst = [1, 2, 3, 5, 0]
targ = 5
print(get2NumIndex(lst, targ))
print(get2NumIndex2(lst, targ))
- 面试官3问
输入类似于:'123','-22','3.14',输出对应的数值
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
method 1
def str2num(s):
return float(s)
当我用
float()
函数实现时候,问曰:如果不用现成的float
函数,如何实现么?答曰:思考了一会,因为逻辑较复杂,当时只是给面试官描述了以下我的思路,即,1.若为
非负数整数
判断字符串长度,2.拆分字符串,对每一位乘10^(len(string)- i -1)
,再累加即可;而对负数
和浮点数
,需要先判断是否包含-
,.
,但后去掉负号或点号,再用同样的逻辑实现累加即可
面试后整理的详细编码如下
class Str2num(object):
"""
The class of string to number
"""
def __init__(self, string):
self.s = string
self.num = 0
def str2num(self, res1, is_negative):
"""
string to number
:param res1: 输入一个去掉'-'的str
:param is_negative: 是否为负数
:return: 返回对应的num
"""
if '.' in res1:
res2 = res1.split('.')
decimal_part = len(res2[1])
int_part = len(res2[0])
all_part = decimal_part + int_part
res3 = ''.join(res2)
for i in range(all_part):
self.num = self.num + int(res3[i]) * (10**(all_part-i-1))
return 0 - self.num / (10 ** decimal_part) if is_negative else self.num / (10 ** decimal_part)
else:
len_res1 = len(res1)
for j in range(len_res1):
self.num = self.num + int(res1[j]) * (10**(len_res1-j-1))
return 0 - self.num if is_negative else self.num
def inspect_minus(self):
if '-' in self.s:
return self.s.split('-')[1], True
else:
return self.s, False
if __name__ == '__main__':
s = '0'
s2n = Str2num(s)
insp = s2n.inspect_minus()
res = s2n.str2num(insp[0], insp[1])
print(res)
- 面试官3又问
以微信发消息为例,设计测试用例?
当时回答的有点乱,并且忘记不同数据类型的情况,后经面试官说明,才恍然大悟
正确的做法是,对发消息的类型分类,对于每一种类型的消息展开测试,包括但不限于如:数据发送/接受的正确性、数据最大长度、数据压缩情况、大量数据是否丢包、不同网络情况下发送发送/接收正常、数据是否加密
以下是来自TestHome文章
功能点
发送内容(空白、正常文字、超长文字、以前曾经引起过崩溃的特殊内容、特殊字符、表情、图片、多媒体、红包、语音等)
发送对象(普通用户、公众号、群、其他特殊主体)
衍生功能(转发、语音转文字、删除等)
非功能点
网络(弱网、断网)
设备条件(可用空间不足、资源不足导致卡死、内存不足可能被杀掉)
安全(各种注入、发送特殊可执行代码、发送包含可执行代码的图片等)
版本兼容(线上可用的最低版本到最高版本间传输)
设备兼容(各种自定义键盘、小屏幕等)
语音聊天
接通/挂断
通话质量
耳机插拔
音量调解
话筒/扬声器切换
打开/关闭麦克风
后台挂起
视频聊天
接通/挂点/切换语音
视频质量
耳机插拔
音量调解
话筒/扬声器切换
前置后置摄像头切换
视频框切换
后台挂起
OK,自如篇完
~
~
~
不积跬步,无以至千里