测试问题总结

1.Selenium

1.如何使用自动化测试工具的
Selenium+testng+maven做的自动化测试框架

2.自动化测试过程中遇到的问题
(1)元素定位不了
原因:a.页面没有加载出来
b.网速
c.页面加载速度
d.电脑性能
解决方法三种等待时间/重试机制
死等
隐式等待
显示等待

3.Selenium是怎么工作的

4.常见的元素定位,你最常用的是哪一种
宗旨:哪中简单用哪一种
css和xpath是最常见的万能定位(web)

5.上次图片有几种方式

input
audoit
第三方会增加不可靠因素

6.如何处理动态元素
xpath正则表达式包含匹配

7.在使用Selenium中遇到的最大的问题?如何解决?——测试用例的可靠性
http://blog.csdn.net/kufei123/article/details/47375065

1)误报通常是我们在使用selenium的最头疼的问题,这使得很难把selenium测试用例加入到自动构建中。有些构建是必须要成功的,如果失败将会阻塞整个发布流程。

解决方法——重试我们的解决方案是在测试步骤和测试集中都加入重试机制。

产生误报最大原因是selenium在页面加载完成之前就开始请求页面资源。

重试机制:

利用递归封装了一个等待元素的方法。其中,设置最大等待时间为1s,轮询时间为50ms,这个方法会不断轮询,直到方法执行成功或者超过设置的最大等待时间。在我们最好的一次实践中,我们把一个测试用例的误报率从10%降低到0,并且执行时间从原先的45秒降低到33秒。

其余还有元素定位问题:

我们主要通过Selenium WebDriver进行元素定位。但是会遇到两大类定位不到元素的情况:

  1. ElementNotVisible元素不可见
    对于这种情况,这个元素display = none/hidden,通过JS更改display = block来解决

  2. NoSuchElementException没有这种元素

01)最常见的:页面没有加载完全,我们就去定位这个元素。
02)动态ID无法定位元素——1)直接使用Xpath相对路径;2)根据部分元素定位
03)Iframe——switch_to_iframe
04) Alert——switch_to_alert
05)下拉框——Select标签下拉框、二次定位

8.高质量自动化脚本特点
业务和代码分离,封装性好。
用例之间耦合性低,独立性强,易于扩展维护

9.如何提高selenium脚本的执行速度?
1)优化测试用例。

尽可能不用sleep、减少使用implicityWait,而使用WebDriverWait/FluentWait,这样可以优化等待时间
减少不必要的操作步骤。
2)使用Selenium grid,通过testNG实现并发执行。

说到这里,在编写测试用例的时候,一定要实现松耦合,然后再服务器允许的情况下,尽量设置多线程实现并发运行。

3)设置等待时间、中断页面加载。如果页面加载内容太多,我们可以查看一下加载缓慢的原因,在不影响测试的情况下,可以设置超时时间,中断页面加载。

10.提高自动化脚本稳定性
首先我们要分析出不稳定的原因,然后有针对的去解决。

1)页面加载内容太多。如果页面加载内容太多,在不影响测试的情况下,我们可以设置超时时间,中断页面加载。

2)网络原因。设置等待时间,如果在响应时间内没有加载成功,则重新执行测试。

3)优化代码,减少容易冲突的函数。

4)多线程运行时,测试用例间相互影响。在并发操作时,如果用例之间的耦合性没有设计好,就会有影响。

综上所述,我们就可以用线程的方式来监控测试进程的WEB加载执行状态。

在页面会发生跳转时,启动一个Thread来监控进程的状况。
在Thread的run方法中定义一个计时器。
如果计时器超时,则可以刷新页面,计时器清零;
若此时刷新页面再次超时,则关闭当前浏览器进程,fail掉这个测试用例,继续执行其他的测试用例。

2.接口测试

3.JAVA

1.start与run
run方法只是Thread的一个普通方法的调用,而且是在主线程中执行
start方法会创建一个新的子线程并启动,通过此线程去调用run方法

2.Thread与Runnable
Runnalbe并不具有多线程的特性,它依赖Thread中的start方法去创建一个子线程,在子线程中调用Thread

中实现的run方法去执行相关的业务逻辑,才能让这个类具有多线程的特性。

Runnable中没有start方法,只有Thread中才有,Thread构造函数可以传入Runnable子类实例,我们可以通过Thread类来

启动Runnable来实现多线程。

Thread与Runnable的关系

Thread是实现Runnable接口的类,通过start给Runnable的run方法附上了多线程的特性;

因类的单一继承原则,推荐使用实现Runnable接口

(为了提升系统的可扩展性,往往使业务类实现Runnable接口,将业务逻辑封装在run方法中,便于给普通类附上多线程的特性)

3.sleep与wait
(1)sleep是Thread类的方法,wait是Object中的方法

(2)sleep方法可以用在任何地方,wait方法只能用在synchronized修饰的代码块或方法中

(3)本质区别:sleep只会出让CPU,不会导致锁行为的改变,wait不仅出让CPU,还会释放已占用的同步资源锁

比如,当前线程有锁,sleep不会让其他线程释放锁,只会主动让出 CPU,让出后就可以执行其他任务了,

wait释放锁以便其他正在等待该资源的线程得到该资源进而运行,wait必须写在synchroinzed中的原因是,

只有获取锁,才能释放锁。

notify与notifyAll

(to be fixed…)

4.对于java虚拟机中运行程序的每个对象来说,都有两个池,锁池和等待池,而这两个池又与wait,notify,notifyAll,synchroized

相关

notifyAll会让所有处于等待池的线程全部进入锁池去竞争获取锁的机会

notify只会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会。

4.Python

5.Mysql

6.网络

1.常见状态码
1xx:指示信息,表示请求已接收,继续处理

2xx:成功,表示请求被成功接收和解析

3xx:重定向,要完成请求必须进行更进一步的操作

4xx:客户端错误,请求有语法错误或请求无法实现

5xx:服务端错误,服务器未能实现合法的请求

常见状态码

200 OK:正常返回信息

400 Bad Request: 客户端请求有语法错误,不能被服务器理解

401 Unauthorized: 请求未经授权,这个状态必须和WWW-Authenticate报头域一起使用

403 Forbidden: 服务器收到请求,但是拒绝提供服务

404 Not Found:请求资源不存在,输入了错误的RUL

500 Internal Server Error: 服务器发生不可预期的错误

503 Server Unavailable: 服务器当前不能处理客户端请求,一段时间后可能恢复正常

201 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回
202 服务器已接受请求,但尚未处理
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

401 当前请求需要用户验证。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书
403 服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交
404 请求失败,请求所希望得到的资源未被在服务器上发现
500 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
501 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复

2.TCP的三次握手和四次挥手

7.用例设计

你可能感兴趣的:(面试)