1、自动化测试框架设计的核心,可以概括为解决以下这些问题:
1)测试数据要怎么准备,如何在框架中实现,是否可复用。
2)测试用例的批量导入。
3)用例之间是否存在逻辑关系,相互之间是否有影响,在框架中该如何处理。
4)测试执行结果的导出和查看。
5)执行失败的用例如何快速定位复现。
6)对于UI自动化,当出现异常时(如对象获取不到,无法对对象进行指定操作),框架要如何对应处理,以保证整套用例不会中断执行。
7)运用多进程和分布式管理的方式,实现在有限时间内完成大批量测试用例的执行。
8)测试结果的数据统计,生成分析图表。
您是怎么做的呢?贵公司的UI自动化框架用到了哪些工具?
答
因为以上这些问题还是比较发散式的,点题的目的主要也是为了引发大家的思考。
如果全部具体讲解的话,可能篇幅也会比较长。还是以引导的方式,提供些思考方向给大家吧:
-
在测试数据准备上,尽量做到数据可复用,便于在集成测试时可循环执行。所以可以把数据的初始化通过在数据库当中用sql语句或存储过程的方式实现,并且可以将此步骤放在自动化测试执行起始或结束处。
-
如果团队中测试人员们的技术功底较好,可以考虑直接将测试用例存放在数据库中来批量导入,内存读取效率是很高的。其次也可以把测试用例批量导入的载体换为xml或Excel文件。
-
用例之间如果存在逻辑关系,建议对用例进行分组,使各组用例之间相对独立,执行结果或产生异常也能互不影响。
-
测试执行结果的导出方式就很多了,结合业务和系统架构场景,怎么方便高效怎么来。查看上做到直观易懂就行。
-
对于执行失败的用例原因定位,最好能通过在自动化测试脚本中编辑对应的异常输出日志来定位,而不是单纯靠脚本语言自己提供的报错信息。
-
在UI自动化测试中,对于事先无法预知的异常,可以考虑通过事件触发机制来做判断,然后添加上一些比如关闭弹窗、模拟回车和退出键的操作,使得焦点恢复到主窗体,然后通过测试框架的驱动进入到下一组执行用例中。
-
目前我有一门主题为《利用Scrapy搭建分布式自动化接口测试框架》课程,讲的就是以http/s接口测试为例,通过多进程、分布式多主机并发的方式来进行自动化测试的。课件已在后期处理中,即将上线,欢迎干兴趣的小伙伴的到时候关注。
-
测试结果的统计,包含的信息可以有执行时长、总执行用例数、成功/失败执行用例比、失败用例自动retry次数、本轮执行与上轮执行的不同点统计等等。可关注的点还是蛮多的,当然也可以和项目组成员及产品经理多多交流,听听他们想关注的信息。前端动手能力强的,结合图表方式来展示,自然是更好啦!
期望以上这些信息能对大家的工作有所帮助~
2、一个优秀的自动化测试框架应该具备哪些条件?
答
出发点还是要以提高测试效率,扩大用例覆盖范围作为自动化测试的目标。
另外团队的力量一定是大于个人的。所以如果你的角色是作为测试团队中的测试开发,还要考虑到开发出来的自动化测试框架是否适用于目前团队成员及项目/产品现状,能否帮助他们改进日常的工作。(这里还要考虑到团队的技术基础。必要时对他们输出相应的培训和使用指导)
3、在我们公司测试中,无论测试环境测试还是线上回归,都不可避免的会出现大量的垃圾数据。测试环境还好,可以清空数据库(,但是生产环境无法接触到数据库。这些测试数据一条一条删起来很费力(selenium删或者手动删)。不知道您有什么好方式吗?
答
条件允许的话,如果希望测试数据尽可能接近生产环境(这点我也比较赞同),可以考虑把生产库的数据全部或部分拷贝出来,搭建到独立的自动化测试环境中,这样同样也可以避免影响到其他测试同事的数据。
在测试环境准备上,可以通过vmware或docker容器的方式,相对节省资源。
再强调一遍,独立的自动化测试环境,在执行上还是很有必要的。这块资源一般公司还是都能有条件提供的吧
4、最近也刚开始接触爬虫测试,开发写好爬虫脚本让我来测试验证,我这边的验证方法主要有两点:(1)运行爬虫脚本观察是否会出现异常,这点主要是通过查看log日志来检查的;(2)检查爬取的数据对不对,这点主要是查看数据库里的数据字段是不是全,是否都有值;不知道这个对不对?
答
你的测试方法完全可行,另外建议可以补充几点:
1、检查下最终的爬取记录总数,看是否存在爬虫执行过程中有丢包。
2、现在网站实施反爬措施的也日益增多。通常在爬取一段时间后就会被触发,所以需要跟踪观察。
3、如果遇到反爬的网站,处理机制通常会用到cookie池和ip池两种方式,可以和你的开发小伙伴一起了解下。
5、现在测试框架越来越多,如果来选择自己的测试框架,您这边有什么好的看法吗?
答
如今业内大部分公司都会选择开源框架作为主要的自动化测试工具。
相对于那些商用工具。开源的最大优势(免费呀免费!)在于对于自己公司的业务和测试需求能更好的做二次开发和个性化定制。
在选择和评估要使用的框架时,我会考虑但不局限于以下几方面:
1、选择团队大部分成员都熟悉的编程语言,这样可以促使整个团队来对自动化测试进行开发和维护;
2、如果包含知识传递,比如有业务人员和项目经理等非技术人员的参与,就得考虑框架中测试用例模块的可读性和易懂性,以便协作开发;
3、测试场景的复杂度,如业务流程和系统界面等因素,对框架的易用性和协作性有哪些要求。对应的开发、管理、维护的投入成本;
4、框架与被测系统的交互性。尤其在GUI层,确保系统容易被测试,比如给GUI元素增加标识、输出易于解析的文本、提供自动化接口等;
5、对于版本控制和持续集成的支持;
之前看过一遍文章,对目前较好的几个测试框架做了介绍,觉得不错,搬运到此分享下:
1)Robot Framework
最流行的Python自动化测试框架,可以运行在Java和.NET环境。
支持跨平台,例如Windows、MacOS和Linux。
留有API扩展空间,支持表格式的测试数据语法和关键词驱动测试。
2)RedwoodHQ
大部分流行的编程语言都可以用来编写测试,例如Java、Python、C#和likewise。
有一个网站界面,在那里多个测试人员可以在一个平台上协作和运行测试用例。
有一个内置的IDE,可以在那里创建和修改测试用例,并且并行运行。
3)Jasmine
行为驱动开发框架,适用于任何使用JavaScript的地方。
可被用于Python和Ruby自动化测试。
可以并行运行客户端测试用例和服务端测试用例。
4)Pytest
适用于复杂度较低的小项目。
提供了测试用例的详细失败信息,可以快速准确地改正问题。
包含更多功能的插件和多样化的现有测试技术和测试用例,在它的社区有300多个插件可供选择。
可以将Pytest与诸如Selenium和Splinter之类的图形用户界面一起使用。
6、证券交易柜台这块业务的自动化框架和互联网行业相比,自动化测试框架选型上面能推荐一下么?
答
不知道你说的“证券交易柜台”是那种系统架构,C/S or B/S?
如果是做UI自动化,可选的工具很多,QTP,TestComplete都可以胜任。如果是B/S架构,还可以用selenium自行开发,定制化效果更好。
如果是接口自动化测试的话,考虑到用的的协议估计不是那些通用协议,比如恒生电子就是自定义开发的交易接口协议,那只有自己开发对应的测试工具了。
7、一个项目中自动化测试是否能有效的展开,自动化测试框架是关键所在是在哪里?
答
自动化能否有效的开展,概括的讲可以从“测试用例的覆盖范围”,以及“测试执行效率”这两方面来进行考量,当然还可以加上如“自动化缺陷发现量与总缺陷量的占比”等相关统计数据来综合评估。
讲的口语化些,就是上了自动化后,产品或项目的测试范围有哪些变化或增量?执行时长比原来缩短了多少?有哪些缺陷是通过自动化测试才发现的?或者说是手工测试较难或难以发现的缺陷。
举个实际案例:
有次在调试自动化接口测试时,发现有个api接口在发送请求时,json传参里有很多和实际需求不相关的参数,虽然功能上能正常使用,也就是在做黑盒功能测试时不会觉得有什么问题,但实际上是增加了应用的资源开销。尤其在用户量达到一定量级后,性能上造成的影响就会暴露。于是提交了给开发做了优化。算是在做性能测试前提前排了个雷。
8、我通过android.widget.LinearLayout这个className定位,className是在第三个,就是说instance = 2,d(className("android.widget.LinearLayout").instance(2)).click()有报错,这一块怎么处理呢?
报错内容是:AttributeError: 'str' object has no attribute 'instance'然后我又改成:
d(className=(("android.widget.LinearLayout").instance(2))).click()也不行
简约代码:
# com.tencent.mobileqq
import uiautomator2 as u2
from time import sleep
d = u2.connect('192.168.1.129')
d.app_start("com.tencent.mobileqq")
d(text="动态").click()
sleep(4)
d(description = ("点击进入好友动态")).click()
sleep(4)
d(description=("写说说等按钮")).click()
sleep(4)
#??d(className=(("android.widget.LinearLayout").instance(2))).click()
d.text("说说").click()
sleep(4)
d(text="分享新鲜事...").set_text("flyme!")
sleep(4)
d(text="发表").click()
sleep(4)
d(description = ("返回动态 按钮")).click()
sleep(4)
d.app_stop("com.tencent.mobileqq")
答
我自己操作试了下。可以用xpath顺利执行。通常首先考虑用id,如果没有id就用xpath。通过这两种属性基本都能定位并操作对应的办法。
另外为了动态加载等待对象的时间,可以添加个WebDriverWait。比用sleep硬等待时间会更好些。
参考代码如下(部分):
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
#配置
caps = {'platformName': 'Android', 'deviceName': 'XXXX,'appPackage': 'com.tencent.mobileqq', 'appActivity': 'com.tencent.mobileqq.activity.SplashActivity','XXXX':'XXXX'}
#驱动
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
wait = WebDriverWait(driver, 30)
#定位对象并调用方法操作
xpath = u'//android.widget.TextView[@content-desc="说说"]'
shuoshuo = wait.until(EC.presence_of_element_located((By.XPATH, xpath)))
shuoshuo.click()
资源分享【这份资料必须领取~】
下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】