测试面试题

linux

网络基础

tcp/ip协议
应用层 代码层,http
传输层 tcp udp
网络层 ip port
数据链路层 arp协议(通过ip地址获取mac地址)
物理层

http/https
get/post
session/cookie/token

线程:

from threading import Thread
import time

def sayhi(name):
    time.sleep(2)
    print('%s',name)

if __name__ == '__main__':
    t=Thread(target=sayhi,args=('zhangyang',))
    t.start()

  	print('zhu')

算法

	冒泡排序:
	l = [2, 1, 22, 553, 565, 3]
	for i in range(len(l) - 1) :
	    for y in range(len(l) -1 -i):
	        if l[y] > l[y+1]:
	            l[y],l[y+1] = l[y+1],l[y]
	print(l) #[1, 2, 3, 22, 553, 565]
快速排序:
def quick_sort1(b):
    """快速排序"""
    if len(b) < 2:
        return arr
    # 选取基准,随便选哪个都可以,选中间的便于理解
    mid = arr[len(b) // 2]
    # 定义基准值左右两个数列
    left, right = [], []
    # 从原始数组中移除基准值
    b.remove(mid)
    for item in b:
        # 大于基准值放右边
        if item >= mid:
            right.append(item)
        else:
            # 小于基准值放左边
            left.append(item)
    # 使用迭代进行比较
    return quick_sort1(left) + [mid] + quick_sort1(right)


实现100以内的斐波那契数列:
l = [0,1,1,2,3,5,8,13,]

a = 0	
b = 1
while a < 100:
    print(a)
    a, b = b, a + b

登录用例
正向逻辑,流程
接口关联:
可以根据接口测试框架的搭建来说,提取关键字,保存在yaml文件中,后续用从中取值
jmeter取样器 结果树

反射:Chrome Ie Firefox

配置: browser_type = 'Chrome'
	if browser_type = conf['browser_type']
		browser = getattr(webdriver,browser_type)

自动化测试相关面试题:

1、你会封装自动化测试框架吗?

核心框架就是关键字驱动(封装常用的一些方法)+数据驱动(xlxs表格,yaml管理用例数据,unittest-ddt数据驱动)
pom设计模型,基础封装层BasePage类,POM页面对象层,测试用例层,一些工具类,日志处理,测试报告,配置文件。

3、请描述一下自动化测试流程?
编写自动化测试计划
设计自动化测试用例
编写测试框架,脚本
调试维护脚本
无人值守测试
后期脚本维护(添加用例,开发更细版本)

4、自动化测试用例如何编写?以下答案二选一即可:
用例是自动化工程师自己设计的,一般刚开始已基本业务流程为主
从系统测试用例中提取,或由业务工程师提供

5、上一个项目中自动化测试的执行策略?
上一个项目中是定时执行的,设置的执行时间是晚上12点,执行完毕后会自动发送邮件通知

6、自动化测试发现BUG多吗?
不多,因为之前项目组是把已经测试通过的基本功能再进行自动化脚本编写和在后续版本执行自动化测试
主要是保证已经测试通过的功能在新版本更新迭代后没有问题

7、你觉得自动化测试的价值在哪里?你们公司为什么要做自动化测试?
引用自动化测试之后,能代替大量繁琐的回归测试工作,把业务测试人员解放出来,既而让业务测试人员把精力集中在复杂的业务功能模块上,自动化测试一般是对稳定下来的功能进行自动化,保证不会因为产品的更新导致之前稳定下来的功能出现BUG

8、自动化测试有误报过bug吗?产生误报怎么办?

有误报过,有时候自动化测试报告中显示发现了bug,实际去通过手工测试去确认又不存在该bug。
误报原因一般是:
1.元素定位不稳定,需要尽量提高脚本的稳定性;
2.开发更新了页面但是测试没有及时更新维护!

9、自动化测试过程中,你遇到了哪些问题,是如何解决的?
1.频繁地变更页面,经常要修改页面对象类里面的代码
2.自动化测试偶尔出现过误报
3.自动化测试结果出现覆盖的情况:Jenkins根据时间建立文件夹
4.自动化测试代码维护比较麻烦
5.自动化测试进行数据库对比数据

10、在上一家公司做自动化测试用的什么框架?

可以说出以下自己擅长的一种:
1.python+selenium+unittest+htmltestrunner
2.python+selenium+pytest+allure

  1. robotframework+Selenium2Library

12、在selenium自动化测试中,你一般完成什么类型的测试?自动化覆盖率?
主要是冒烟测试和回归测试。回归测试主要写一些功能稳定的场景,通过自动化手段去实现,节约测试时间。因为自动化测试用例也是在不断的更新和迭代,没有刻意去统计,大概在30%-40%左右!

13、在执行脚本过程,如何实现当前元素高亮显示?
这个其实就是利用javaScript去修改当前元素的边框样式来到达高亮显示的效果,

14、如果一个元素无法定位,你一般会考虑哪些方面的原因?
1.页面加载元素过慢,加等待时间
2.页面有frame框架页,需要先跳转入frame框架再定位
3.可能该元素是动态元素,定位方式要优化,可以使用部分元素定位或通过父节点或兄弟节点定位。
4.可能识别了元素,但是不能操作,比如元素不可用,不可写等。需要使用js先把前置的操作完成,

15、元素定位方法你熟悉的有哪些?
id name classname tagname link_text css xpath

16、遇到frame框架页面怎么处理?
先用driver.switch_to.frame()跳转进去frame,
然后再操作页面元素,
操作完后使用driver.swith_to.default_content()跳转出来

17、遇到alert弹出窗如何处理?
使用driver.switch_to.alert方法先跳转到alert弹出窗口
然后再通过accept点击确定按钮,通过dismiss点击取消难,通过text()获得弹出窗口的文本。

18、如何处理多窗口?
这个多窗口之间跳转处理,我们在项目中也经常遇到。就是,当你点击一个链接,这个链接会在一个新的tab打开,然后你接下来要在新tab打开的页面查找元素,
1.我们在点击链接前使用driver.current_window_handle获得当前窗口句柄。
2.再点击链接。点击后通过driver.window_handles获得所有窗口的句柄,
3.然后再循环找到新窗口的句柄,然后再通过driver.switch_to.window()方法跳转到新的窗口。

19、怎么验证元素是enable/disabled/checked状态?

定位元素后:分别通过isEnabled(),isSelected(),isDisplayed()三个方法进行判断。

20、 如何处理下拉菜单?
在Selenium中有一个叫Select的类,这个类支持对下拉菜单进行操作。使用方法如下:

1.定位元素
2.把定位的元素转化成Select对象。
sel = Select(定位的元素对象)
3.通过下标或者值或者文本选中下拉框。
sel.select_by_index(index);
sel.select_by_value(value);
sel.select_by_visible_text(text);

21、在日历这种web 表单你是如何处理的?
首先要分析当前网页试用日历插件的前端代码,看看能不能通过元素定位,点击日期实现,如果不能,可能需要借助javascript。还有些日历控件一个文本输入框,可以直接sendKeys()方法来实现传入一个时间的数据。

22、举例一下说明一下你遇到过那些异常
常见的selenium异常有这些:

NoSuchElementException:没有该元素异常
TimeoutException : 超时异常

ElementNotVisibleException :元素不可见异常
NoSuchAttributeException :没有这样属性异常
NoSuchFrameException :没有该frame异常

23、关闭浏览器中quit和close的区别
简单来说,两个都可以实现退出浏览器session功能,close是关闭你当前聚焦的tab页面,而quit是关闭全部浏览器tab页面,并退出浏览器session。知道这两个区别,我们就知道quit一般用在结束测试之前的操作,close用在执行用例过程中关闭某一个页面的操作。

24、在Selenium中如何实现截图,如何实现用例执行失败才截图
在Selenium中提供了一个get_screenshot_as_file()的方法来截图的,一般结合try/except捕获异常时使用,进行错误截图。

25、如何实现文件上传?

定位元素后,直接使用send_keys()方法设置就行,参数为需要上传的文件的路径。

26、自动化中有哪三类等待?他们有什么特点?
1.线程等待(强制等待)如time.sleep(2):线程强制休眠2秒钟,2秒过后,再执行后续的代码。建议少用。
2.imlicitlyWait(隐式等待)会在指定的时间范围内不断的查找元素,直到找到元素或超时,特点是必须等待整个页面加载完成。
3.WebDriverWait(显式等待)通常是我们自定义的一个函数代码,这段代码用来等待某个元素加载完成,再继续执行后续的代码

27、你写的测试脚本能在不同浏览器上运行吗
当然可以,我写的用例可以在在IE,火狐和谷歌这三种浏览器上运行。实现的思路是封装一个方法,分别传入一个浏览器的字符串,如果传入IE就使用IE,如果传入FireFox就使用FireFox,如果传入Chrome就使用Chrome浏览器,并且使用什么浏览器可以在总的ini配置文件中进行配置。需要注意的是每个浏览器使用的驱动不一样。

28、什么是PO模式,为什么要使用它
PO是Page Object 模式的简称,它是一种设计思想,意思是,把一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为,PO模式一般使用三层架构,分别为:基础封装层BasePage,PO页面对象层,TestCase测试用例层

import pytest

@pytest.fixture(scope="function")
def login():
	print('login')

class TestCase(object):
	def test_1(self,login)
		print('')

	def test_2(self):
		print('')

if __name__ == '__main__':
	pytest.main(["-s","login.py"])
import unittest,ddt
data_list = [
    {"url": "https://cnodejs.org/api/v1/topics", "method": "get"},
    {"url": "https://cnodejs.org/api/v1/topic/5433d5e4e737cbe96dcef312", "method": "get"},
    {"url": "https://cnodejs.org/api/v1/topic_collect/collect", "method": "post"},
    {"url": "https://cnodejs.org/api/v1/topic_collect/de_collect", "method": "post"},
    {"url": "https://cnodejs.org/api/v1/user/alsotang", "method": "get"},
    # {"url": "https://cnodejs.org/api/v1/message/mark_all", "method": "post"},
]
@ddt.ddt
class MyCase(unittest.TestCase): #必须继承这个类
	@ddt.data(*data_list)
	def test_1(self,item):
		  response = requests.request(
            url=item['url'],
            method=item['method']
        )
        self.assertEqual(response.status_code, 200)

if __name__ == '__main__':
    suite = unittest.makeSuite(testCaseClass=MyCase, prefix='test')
    with open('./report.html', 'wb') as f:
        HTMLTestRunner.HTMLTestRunner(
            stream=f,
            title='ddt示例报告',
            description='演示ddt和HTMLTestRunner结合用法',
            verbosity=2,
        ).run(suite)

    #单独加用例
    test_obj=map(func,['test_1','test_2'])    
	s_obj=unittest.TestSuite(tests=test_obj)
	# s_obj.addTest()

参考:https://www.cnblogs.com/mrjade/p/12737889.html

原文地址:https://www.cnblogs.com/hanfe1/p/14648971.html