地平线 嵌入式测试开发 二面 面经

1.自我介绍

面试官好,我是[姓名]。一面主要聊了项目细节和技术实现,这次我想从另一个角度介绍一下自己。

我对测试开发的理解是,它不只是发现bug,更重要的是保障质量、提升效率。在我的项目中,我既是开发者也是测试者,这让我深刻体会到测试的价值。开发时我会想"这个功能怎么实现",测试时我会想"这个功能会在什么情况下出问题",这种双重视角让我对软件质量有更深的理解。

我做过的最有价值的事情,是通过压力测试发现了系统的性能瓶颈,并提出了优化方案。这不只是发现问题,还要分析原因、给出建议,这才是测试开发的核心价值。

我选择测试开发这个方向,是因为它既有技术深度,又有业务价值。我希望能在这个领域深耕,用技术手段提升产品质量,用测试思维预防问题发生。

2.你认为测试开发和普通测试有什么区别?

我认为主要有几个方面的区别。

技术能力要求不同。普通测试主要是执行测试用例、发现bug、提交报告,技术要求相对较低。测试开发需要写代码,开发测试工具、搭建测试平台、分析测试数据,技术要求更高。比如性能测试,不只是跑JMeter脚本,还要分析性能瓶颈在哪里,是CPU、内存、IO还是网络,需要深入理解系统架构。

工作内容不同。普通测试更多是重复性工作,每个版本都要执行相同的测试用例。测试开发更多是创造性工作,开发自动化测试框架、设计测试方案、优化测试流程。比如我在项目中写了一个压力测试脚本,可以模拟不同数量的并发用户,这个脚本可以反复使用,大大提升了测试效率。

价值体现不同。普通测试的价值是发现bug,是质量的守门员。测试开发的价值是提升效率、预防问题,是质量的推动者。比如通过自动化测试,可以在每次代码提交时自动运行测试,及早发现问题;通过测试平台,可以让测试结果可视化,方便分析和决策。

职业发展不同。普通测试的天花板比较低,往上发展可能是测试主管、测试经理。测试开发可以往技术专家方向发展,也可以往架构师方向发展,职业路径更宽。

我选择测试开发,就是希望用技术手段解决测试中的问题,而不只是重复执行测试用例。

3.如果让你设计一个自动化测试框架,你会怎么设计?

我会从几个方面考虑。

首先是测试用例管理。需要一个统一的地方管理所有测试用例,包括用例的分类、优先级、执行频率等。可以用数据库存储,也可以用配置文件。我倾向于用YAML或JSON格式的配置文件,因为可读性好,也方便版本管理。

test_cases:
  - name: "用户登录测试"
    priority: high
    type: functional
    steps:
      - action: "输入用户名"
        data: "testuser"
      - action: "输入密码"
        data: "password123"
      - action: "点击登录"
      - action: "验证登录成功"
        expect: "欢迎页面"


其次是测试执行引擎。需要一个引擎来解析测试用例,执行测试步骤,收集测试结果。可以用Python实现,因为Python有丰富的测试库(pytest、unittest等)。执行引擎要支持并发执行,提高测试效率;要支持失败重试,提高测试稳定性;要支持断言机制,自动判断测试是否通过。

class TestExecutor:
    def execute_test_case(self, test_case):
        result = TestResult()
        try:
            for step in test_case.steps:
                self.execute_step(step)
            result.status = "PASS"
        except AssertionError as e:
            result.status = "FAIL"
            result.error = str(e)
        except Exception as e:
            result.status = "ERROR"
            result.error = str(e)
        return result


第三是测试报告生成。测试完成后要生成详细的报告,包括通过率、失败用例、错误信息、执行时间等。报告要可视化,最好是HTML格式,可以在浏览器中查看。还要支持趋势分析,对比不同版本的测试结果。

第四是持续集成。测试框架要能集成到CI/CD流程中,代码提交后自动触发测试。可以用Jenkins、GitLab CI等工具。测试失败时要能及时通知相关人员,可以通过邮件、钉钉、企业微信等方式。

第五是可扩展性。框架要支持不同类型的测试,比如接口测试、UI测试、性能测试等。可以用插件机制,不同类型的测试实现不同的插件。框架要提供统一的接口,插件只需要实现这些接口就可以集成进来。

class TestPlugin:
    def setup(self):
        pass
    
    def execute(self, test_case):
        pass
    
    def teardown(self):
        pass


最后是易用性。框架要简单易用,测试人员不需要太多编程知识就能使用。可以提供图形界面,拖拽式配置测试用例。也可以提供命令行工具,方便在服务器上运行。

4.你如何保证测试的覆盖率?如何设计测试用例?

测试覆盖率包括代码覆盖率和需求覆盖率两个方面。

代码覆盖率方面,我会使用覆盖率工具(如gcov、lcov)来统计。主要关注几个指标:行覆盖率(每行代码是否被执行)、分支覆盖率(每个if-else分支是否都测试到)、函数覆盖率(每个函数是否都被调用)。一般来说,核心模块的代码覆盖率要达到80%以上。

# 编译时开启覆盖率统计
g++ -fprofile-arcs -ftest-coverage main.cpp -o main

# 运行测试
./main

# 生成覆盖率报告
gcov main.cpp
lcov --capture --directory . --output-file coverage.info
genhtml coverage.info --output-directory coverage_report


需求覆盖率方面,我会根据需求文档设计测试用例,确保每个需求点都有对应的测试用例。可以用需求追溯矩阵来管理,每个需求对应哪些测试用例,每个测试用例覆盖哪些需求。

测试用例设计方面,我主要用这几种方法:

等价类划分:将输入分为有效等价类和无效等价类,每个等价类选一个代表值测试。比如年龄输入,有效等价类是1-120,无效等价类是负数、0、超过120、非数字等。

边界值分析:测试边界值和边界附近的值。比如年龄输入,测试0、1、120、121这些边界值。

场景法:根据业务场景设计测试用例。比如用户登录,场景包括:首次登录、重复登录、密码错误、账号不存在、网络异常等。

错误推测法:根据经验推测可能出错的地方。比如空指针、数组越界、并发冲突、内存泄漏等。

在我的项目中,我设计了这样的测试用例:

功能:用户登录
测试用例1:正常登录
  前置条件:用户已注册
  输入:正确的用户名和密码
  预期结果:登录成功,跳转到主页
  
测试用例2:密码错误
  前置条件:用户已注册
  输入:正确的用户名,错误的密码
  预期结果:提示密码错误,登录失败
  
测试用例3:用户不存在
  前置条件:无
  输入:不存在的用户名
  预期结果:提示用户不存在
  
测试用例4:空输入
  前置条件:无
  输入:用户名或密码为空
  预期结果:提示输入不能为空
  
测试用例5:SQL注入
  前置条件:无
  输入:用户名包含SQL语句(如:admin' OR '1'='1)
  预期结果:登录失败,不会被注入


通过这些方法,可以比较全面地覆盖各种场景,提高测试质量。

5.如何进行性能测试?如何定位性能瓶颈?

性能测试主要包括几个方面:响应时间、吞吐量、并发能力、资源占用。

响应时间测试,测量从发起请求到收到响应的时间。可以用curl命令测试单个请求,也可以用脚本测试多个请求的平均响应时间。

# 测试单个请求
curl -w "@curl-format.txt" -o /dev/null -s http://localhost:8080/api/login

# curl-format.txt内容
time_namelookup:  %{time_namelookup}\n
time_connect:  %{time_connect}\n
time_starttransfer:  %{time_starttransfer}\n
time_total:  %{time_total}\n


吞吐量测试,测量单位时间内能处理多少请求。可以用Apache Bench(ab)或wrk工具。

# 使用ab测试
ab -n 10000 -c 100 http://localhost:8080/api/login
# -n: 总请求数
# -c: 并发数

# 使用wrk测试
wrk -t 4 -c 100 -d 30s http://localhost:8080/api/login
# -t: 线程数
# -c: 连接数
# -d: 持续时间


并发能力测试,测量系统能支持多少并发用户。逐步增加并发数,观察系统的表现,找到系统的极限。

资源占用测试,监控CPU、内存、磁盘IO、网络IO等资源的使用情况。可以用top、htop、vmstat、iostat等工具。

# 监控CPU和内存
top -p $(pgrep myapp)

# 监控IO
iostat -x 1

# 监控网络
iftop -i eth0


定位性能瓶颈方面,我的方法是:

首先用性能分析工具找到热点函数。Linux下可以用perf,它能统计每个函数的CPU占用时间。

# 采样
perf record -g ./myapp

# 分析
perf report


然后分析热点函数的实现,看是否有优化空间。常见的性能问题包括:

  • 算法复杂度高:用O(n²)的算法,可以优化为O(n log n)或O(n)
  • 频繁的内存分配:可以用对象池或内存池
  • 不必要的拷贝:可以用引用或移动语义
  • 锁竞争:可以减小锁粒度或用无锁数据结构
  • IO阻塞:可以用异步IO或缓存

在我的项目中,我发现性能瓶颈在JSON解析,每个消息都要解析JSON,占用了大量CPU时间。优化方法是:

  1. 换用更快的JSON库(从nlohmann/json换到rapidjson)
  2. 缓存解析结果,相同的消息不重复解析
  3. 对于简单消息,用二进制协议代替JSON

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论

相关推荐

05-20 21:41
已编辑
门头沟学院 运维工程师
面试的时间线:5.09,投递简历5.11,邮件通知一面5.15,二面讲讲面试问了些什么吧一面:1.你的两个项目都是自己在哪找的资料学习的啊?2.怎么没有想着做开发,而是来做运维呢3.你的nginx是如何配置的,有没有做域名相关的配置4.假如你的域名无法进行访问了,你该如何进行排查5.如果报的是403或者502的错误,你该如何处理6.有没有部署过监控系统,你是如何监控你的服务的7.你的nginx有没有做健康检查,你根据什么来判断的8.用状态吗和端口去探查的话,区别在哪9.有用过ansible吗,做了些什么操作,主要是涉及哪些方面10.deployment和statefulset的区别在哪里11.CICD流水线是如何设计的12.EFK日志处理时,说说你配置哪些告警策略,然后以及面对频繁告警怎么处理的。13.Fluentd 对 Nginx 和应用日志进行什么结构化处理14.如果线上出现了一个故障,你要怎么处理?15.生产环境出现了一个比如说五百的报错,你要怎么处理?16.有没有对镜像做一些优化?比如说你的镜像比较大的话。你怎么又换你的 Docker 镜像?一面老哥问的蛮仔细,有些我回答不充分的,还会帮我补充,有时候还会给我一些提示,给一个爆赞二面:面试官和我闲聊了一会,聊了聊专业和一些课题,然后开始了面试流程1.在你的DevOps的体系建设中,从SaaS层你都是用了哪些东西?然后在这个PaaS层,你都是用什么把它和S层相结合起来?在SaaS层你做了哪些可以自动化让他们run,或者监控,或者是能够让它这个体系健康的运转,和修复和报警相关的事项。(这个问题一开始还没太听懂)2.你的服务是部署在自己的电脑,还是在一些云服务上面的啊3.K8S里面的Ingress你了解吗?你怎么使用的4.Nginx和Ingress的关系是啥?5.你这边像对于开发shell和python这块有什么项目经验或者是?6.让你用ai结合你的项目做一个根因分析,你都会让 AI 做什么?然后怎么去分析出根因?你都会做哪些事情?7.当你自己遇到你这套系统中的一个五百的错误的时候,你怎么去检查?8.一些相对复杂的 SQL 写过吗?9.搭建MySQL主从,你手动怎么配置?二面的面试官对项目的细节问的不太多,更多是从场景题来考察我,确实是把我问的有点汗流浃背了,这是从腾子之后有一个让我压力山大的面试官
查看25道真题和解析
点赞 评论 收藏
分享
04-23 17:30
门头沟学院 Java
继续来分享下最近的面经~欢迎友好讨论,信息共享1. 你有没有接触过自动化测试?了解哪些测试框架(Python 或其他语言)?2. 你在A公司做的 AI 平台整体是干什么的?3. 你说的孤儿资源清理具体是怎么实现的?4. 你是怎么判断一个资源是孤儿资源的?5. 这个过程是基于全量扫描,还是事件驱动?具体怎么做的?6. Watch 和数据库同步这一套是怎么设计的?有没有一致性问题?7. 你的事件处理链路是怎样的?有没有用 Kafka?为什么用 / 不用?8. 你在B公司做的 Agent 核心是做什么的?解决了什么问题?9. 这个 Agent 实际是在部署什么?是服务、脚本还是其他东西?10. Agent 是中心化部署还是每台机器一个?为什么这么设计?11. Agent 和 Jenkins 的关系是什么?谁负责调度,谁负责执行?12. Agent 的所有动作是不是最终都是通过 Jenkins 来执行的?13. Jenkins 执行完之后,怎么和 Agent 做状态同步或结果回传?14. 既然 Jenkins 本身就能做自动化,为什么还要做一个 Agent?15. 用户在 Jenkins 上最容易填错哪些参数?为什么?16. 能不能完全不让用户填参数,让系统自动完成?为什么做不到?17. 如果 Jenkins 已经可以完成这些事情,引入 Agent / AI 的价值在哪里?18. 如果让你设计一个自动拉日志的 Agent,你整体流程是怎样的?19. 有3台Linux机器,日志路径不统一,而且是二进制日志,需要解析,你怎么设计?20. IP/Port 固定,但 SSH 密码会随软件版本变化,这个你怎么处理?21. 不同业务的人要不同日志路径,你怎么做管理?22. 用户不愿意维护配置表,你怎么让用户输入,同时系统自动沉淀规则?23. 日志解析涉及不同格式、工具、版本,这一块怎么设计?24. 如果这个 Agent 要扩展到自动检测、排障、自动化能力,架构怎么演进?25. 在完全没有规范流程、系统很混乱的情况下,你怎么落地这个 Agent?手撕:第二大的数字,不能用既有函数。
查看26道真题和解析
点赞 评论 收藏
分享
面试了陌陌的k8s研发工程师岗位,不管是面试过程,还是技术广度深度,总体感觉还是很专业的,沟通过程比较流畅,面试官会以交流的方式提问,卡顿的地方进行会适当的引导,面试完hr通知和约后续面试也挺快的,基本上几个小时后hr会联系给反馈。一共4轮面试,2轮技术面,1轮业务面,1轮hr面,下面整理了下整体面试的问题:第一轮技术面试,差不多50分钟,面试官应该是部门小组负责人,先自我介绍到聊项目,我之前主要做容器云平台相关开发的,从项目延伸到k8s和go的相关知识;1. 自我介绍+项目介绍(pass平台、自定义控制器、servicemesh平台、devops平台),基于项目问了一些功能实现和细节;2. k8s主要问了一些基础问题,具体记不全了,如:pod多个container的启动顺序;crd编写规范(matedata、spec、status)自定义控制器实现机制(控制器启动流程、informer机制、watch断点续传和resync机制),reconcile的实现细节和注意事项(workqueue的去重和重试机制);自定义调度器实现的方式;3. go问了一些基础问题,数组切片、map等;4. 最后一道代码题,多个gorountine并发处理任务。第二轮技术面试,差不多快1个小时,面试官应该是技术leader,提问的方式挺有水平的,交流的问题比较基础细致并且挺有深度的,有些平时常见但是容易忽略的地方,需要对k8s实践和源码有足够的熟悉程度。1. 自我介绍+项目介绍,基于项目细节延伸到的问题如下;2. kubelet的作用、pod创建的流程;3. 常用的几种operator脚手架工具,如kubebuilder、code-generator等,区别是什么?为什么选择其中的一种?4. deployment滚动更新,更新过程和配置,deployment controller根据pod哪些信息判断pod已经ready(pod的status.conditions信息),如何暂停滚动更新;5. 灰度发布实现方式:①只用1个deployment,多个pod,通过暂停滚动更新实现,需要通过暂停更新进行精确的pod数量控制;②基于服务网格istio实现,2个deployment+virtualservice+destinationrule6. operator原理(informer、watch机制等),reconcile处理细节,如何保证最终一致性和幂等性(workqueue去重机制、延迟重试机制、crd spec对比、status判断等);7. operator高可用如何实现(lease),无主或者双主情况如何解决,k8s lease资源和etcd的lease机制的区别;8. apiserver自定义准入控制,可以实现什么功能(认证、鉴权、准入控制(cidecar注入、集群资源信息校验)),准入控制webhook https证书配置,超时处理等;第三轮业务面试,45分钟左右,应该是整个部门的负责人,主要是过项目,感觉主要是查看沟通能力,基于项目中涉及到的核心技术operator、servicemesh等问了一些架构和核心机制如,如何保证reconcile幂等性、operator高可用、istio架构等;第四轮hr面试,就是一些常见的问题了
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务