当前位置:   article > 正文

2020华为测试工程师面试前三天面经汇总准备_华为存储测试工程师

华为存储测试工程师

结合面经,做总结

主要考察:代码能力,测试是否能设计,项目经验

1.python常见语法
1.1 Python的内存管理机制是什么呢?Java的内存管理机制是什么呢?

内存管理主要包括内存分配和内存回收两个部分。
python和Java全都采用内存自动回收的方法,也就是我们只管申请内存,但是不管释放内存,由python解释器和jvm来定期触发内存回收。
内存管理机制:内存池(内存分配),引用计数、垃圾回收(回收)。
垃圾回收 :引用计数为主,标记清除分代回收为辅

  • 引用计数来进行内存管理,每一个python对象,都维护了一个指向该对象的引用计数。python的sys库提供了getrefcount()函数来获取对象的引用计数。

引用计数增加的场景:

  • 对象被创建并赋值给某个变量,eg:a = ‘ABC’
  • 变量间的相互引用(相当于变量指向了同一个对象),eg:b=a
  • 变量作为参数传到函数中。eg:ref_method(a),调用getrefcount
  • 对象放到某个容器对象中(列表、元组、字典)。eg:c = [1, a, ‘abc’]

引用计数减少的场景:

  • 变量离开了作用域
  • 对象的引用变量被销毁,比如del a
  • 对象的引用被赋值给其他对象,比如 a =789
  • 对象被从容器对象中移除,比如:c.remove(a)
  • 直接将整个容器销毁,比如:del c

引用计数虽然可以实时的知道某个对象是否可以被回收,但是也有两个缺点:

  • 维护引用计数消耗资源;循环引用导致内存泄露

  • 标记-清除:
    –第一阶段:标记。GC会把所有的『活动对象』打上标记
    –第二阶段:清除。是把那些没有标记的对象『非活动对象』进行回收。主要处理的是一些容器对象,比如list、dict、tuple,instance等,因为对于字符串、数值对象是不可能造成循环引用问题。
    –缺点:需要python垃圾回收器对python对象执行两遍扫描,而每次扫描,python解释器就会暂停处理其他事情,等到扫描结束后才能恢复正常。

  • 分代回收:一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代。
    –Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。思想是,新生的对象更有可能被垃圾回收,而存活更久的对象也有更高的概率继续存活。因此,通过这种做法,可以节约不少计算量,从而提高 Python 的性能。

python内存池
python内存的分层管理方式作用:当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。分层之后,第1层和第2层充当了内存池的作用,根据分配的内存大小不同,交给不同的层去处理,减少了频繁的调用malloc。
Python 的内存机制呈现金字塔形状:

  • -1,-2 层主要有操作系统进行操作;
  • 第 0 层是 C 中的 malloc,free 等内存分配和释放函数进行操作;当申请的内存大于256K时,会调用第0层的malloc分配内存。
  • 第1层和第2层是python级别的内存分配器(内存池),当申请的内存小于256K时,会由这两层来进行处理。
  • 第3层是python对象内存分配器,也就是我们通常所用的python对象,比如:列表和字典、元组等。

Java内存管理机制详见

1.2 python2和python3的差异。详见
  • print语句–》print函数
  • Unicode:Python3.X默认使用utf-8编码。Python 2 有 ASCII str() 类型,unicode() 是单独的
  • 除法运算:python2中/ 与Java等差不多,整数相除为整数,浮点数相除会得到浮点数。python3中/ 对于整数相除也是浮点数。而对于//对结果向下取整。
  • 异常:捕获异常的语法由 except exc, var 改为 except exc as var。
    在2.x中,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。
  • xrange:在 py2 中 xrange() 创建迭代对象,比如: for 循环或者是列表/集合/字典推导式。py3中采用range()
  • 八进制字面量表示:八进制不许写成0o777的格式,二进制必须为0b111
  • 不等运算符:py2有!=和<>,py3只有!=
  • 多个模块被改名
  • 数据类型:py3去除了long类型,只有一种整型int,新增了bytes类型,str 使用encode方法转化为 bytes;bytes通过decode转化为str。bytes是Python 3中特有的,Python 2 里不区分bytes和str。
    py3的数据类型6种【数字( int、float、bool、complex(复数)),字符串,元组,列表,字典,集合】

ASCII和Unicode编码的区别:详见
ASCII:1字节,支持英文
Unicode:2个字节(生僻字4个),支持所有语言
UTF-8(Unicode最常用的一种):1-6个字节,英文1个字节,汉字3个字节,生僻字4-6个字节,支持所有语言

2.数据结构【重点,两个平行面都要手撕代码,撕不出来就凉了】

1)字符串回文串,括号匹配,最长最短不重复字串长度等【重点】
2)数组
3)二叉树
4)链表:判断是否回环,合并有序链表
5)排序算法,时间复杂度分析

各大面经上:
1).合并两个二叉树,递归实现:

思路:对这两棵树同时进行前序遍历,并将对应的节点进行合并。 如果两棵树的当前节点均不为空,将它们的值进行相加,并对它们的左和右孩子递归合并;
如果其中有一棵树为空,那么返回另一颗树作为结果; 如果两棵树均为空,此时返回任意一棵树均可(因为都是空)

class Solution:
    def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
        if not t1:
            return t2
        if not t2:
            return t1
        t1.val +=t2.val
        t1.left = self.mergeTrees(t1.left,t2.left)
        t1.right = self.mergeTrees(t1.right,t2.right)
        return t1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2)自守数(一个正整数的平方的尾数等于该数自身的自然数,例如:1* 1=1、5* 5=25、6*6=36,要求,输入一个数n,输出n以内的自守数,考虑n足够大,比如n=655365。)

思路:t = (n * n)%(10**len(str(n)),查看t是否等于n

3).输入一个有符号整数,数据范围是[-321, 321+1],然后输出其反转,超出范围之后输出0,比如输入23,输出32。

思路:利用求余每次取末尾数字,加到res后面,/去掉尾数。先去绝对值去掉符号位,在最后结果再判断。{每次生成数字之后记得判断边界值}

while y!=0:
	res= res*10+y%10;
	if res > boudary:return 0
	y = y//10
return res
  • 1
  • 2
  • 3
  • 4
  • 5

4)一组正整数,不超过一百个,将这组正整数进行组合,输出最大值。如输入(123,234),输出234123
力扣的179题求最大数(medium),类似的题目有把数组排成最小数

思路:为了构建最大数字,我们希望越高位的数字越大越好。直接拼接数字,可能导致数值溢出,这是一个隐形的大数问题,需要把数字转换成字符串。然后需要定义一种比较两个数的规则。如下:
任意两个数字的字符串格式x和y。如果x+y>y+x,则m>n,,反之则n<m
应用以上规则进行排序,最后拼接所有字符串,并返回

5)找出字符串中第一个只出现一次的字符。输入一个非空字符串,输出第一个只出现一次的字符,如果不存在输出-1

思路:用哈希表记录每个字符出现的次数,只出现一次的字符对应键值为True,出现多次的更新为False。再从哈希表中找到第一个出现True对应的字符

    def one(self,s):
        dic = {}
        for i in s:
            if i in dic:
                dic[i] = False
            else:
                dic[i] = True
        for i,v in dic.items():
            if v:
                return i
        return -1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

6)求一个字符串中,英文字母、数字、空格、其他符号的个数

思路:判断字母.isalpha(),数字.isdigit()

7).编写函数返回一个字符串str中第count个元素c的位置

思路:采用哈希表,键表示字符,值表示字符出现的位置(采用列表存储)。然后再遍历哈希表求所需要的字符对应的第几个出现的位置

8).写给出一个数n,你找出最长的自然数连续相加能够得到n的序列,比如15=1+2+3+4+5
ps:和这道剑指offer的和为s的连续正数序列类似,就是在这道题的基础上选择最长的序列

思路:采用双指针,left和right初始化指向首部,计算从left 到right的和,如果和大于target,则将right左移;反之,则将left右移,相等的时候将left到right的序列存到列表中,将sum减去left,left左移(开启下一个遍历)。然后根据长度排序,选最长的

class Solution:
    def findContinuousSequence(self, target):
        left = 1
        right = 1
        res =[]
        sums = 0
        while left<=(target//2):
            if sums<target:
                sums +=right
                right +=1
            elif sums>target:
                sums -=left
                left +=1
            else:
                res.append(list(range(left,right)))
                sums -=left
                left +=1
        res = sorted(res, key = lambda x:len(x),reverse= True )
        return res

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

9).找字符串最长不重复子串长度

思路:采用双指针+哈希表,l和r指针初始化指向第一个字符,r指针向遍历字符串,将字符及对应的加入哈希表,并计算l到r之间的字符串长度,当遇到重复的字符,判断此重复字符上一次的位置与当前l位置的大小,更新l指针。

def lengthOfLongestSubstring( s):
    n = len(s)
    l = -1
    max_len = 0
    d = {}
    for r in range(n):
        if s[r] in d:
            l =max(l,d[s[r]])  #更新开始值l

        max_len = max(max_len,r-l)
        d[s[r]] = r  #重复字母的位置更新到当前位置,不是重复的则直接加入哈希表
    return max_len
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

10).合并有序链表

思路:采用双指针l1和l2遍历两链表,根据值来确定节点添加的顺序,两指针交替前进,直到遍历完成。由于初始状态合并链表无头结点,使用伪头节点,将各节点添加在伪头节点之后。

  def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        head = ListNode(0)
        cur = head
        while l1 and l2:
            if l1.val>l2.val:
                cur.next =l2
                l2=l2.next
            else:
                cur.next = l1
                l1=l1.next
            cur=cur.next
        if l1:
            cur.next = l1
        else:
            cur.next = l2
        return head.next
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

11)给定两个字符串s1和s2,统计s2子串在s1里面出现的个数?

思路:采用双指针l1和l2,当s1和s2字符相同时,l1和l2同时右移,当l2移动的步数等于s2的长度时说明s1串包含了s2字串,计数器count+1。当遇到不同时,l1继续右移,l2指向s2首字符,最后输出count

12)求二叉树的深度

思想:采用层次遍历,利用队列存储节点,每遍历完一层深度加1

13)括号匹配

思想:采用栈存储左括号,当遇到右括号时,判断栈顶元素是否与当前右括号匹配,是的话将其弹出,反之输出False

3.测试相关

1.说说黑盒测试案例的设计方法?说说白盒测试案例的设计方法
黑盒测试:等价类,边界值,判定表,场景设计法,正交试验,流程分析法
白盒:语句覆盖,判定覆盖,条件覆盖,判定条件覆盖,条件组合覆盖,路径覆盖(最强的覆盖准则)
2.说说你所接触的安全测试?
关于app,常见的安全漏洞:跨站脚本攻击(XSS),用户敏感数据(IMEI、GPS、MAC 地址、电子邮件等)泄露,SQL 注入,数据加密缺失,OS 命令注入,恶意软件,网络钓鱼攻击等。
使用过ADB(Android Debug Bridge),提供了一个终端接口,用于控制使用 USB 连接到计算机的 Android 设备。ADB 可轻松与谷歌的 Android Studio 集成开发环境进行集成;实时监控系统事件。它允许使用 Shell 命令在系统级别进行操作;它使用蓝牙、WiFi、USB 等与设备通信

3、关系型数据库跟非关系型数据库的区别?
1)关系型数据库:mysql /oracle/sql server/sqlite
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:

  • 易于维护:都是使用表结构,格式一致;
  • 使用方便:SQL语言通用,可用于复杂查询;
  • 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。

缺点:

  • 读写性能比较差,尤其是海量数据的高效率读写;
  • 固定的表结构,灵活度稍欠;
  • 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

2)非关系型数据库:redis / hbase /mongoDB /CouchDB /Neo4J
非关系型数据库严格上不是一种数据库,是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:

  • 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
  • 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
  • 高扩展性;
  • 成本低:nosql数据库部署简单,基本都是开源软件。

缺点:

  • 不提供sql支持,学习和使用成本较高;
  • 无事务处理;
  • 数据结构相对复杂,复杂查询方面稍欠。

4、主键的选择策略,怎么选择某个字段作为主键呢?
在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组.
自动增长字段.手动增长字段.UniqueIdentifier,“COMB(Combine)”类型
5.当数据过大的时候,用递归会出现什么情况呢?栈溢出
6.app出现点击没有反应,请问如何测试,并且说出可能有哪里出问题

  • .从网络方面,可能发生了断网,或者碰到了极弱网,网络不稳定的情况
  • .从客户端发生考虑,可能是用户的移动设备发生故障,未读取到用户点击操作,同时可能是用户手机内存溢出
  • 从服务器段考虑,可能是系统负载较大,对用户响应很慢,也有可能用户请求传输过程中丢失,导致服务器未读取到请求
    界面未给出响应的原因:从程序问题:
  • 按钮的监听事件未正确调用,或者干脆就没有添加监听
  • 监听确认被调用,但监听过程出现错误或异常,例如参数传输失败。
  • 前端调用接口错误,如后端出现运行时异常,没有给出相应的提示消息

7.怎么理解接口?
接口就是一个规范,通过调用接口获得结果,无需访问源码,扩展性强,可维护性高;
接口可以多实现,用接口来声明,可以在不同业务需求中更换实现类来应对,提高了编程的灵活度。

8.给你一个水杯/A4纸/钢笔,要怎么测试?测试白纸
查看需求是什么(查看杯子使用说明书),再设计测试用例。可以从以下几个方面:
界面测试:杯子外观;功能性测试:是否漏水,能不能喝得到;
性能测试(压力(即高负载下的负载测试),负载,强度,并发,可靠性测试等):
1)可靠性:从不同高度落下的水杯破损程度;
2)兼容性:杯子是否能够容纳果汁、白水、酒精、汽油等
3)易用性:杯子是否烫手、是否有防滑措施、是否方便饮用
4)可移植性:杯子在不同的地方、温度等环境下是否都可以正常使用
5)压力测试:用根针并在针上面不断加重量,看压强多大时会穿透
6)震动测试: 杯子加包装( 有填充物), 六面震动, 检查产品是否能应对恶劣的铁路\ 公路\ 航空运输
安全性测试:杯子有没有细菌;

9.现在给你一个登录模块,你要怎么测试?

  • UI测试:页面布局, 错误提示,输入框中默认提示
  • 功能测试:用户名和密码,短信验证码登录(手机,验证码),第三方登录,登录按钮,退出登录
  • 安全测试:Token,多次错误密码登录,密码是否显示,横向越权(a用户访问b用户的资源),sql注入测试
  • 交互测试:登陆成功后的页面跳转,登陆失败的提示指引,点击输入框的键盘弹出

10、黑盒白盒测试了解吗?区别是?
1)测试的方式不同:
黑盒测试:功能测试,是通过测试来检测每个功能是否都能正常使用。
白盒测试:称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。
2)测试的目的不同:
黑盒测试是把程序当做一个黑盒子,不考虑程序内部结构和处理过程,只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。
白盒测试是指可以清楚的了解系统内部的结果和工作原理,并基于这个知识来设计用例。在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。
3)测试原则不同:
黑盒测试:以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。很明显,如果外部特性本身设计有问题或规格说明的规定有误,用黑盒测试方法是发现不了的。
白盒测试:一个模块中的所有独立路径至少被测试一次。所有逻辑值均需测试true和false两种情况。

11、白盒的测试方法有哪些?解释一下?
白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、路径覆盖和程序变异。白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。六种覆盖标准发现错误的能力呈由弱到强的变化:
大致分为静态方法和动态方法两大类。

  • 静态分析是一种不通过执行程序而进行测试的技术。静态分析的关键功能是检查软件的表示和描述是否一致,有无冲突或者歧义。
  • 动态分析是当软件系统在模拟或真实的环境中执行前、过程中和执行后,对其行为分析。它显示了一个系统在检查状态下是否正确。在动态分析技术中,最重要的技术是路径和分支测试。
    以下六种覆盖测试方法属于动态分析方法:
    语句覆盖:每条语句至少执行一次;【选择足够多的测试数据】
    判定(分支)覆盖:每个判定的每个分支至少执行一次;【程序中的每一个取“真”分支和取“假”分支至少经历一次】
    条件覆盖:每个判定的每个条件应取到各种可能的值;【构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次】
    判定条件覆盖:同时满足判定覆盖条件覆盖。
    条件组合覆盖:每个判定中各条件的每一种组合至少出现一次。
    路径覆盖(最强的覆盖准则):使程序中每一条可能的路径至少执行一次

12、数据库有接触吗?事务的四大特性是什么?(ACID)
13、测试方法都有哪些?讲一下?
14、性能测试、压力测试,负载测试了解吗?讲一下?
性能测试的目的不是去找bugs,而是排除系统的瓶颈。在不同负载下(负载一定)时,通过一些系统参数(如反应时间等)检查系统的运行情况;
性能测试:通常收集所有和测试有关的所有性能,通常被不同人在不同场合下进行使用。
压力测试:是在一定的负荷条件下,长时间连续运行系统给系统性能造成的影响。
负载测试:在一定的工作负荷下,给系统造成的负荷及系统响应的时间。
负载测试是测试软件本身最大所能承受的性能测试;
压力测试就是一种破坏性的性能测试;

15.自动化测试有了解过吗?有没有用过相关的测试工具?
web自动化测试:selenium,robot framework
app自动化测试:appium, monkeyrunner, UIayuomation
pc客户端 自动化测试:QTP
接口测试:Jmeter,postman,httpunit,restclient
云测平台:Testin Testbird
性能测试:Jmeter,LoadRunner

17.路径覆盖

18、安全性测试从哪些方面考虑?怎么验证?或者说怎么设计测试用例?参考
软件安全性测试包括程序、网络、数据库安全性测试。根据系统安全指标不同测试策略也不同。
在这里插入图片描述

19、假设现在有一个政府的门户网站给你测试,你要从哪些方面、哪些测试点入手?
先查找需求–分析测试需求–指定测试计划,测试范围,和测试用例。
从界面测试,功能性测试【链接跳转,提交等】,性能测试【压力,负载,强度测试】,安全性测试【登录功能的检查,是否溢出错误,安全性检测例如SQL注入,需不需要高级的安全性检测】,兼容性测试【浏览器,操作系统,数据库等】
20、浏览器兼容性测试是做什么的?
21.静态测试时怎么给缺陷分类
22.如何找出代码的问题
23.如何进行逻辑覆盖
24.【设计测试用例】验证普通计算器的有效功能
25.测试关注的标准

4.常见问题

关于项目:
1.讲讲这个平台实现了什么功能?主要目的?然后你做的是什么工作?
2.你觉得最大的难度是什么呢?技术难点?
3.讲一下你在实习过程中或者之前的学习过程中理解最透彻的一个项目?
5.挑一个功能,完整地讲一下你的测试思路?测试设计?测试方案?
9、你实习总共发现了多少bug?bug的等级怎么确定?
1级致命【系统无法运行,主要功能模块无法使用】:常规操作引起的系统崩溃、死机、死循环,
2级严重:重要功能不能实现,非常规操作导致的程序崩溃、死机、死循环,错误的波及面广,影响到其他重要功能正常实现
3级一般【不影响产品的运行,但界面、性能缺陷】:次要功能不能正常实现;操作界面错误(包括数据窗口内列名的定义,含义不一致);删除操作未给出提示等
4级微小【操作者不方便或遇到麻烦,但它不影响功能过的操作和执行】:错别字、界面不规范等
5级建议:可以提高产品质量的建议, 包括新需求和对需求的改进

计网/操作系统等:
1.Http跟Https的区别是什么?
2.操作系统学过吗?主要讲的是什么?
3.tcp与udp的区别
4.为什么tcp是可靠传输
5.确认重传机制是怎么样的,重传哪些内容
6.栈的特点及实际应用
7.TCP/IP层次及协议
8.如何设置路由器以保证通信
9.代号404什么意思。(两遍技术面都有问)
10.信号调制解调方式,信号发送到接收过程。
11.4g和5g技术差异,5g技术为什么功耗大
12.熟悉Linux的一些命令吗
13.流量控制,拥塞控制的方法和手段
14.tcp三次握手,四次挥手,原因和过程
15.网站访问过程

套路:
1.为什么想做测试?
可以说喜欢测试需要具备一定知识面的广度,而开发算法更侧重知识的深度;喜欢与人沟通,还能敲代码等等
2.如果你发现了一个BUG,但是开发说这不是一个bug,你要怎么办?
找证据论证自己的观点,并妥善地沟通
3.反问:
部门对招进来的应届生,希望他具备什么样的能力以及技能呢?
解决方案测试工程师跟软件测试工程师的区别?.
您对我今天面试的表现有什么建议吗?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/811622
推荐阅读
相关标签
  

闽ICP备14008679号