刷题记录---字节跳动2018校招测试开发方向(第一批)
一、某一个RPC服务A,对外提供接口MatchAds(AdTargetRequest req),发送请求,返回可展示的广告。如何测试这个服务接口的性能。
答:
(1)测试A是否能成功发送请求
(2)测试A发送正确请求后能否返回广告,返回的是否是可展示的广告;发送错误请求后返回的数据内容是什么;
(3)测试同时发送多个请求时接口的反应速度和返回的数据内容(压测:同时发送100条请求或上千条请求,请求能否成功发送,顺序是否一致,能否正常接受返回的广告,返回的广告顺序是否一致,返回的广告是否能正常展示)
二、如果一个头条的客户端程序,冷启动时间为4秒,怎么判断开启速度是合理的还是不合理的?如果不合理,该如何找到问题,提供思路。
答:
判断是否合理:
(1)确保测试冷启动时间的方法和环境固定:同一台手机(客户端平台相同);相同的网络环境;测量3次取平均值。满足上述条件之后,转向第(2)步进行判断。
(2)横向对比:对比系统打开同类软件的冷启动时间,如果打开同类软件的冷启动时间平均低于4s,说明不合理;纵向对比:比较当前版本和之前版本的冷启动时间,如果之前版本的冷启动时间平均低于4s,说明不合理;
排查问题:
(1)考虑客户端所在平台的系统配置和性能是否符合要求,如果正常,转向第(2)步判断,否则有可能是系统配置不匹配引起;
(2)考虑网络环境是否满足要求,如果满足就转向第(3)步,否则可能是网络问题引起;
(3)环境因素排除之后,通过不同版本的纵向对比,定位到启动时间不合理的版本的出现时间;
(4)测试启动时间时全程抓取log,分析进入应用时的系统调用栈和加载的资源的耗时
三、给定一棵树的根节点, 在已知该树最大深度的情况下, 求节点数最多的那一层并返回具体的层数。如果最后答案有多层, 输出最浅的那一层,树的深度不会超过100000。实现代码如下,请指出代码中的多处错误:
struct Node { vector<Node*> sons; }; void dfsFind(Node *node, int dep, int counter[]) { counter[dep]++; for(int i = 0; i < node.sons.size(); i++) { dfsFind(node.sons[i], dep, counter); } } int find(Node *root, int maxDep) { int depCounter[100000]; dfsFind(root, 0, depCounter); int max, maxDep; for (int i = 1; i <= maxDep; i++) { if (depCounter[i] > max) { max = depCounter[i]; maxDep = i; } } return maxDep; }
答:
1、指针错误
第8行 node是指针类型,应该用node->sons.size()
第9行 同样的错误,应该有node->sons[i]
2、功能错误
(1)第16行 max未初始化;maxDep与输入变量冲突,应该重新定义一个变量作为返回变量。可改为
int max=0; int res;
同时对应的第20行和第23行就应该改为
res=i; return res;
(2)第9行 再次调用dfsFind函数是为了进行下一层,所以传入的深度参数要+1,改为
dfsFind(node->sons[i], dep++, counter);
3、越界、空指针
(1)dfsFind函数和find函数都应该增加一个传入指针为空的判断。
dfsFind函数中添加
if(!node) return;
find函数中添加
if(!root) return 0;
(2)第17行for循环判断会越界,应该为
for (int i = 0; i < maxDep; i++) {