如何实现前端项目的自动化测试?

这其实就是我们常说的“UI自动化测试”,针对这个问题,我先告知答题思路如下:

1、什么是UI自动化?有什么优势?
2、UI自动化实践中会遇到什么难题?
3、如何解决难题,将UI落实到实践中?【重点】
4、UI自动化学习资料推荐

一、什么是UI自动化?为什么使用UI自动化?

1、什么是UI自动化?

本质上来说,UI自动化测试,就是通过脚本或工具代替人工去执行功能测试用例,自动完成测试用例的执行工作。常用于验证用户界面的功能、兼容和稳定性等,主要用于执行回归测试。

UI自动化测试,可以模拟用户与应用程序或网站的交互,自动执行用户界面上的操作,如点击按钮、输入文本、选择选项等,并检查应用程序或网站的响应和行为是否符合预期,在软件开发过程中帮助检测是否存在bug。

图片

2、UI自动化有什么优势?

UI自动测试可以模拟人工执行测试,是最接近用户真实操作的测试方法,这是UI自动化测试最吸引人的地方,那么UI自动化测试还有下面这些优势:

优势1:提高测试效率。

相比手动测试,UI自动化测试可以快速、准确地执行大量的测试用例,提高测试效率,减少人工测试的工作量。

优势2:提高测试覆盖率。

UI自动化测试可以覆盖应用程序或网站的各个功能和页面,确保每个功能都经过测试,提高测试覆盖率,减少漏测的风险。

优势3:提高测试一致性。

UI自动化测试可以确保在不同平台、浏览器或设备上的测试执行一致,减少人工测试的主观因素,提高测试的一致性和可靠性。

优势4:提高软件质量。

UI自动化测试可以帮助检测和修复应用程序或网站中的错误和缺陷,提高软件质量,减少软件发布后的问题。

但UI自动化测试在实战中却像是“带刺的玫瑰”。因为它能模拟用户真实的操作应用程序或前端网站,是最贴近用户真实行为的模拟测试,但是因为实践中的一些难题,导致UI自动化容易投入很大,却没有取的很好的效果。

二、UI自动化实践中会遇到什么难题?

有些人说UI自动化没有啥用,主要是UI自动化在实际应用中会遇到一些难题,导致没有取的很好的效果,UI自动化测试目前主要面临下列这些挑战:

1.UI自动化测试的投入产出比低。

想要取得好的效果,必须前期投入较大在资源进行脚本开发,但是往往后期使用时没有取的预想的效果,容易导致投入中断?

2.保障脚本的维护是个大问题。

项目频繁的迭代,导致前端页面变化很快,对应的脚本得不断的修改,如何保障脚本的维护是个大问题。

3.UI自动化测试的稳定性也是个挑战。

脚本执行时经常遇到各种奇奇怪怪的Bug,如何保障脚本的稳定性是个头疼的问题。

三、实践中如何解决以上4个难题?【重点】

实际过程中,以上4个难题该如何进行优化呢?咱们以前端的web UI自动化为项目,以Python+Selenium框架为背景,来看下项目若要执行自动化测试,应该怎么搞。

优化1:如何保障投入产出比?

很多人搞UI自动化测试没有想清楚到底要怎么搞?上来就拿个框架,先搞起来再说,投入了很多人力物力,然后搞到一半时却发现很多问题,最后就完犊子了。。。

所以开始前,需要做好规划,要明确目标。如果是新起动的UI自动化测试,建议可以先选好框架,然后选择一个业务流程作为案例,以该案例为目标去执行框架的搭建和脚本的开发,完成开发后主要投入回归测试当中,看看实际执行的效果如何,然后统计投入的时间和人力成本,然后再进行下一步的推进。

优化2:如何保障脚本的维护?

当前项目都是频繁迭代的,这是不可改变的事实,所以脚本写完后一定需要维护修改。

基于这个事实,我们能优化的就是减少修改的次数,在UI自动化中,最常用的优化方法就是使用PO模式进行封装。

那什么是PO模式呢?

PO,是Page Object的缩写,简单来说,就是将前端项目中的每个页面封装为一个“类”,页面上的元素都封装为实例的“属性”,页面上的功能操作都封装为实例的“方法”。

这样封装后,无论将来页面怎么变化,我们只需要修改一次即可,可以大大的提升维护的效率。

图片

PO模式是自动化测试项目开发实践的最佳设计模式之一

优化3:如何保障脚本执行的稳定性?

UI自动化脚本执行时可能会遇到各种问题,比如浏览器启动时间过长,比如页面加载过长,比如图片被挡住等等,你无法预知。

优化方法,除了我们常用的各种显式或隐式等待处理外,我们还可以对原始的api进行封装。比如以Web UI常用的Selenium框架为例,当我们等待某个元素出现时,为了保障成功性,需要对“等待”做一个封装。除了显示等待外,还可以进一步优化,做个循环处理,就是等待3次,每次等待失败后可以重新刷新等待。

比如封装一个“等待元素”出现,确保可以点击的方法,如下所示:

 
  1. def element_click_wait(self, located_type, located_key, assert_condition=None, message="执行点击超时",time_out=10, refresh=False):

  2. """

  3. 【适用于页面跳转时等待元素出现,确保可以点击的场景】

  4. 等待1个元素点击是否正常,并验证点击是否成功,每隔一段时间轮询点击1次,直到超时抛出异常为止

  5. @:param located_type 定位方式(8种:id name class tag link plink xpath css)

  6. @:param located_key 定位关键字

  7. @:param assert_condition 验证点击是否完成的断言条件语句【默认不验证点击是否成功】

  8. @:param message 点击失败提示信息

  9. @:param time_out 等待时长,默认为10秒

  10. @:param refresh 刷新标志,如果为True,则在等待超时后,刷新页面,重新再执行一轮等待执行(相当于刷新后重新执行一次)

  11. 如果是False,则不执行刷新,直接超时报错

  12. """

  13. driver = self.driver

  14. is_type_true = 0 # 用户判断定位方式参数是否正确

  15. for i in range(int(time_out)*2): # 循环次数为配置的2倍,以便处理刷新重试的情景

  16. try:

  17. time.sleep(1)

  18. if located_type == "id":

  19. driver.find_element_by_id(located_key).click()

  20. elif located_type == "name":

  21. driver.find_element_by_name(located_key).click()

  22. elif located_type == "class":

  23. driver.find_element_by_class_name(located_key).click()

  24. elif located_type == "tag":

  25. driver.find_element_by_tag_name(located_key).click()

  26. elif located_type == "link":

  27. driver.find_element_by_link_text(located_key).click()

  28. elif located_type == "plink":

  29. driver.find_element_by_partial_link_text(located_key).click()

  30. elif located_type == "xpath":

  31. driver.find_element_by_xpath(located_key).click()

  32. elif located_type == "css":

  33. driver.find_element_by_css_selector(located_key).click()

  34. else:

  35. is_type_true = 1

  36. except:

  37. if i == (int(time_out)-1): # 第1次循环到点判断

  38. if refresh: # 执行刷新后重新再执行1轮

  39. refresh = False

  40. self.element_refresh_wait() # 刷新页面

  41. continue

  42. else: # 不执行刷新重试

  43. AutomationLog.LogMsg("点击失败,第1次等待超时啦!---【"+located_type+","+located_key+"】", 2)

  44. raise ex.TimeoutException(message)

  45. elif i == (int(time_out)*2-1): # 刷新后再执行1轮还是失败了

  46. AutomationLog.LogMsg("点击失败,第2次等待也超时啦!---【" + located_type + "," + located_key + "】", 2)

  47. raise ex.TimeoutException(message)

  48. elif assert_condition: # 正常执行循环(验证点击是否成功,成功则结束循环,否则继续循环)

  49. try:

  50. WebDriverWait(driver, 1).until(assert_condition)

  51. break

  52. except:

  53. continue

  54. else: # 正常执行循环(不验证点击结果)

  55. continue

  56. if is_type_true == 1:

  57. AutomationLog.LogMsg("定位方式写错啦,请检查located_type参数!---【" + located_type + "】", 2)

  58. raise ex.InvalidArgumentException("定位方式参数出错!")

  59. elif assert_condition: # 正常执行循环(验证点击是否成功,成功则结束循环,否则继续循环)

  60. try:

  61. WebDriverWait(driver, 1).until(assert_condition)

  62. break

  63. except:

  64. continue

  65. else: # 正常执行循环(不验证点击结果)

  66. break

当然,除了以上的实践经验,其他比如还可以找开发配合,对要测试的常用UI元素进行id的编码,这样也可以大大提升成功的效率,轻松解决定位的问题等。

四、UI自动化学习资料推荐

UI自动化分为web自动化和app自动化。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值