怿星电子科技 车载测试一面:408 八股、Flask 自动化与现场三道手撕
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 为什么计算机专业毕业不做开发,选择来做测试?
- Linux 用什么命令查看进程和杀掉进程?
- 说一下你在自动化测试项目里是怎么用 Flask 框架的?
- Python 进程间通信用的是什么库和函数?
- 内存、硬盘、cache 和寄存器的访问速度怎么排序?
- 进程和线程的区别是什么?
- 手撕:两道 SQL 题,主要考察 JOIN 关键字的用法。
- 手撕:写出 Linux 输出日志文件第十行的命令。
- 常用的排序算法有哪些?冒泡排序和快速排序是怎么实现的?
- 手撕:LeetCode 最长公共前缀。
- 我看你对代码不是很熟练,研究生期间没有做过算法和编程相关的项目吗?
- 实习经历中的自动化测试框架有没有借助 AI 完成?有没有主动发现可以优化的点?
- 如果领导给你分配任务,你发现这个方案有一点缺陷,你跟领导这边怎么沟通?
- 实习或项目经历中有没有遇到过意见分歧?怎么解决的?
- 对于你当前的技术栈来说,你认为自己最大的优势和短板分别是什么?
- 最近三到五年的职业规划是什么?
- 反问:对我们公司有没有什么想了解的?
《参考解析》
Linux 查进程与杀进程。 查进程:ps aux(BSD 风格,看 CPU/内存占比)或 ps -ef(System V 风格,看 PPID),ps -ef | grep 关键字 过滤;top / htop 看实时资源;pgrep -f 关键字 直接拿 PID;pidof 程序名 按程序名取 PID;查端口占用用 lsof -i:8080 或 ss -lntp。杀进程:先 kill <PID>(默认发 SIGTERM,进程有机会清理资源、刷盘、优雅退出),等几秒不退再 kill -9 <PID>(SIGKILL,内核直接回收,进程无法拦截,可能留下脏数据)。批量杀用 pkill -f 关键字 或 killall 程序名。面试官常追问「kill -9 有什么风险」,答案就是上面那句:进程没有机会做清理,临时文件、锁、连接池都靠外部兜底。
Python 进程间通信。 关键是要先分清「进程」和「线程」:queue.Queue 是线程安全的队列,只在同一进程的线程间可用;跨进程要用 multiprocessing 提供的设施——multiprocessing.Queue(底层管道 + 序列化,支持多生产者多消费者)、multiprocessing.Pipe()(双向或单向管道,轻量、适合两端一对一)、multiprocessing.Manager().dict()/list()(代理对象,跨进程共享可变结构但性能差)、Value / Array(共享内存,必须配 Lock 使用),以及 Python 3.8 起的 multiprocessing.shared_memory(大块 numpy 数组这类数据用它,避免反复 pickle 拷贝)。注意两点:跨进程传递的对象要被 pickle 序列化,所以 lambda、数据库连接、打开的文件句柄传不过去;Queue.get() 不带超时会一直阻塞,生产代码要写 get(timeout=...) 并处理 queue.Empty。另外 multiprocessing 在 Linux 上默认 fork、在 Windows/macOS 上默认 spawn,模块级代码必须放在 if __name__ == "__main__": 下,否则子进程会重复执行。
存储层次速度排序。 从快到慢:寄存器 > cache(L1 > L2 > L3)> 内存(DRAM)> SSD > 机械硬盘。量级上可以记一句:寄存器与 L1 是「一个 CPU 周期到几纳秒」,L2/L3 是十几到几十纳秒,内存是百纳秒级(约 100ns),NVMe SSD 的随机读是几十微秒,SATA SSD 百微秒级,机械硬盘的随机寻道是毫秒级。面试里如果被追问「为什么要有 cache」,答局部性原理:时间局部性(刚访问的数据很可能再访问)与空间局部性(相邻地址很可能被一起访问),所以按 cache line 一次搬 64 字节。
进程与线程的区别。 进程是资源分配的基本单位,有独立虚拟地址空间、文件描述符表、信号处理;线程是 CPU 调度的基本单位,同进程内的线程共享地址空间与堆,各自有栈、寄存器上下文和 errno。由此推出三个常考差异:切换开销(进程要换页表,线程只换上下文,所以线程轻)、通信方式(进程要管道/共享内存/消息队列/socket,线程直接读写共享变量但要加锁)、隔离性(一个线程崩了整进程挂,进程之间互不影响)。补充一句 Python 的 GIL:CPython 里同一时刻只有一个线程执行字节码,所以 CPU 密集型任务要用多进程,IO 密集型任务多线程仍然有效。
两道 SQL JOIN 手撕怎么写。 先把五种连接讲清:INNER JOIN 取交集;LEFT JOIN 保留左表全部、右表缺失补 NULL;RIGHT JOIN 反之;FULL OUTER JOIN 两边都保留;CROSS JOIN 笛卡尔积。真正的考点是 ON 和 WHERE 的差别:在 LEFT JOIN 里,把右表的过滤条件写在 ON 上只影响「能不能匹配上」,左表行仍然保留;写在 WHERE 上会在连接完之后再过滤,右表列为 NULL 的行被剔掉,语义就退化成了 INNER JOIN。常见题型有三类:① 求「每个用户最近一次订单」——子查询取 MAX(created_at) 再回连,或用窗口函数 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC);② 求「没有下过单的用户」——LEFT JOIN ... WHERE o.id IS NULL 或 NOT EXISTS;③ 多表联查 + 聚合——JOIN 之后 GROUP BY 配合 COUNT/SUM,过滤聚合结果要用 HAVING 而不是 WHERE。写的时候顺手说一句索引:连接列两侧都要有索引,否则大表 JOIN 会走全表扫描。
日志文件取第十行。 三种写法都算对:sed -n '10p' app.log(最直接,读到第 10 行就停)、awk 'NR==10' app.log、head -n 10 app.log | tail -n 1(最直观,但会多读一点)。边界情况要主动交代:文件不足 10 行时前两种输出空、不会报错;如果日志是持续写入的,tail -f 更适合看实时,取固定行号用上面的写法。另外提一句「不要 cat 整个大文件再管道」,几 GB 的日志用 cat 会把内存和 IO 打满,sed/awk 是流式的,读到目标行就退出。
冒泡与快排的实现和取舍。 冒泡:相邻两两比较,大的往后换,每轮把当前最大值顶到末尾;加一个「本轮有没有交换」的标志,某轮没交换就提前结束,最好情况 O(n)、平均和最坏 O(n²),稳定,适合教学和小数据。快排:选一个 pivot,把小于它的放左边、大于它的放右边(partition),再对左右递归;平均 O(n log n),最坏 O(n²)(数组已经有序且固定取首元素作 pivot 时每次都只能切掉一个元素),所以工程上要随机选 pivot 或三数取中,并且小区间(长度小于 10 左右)切回插入排序。快排不稳定、原地排序、空间是递归栈 O(log n) 期望。手写时面试官会看两点:partition 的边界有没有写错(i、j 的交错条件),以及递归终止条件是不是 left >= right。
最长公共前缀。 纵向扫描最简洁:以第一个串为基准,逐列比较所有串的第 i 个字符,一旦某个串长度不够或字符不同就返回 strs[0][:i];时间 O(S)(S 是所有串字符总数),空间 O(1)。横向扫描是两两求 LCP 再逐步缩短,实现更短但比较次数略多。还有分治和二分答案(对前缀长度二分,check(mid) 判断所有串前 mid 个字符是否相同),复杂度 O(S log m),适合面试官追问「有没有更快的」。一定要先处理边界:空数组返回空串,只有一个串直接返回它;不要假设所有串等长。
Flask 在自动化测试里能干什么。 常见三种用法:① 做 Mock Server——被测服务依赖第三方接口时,用 Flask 起一个假接口返回固定/可配置的响应,还能故意返回 500、超时、畸形 JSON 来验证被测服务的容错;② 做用例触发与结果看板——把 pytest 用例包一层 HTTP 入口,CI 或前端点一下就能跑指定标记的用例,跑完把报告写回页面;③ 做测试数据服务——按需生成用户、订单这类前置数据。讲这段时要主动把「框架」和「测试框架」分开:Flask 只是被测系统的形态或测试的脚手架,真正组织用例的是 pytest(fixture 管前置后置、parametrize 做数据驱动、mark 分组),断言和 HTTP 调用用 requests + 自己封装的 client。作者这场面试的面试官后来说岗位「更侧重开发」,这类追问其实就是在确认你写的是测试脚本还是能维护的工程代码。
被问「代码不熟练」时怎么答。 这是压力题,别辩解也别认输。有效的答法是承认事实 + 给证据 + 给动作:说明自己主要精力放在测试设计与自动化框架上,算法刷题量确实不够,但可以举一个「用代码解决实际问题」的例子(比如把手工回归里最耗时的 20 个用例脚本化、把日志里的报错自动归类),再讲正在补的计划(按题型刷、每周固定量、用 OJ 对拍)。面试官真正想确认的是「遇到不会的东西会不会自己补上」,而不是你现在会不会手写快排。