前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >传统Web自动化框架实践指南

传统Web自动化框架实践指南

作者头像
iTesting
发布于 2021-01-28 07:56:55
发布于 2021-01-28 07:56:55
47700
代码可运行
举报
文章被收录于专栏:iTestingiTesting
运行总次数:0
代码可运行

iTesting,爱测试,爱分享

我们今天来看看一个成熟的Web自动化框架是什么样子的,如果你还对测试框架的概念有所疑惑,请移步iTesting公众号的历史文章测试框架之我见

以下是Web自动化框架实践正文:

贴一个图,是iTesting现在所在项目用的框架(实则为笔者4年前项目所有框架),我们来一步步分析说明:

注意观察图中每一个小方格右上方的数字,从1 到7,代表了测试框架的不同部分,我们来逐一介绍:

0:Core Framework。

这个是测试框架的灵魂,我们可以看出它又分为几个部分,最底层就是Selenium, Webdriver,包括它们支持的原生库。倒数第二层是支持最底层的第3方库,二次开发生成的自定义库,API还有自己定义的Keywords。再上一层是一些公共的方法,这些方法普遍应用倒数第2层的API或者Mehod,这一层的方法实现了具体的功能,微信搜索iTesting,关注本公众号,比如说连接数据库,并进行增删改查的功能;连接Web Service并调用相应接口的功能;自动生成要运行的所有测试用例的功能;自动注释掉一些测试用例的功能。最上一层是解耦的测试脚本,每一个测试脚本完成一项特定的功能,比如,登录,定课,注销等。

1:Config File

Config file用来提供测试运行时的各种参数,配置。

这个文件或者文件夹存放了测试需要的precondition,settings,运行环境参数,还有运行每一个具体case时候需要的测试数据。

测试所需的共同的配置可以放到一个文件里(例如Timeout,多线程支持标志位),环境运行参数可以放到另外一个文件里(例如UAT, LIVE),测试数据可以保存在Excel, XML,或者直接写在文件里,以环境运行参数为分隔符(例如UAT和Live下都有同一个变量名username)。

2:AUT application under test

这个模块就是我们要测试的application。它分为2个部分:

一个部分是Pages(2-2), 即各个待测试页面。Pages里包含了页面上所有的待测元素,以及这个页面上的所有用户能做的操作,我们通常把这些操作封装成一个个的函数,以使它们来实现特定的功能,例如book_pl_class(class_info)函数,这个函数接受一个入参,入参是一个Entity 类,包括了一节课所有必要信息,函数本身实现了pl class的预订(通过接收参数,点击相应元素等操作)。函数返回值是一节课的所有信息。应注意的是Pages里不应该包含测试用例逻辑,所有的特定测试逻辑应该与页面具体操作解耦。

Pages我们引用了Page Object模式(将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理),这个模式的好处是将测试方法和测试对象完全解耦,我们举个例子, 在使用page object模式之前我们的代码可能是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def login(self, user_name, password):
    user_element = self.browser.find_element_by_id("username")
    user_element.send_keys(user_name)
    password_element = elf.browser.find_element_by_id("password")
    password_element.send_keys(password +Keys.RETURN)

login方法和各个element对象(这里只有username 和password这两个element)耦合在一起,当UI改变导致element的定位方式改变后,我们不得不去方法内部更改元素定位的方法,另外当某个元素在不同方法重复使用时,还需要反复查找。这样引发的问题是,当一个方法需要很多页面元素操作才完成时, 定位元素的大量代码和方法实现的功能代码耦合在一起,不仅更改起来困难,而且方法不直观,不便于用户理解。

我们来看引入了page obejct后代码变成了什么:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
USER_NAME_XPATH = "//input[@id='UserName']"
PASSWORD_XPATH = "//input[@id='Password']"
LOGIN_XPATH = "//a[@class='et-btn-submit']")

user_name_textbox = PageElement(xpath=USER_NAME_XPATH)
password_textbox = PageElement(xpath=PASSWORD_XPATH)
login_button = PageElement(xpath=LOGIN_XPATH)

def login(self, user_name, password):
     self.user_name_textbox.send_keys(user_name)
     self.password_testbox.send_keys(password)
     self.login_button.click()

你看,只要login的功能逻辑不变,就无需更改login方法,任凭UI如果改变,我们只需要在方法外更改element的locator,无论username这个元素需要多少函数中引用,我们只需定义一次就好了,是不是很方便维护又一目了然啊。

还有,测试过程中经常发现这样的问题,页面一开始就redirect到了非目标页面,因为我们没有针对目标页面本身做断言,导致代码继续执行,这样浪费了大量时间。我们可以通过验证目标页面正确与否的方法来避免这个问题。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class LoginPage(AbstractBasePage):
   Target_XPATH = "//a[@class='et-btn-submit']"

   def __init__(self, driver):
        AbstractBasePage.__init__(self, driver)

    def is_target_page(self):
        return self.is_element_displayed(By.XPATH, self.Target_XPATH)
代码语言:javascript
代码运行次数:0
运行
复制

这里我们利用了一个BasePage的类,里面定义了 is_target_page的抽象方法,然后子类继承过来实现。

关于Pages还要很多好的优化方法,可以使我们的代码看起来简单可重用,这里不详细介绍细节了。

另一部分就是Test scenarios(2-1),即具体的测试suite和测试用例,Test scenarios由一个个test case组成,每一个test case 通过引用相应的Pages类/函数,和Core framework 里面的test scripts,来实现具体的功能, 而Test scenarios通过组合不同的test cases来覆盖不同的业务需求.

其中, Test Scenarios/Test case 里均会用到 config file的各种参数配置。

所有的Test Scenarios创建好后(我们把每个test scenario封装成一个测试类), 就要决定如何执行这些测试类了。那么,这些测试类每次运行都需要全部执行吗?如果不需要,哪些是需要执行的,哪些是要ignore的呢?这个时候Core framework里的common method的具体Method派上了用场,common里实现了generate_test_scenarios的方法和ignore_test_scenarios方法,利用ignore_test_scenarios方法,我们会在tests文件夹下面的ignore_testcase_lists文件里列出所有要ignore的test scenarios,然后利用generate_test_scenarios方法我们最终把所有要执行的scenarios都放到__init__ 里。

3:Main file。测试主函数。

测试主函数用来执行生成的各种Test Suites, 包括实现多线程支持和错误处理机制。它也是测试的入口函数。需要注意的是, Main 函数会装载 Test下面的__init__文件,所有在__init__文件里的用例都会被执行(是顺序还是同时要看函数中对多线程的支持及实现)。

4:Test Report模块。

Main 函数同时也会包含生成test report的方式,测试完成后,会根据需要生成txt格式,html格式test report并保持到系统本地。

5:Error Handling模块。

测试运行中,如果发现错误,会根据Error handling规则触发相应的错误处理机制,同时会触发screen shots函数和log函数,把所有错误截图和log信息保存在系统本地。

6:Email Reports。

测试报告Email发送模块,这个模块可以在第7步里开发配置,也可以直接把代码写在Main 函数里,运行完随机发送测试报告。

7:Jenkins持续集成

利用Jenkins,驱动Main 函数,实现每日构建,代码改动构建。并集成Test report模块,Email Report模块,实现测试框架的闭环。

我们再来看一下这个框架的文件结构:

其中,a**20, common, **_common对应 0:core framework,pages,entity , tests对应2:AUT,setings,对应 1:config file。Main函数及report,screenshots等位于 **_common下。

以上就是iTesting项目组测试框架的使用情况,为了更好的理解测试框架,iTesting利用Python里的unittest和前文中测试框架设计思想,重新设计了一个简化版的测试框架,可以帮助你快速上手测试框架,请添加小助手微信BetterThinkBig获取。


- - 时人莫小池中水, 浅处不妨有卧龙 - -

作者: Kevin Cai, 江湖人称蔡老师。 两性情感专家,非著名测试开发。 技术路线的坚定支持者,始终相信Nobody can be somebody。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iTesting 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
搭建一个自动化框架(一)
很多时候,你会自动化,录制并不能说明什么,录制只是为了提高效率,关键是要搭建框架。会框架就可能成为架构师,将框架搭建起来后就可以给其他组员分配任务了。大家按照一定的规则,将自动化规模扩大,业务覆盖全,这样就可以代替手工测试了。 前面讲了如何录制,讲了一个最简单的框架。那我们现在动手搭建一个简单的自动化测试框架。 这里先介绍一下框架整体的功能,然后每个模块大概讲讲。 当然我搭建的框架不一定是很完美的。
赵云龙龙
2021/04/23
6310
搭建一个自动化框架(一)
web自动化测试进阶篇03 ———自动化并发测试应用
web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持,其整体的完整生态已经远远超过了C/S架构方面的测试价值。
Austin_zhai
2023/07/25
5530
web自动化测试进阶篇03 ———自动化并发测试应用
《一头扎进》系列之Python+Selenium框架设计篇2- 价值好几K的框架,不看白不看,看了还想看
  上一篇介绍了自动化框架的架构,今天宏哥就带领小伙伴或者童鞋们开始开工往这个框架里开始添砖加瓦。主要是介绍一个框架unittest单元测试框架和一种设计思想POM。
北京-宏哥
2019/12/20
1.4K0
《一头扎进》系列之Python+Selenium框架设计篇2- 价值好几K的框架,不看白不看,看了还想看
Selenium4+Python3系列(十二) - 测试框架的设计与开发
整个框架的实现,大约也就1.5天,关于框架的开发并不是很难,主要难在测试报告增加失败自动截图功能和echart的饼子图统计功能,两者的整合花了近半天的时间吧。
软件测试君
2023/02/24
6351
Selenium4+Python3系列(十二) - 测试框架的设计与开发
面试被问selenium自动化模型,你了解多少?
自动化测试模型可以看作自动化框架与工具设计得思想。自动化不仅仅式单纯的写写脚本运行就可以了,还需要考虑如何使脚本运行效率提高,代码复用、参数化等问题。自动化模型主要分为四大类:线性模型,模块化驱动,驱动数据,关键字驱动。
全栈程序员站长
2022/06/29
4920
面试被问selenium自动化模型,你了解多少?
你不知道的Cypress系列(2) -- ”该死"的PO模型​!
自从我的新书<前端自动化测试框架 -- Cypress从入门到精通>上市以来,这本书受到了大量同学热情的追捧和讨论。在跟同学们的交流中,我也了解到, 原来除了国外优秀的公司(例如Adobe, 迪士尼,AutoDesk等等), 国内也有很多公司在尝试使用Cypress提升测试效率。而在Cypress中国群内、在公众号iTesting里,我每天都能看到大量关于Cypress的使用讨论和私下问询。这让我感到无比荣幸。(买了书的同学们,公众号回复你的微信号,拉你到Cypress中国群)。
iTesting
2021/01/04
2.4K1
Selenium Web自动化测试——基于unittest框架的PO设计模式
  前面一直在讲接口自动化测试框架与案例分享,很少讲Selenium这个Web自动化测试神器。它主要用来做UI自动化测试,大家都知道UI自动化测试成本相当高,一般的Web自动化测试我是一直不建议做的。
全栈测试开发日记
2023/02/02
1.2K0
Selenium Web自动化测试——基于unittest框架的PO设计模式
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
虫无涯
2024/11/12
2880
Pytest框架Fixture+Parametrize参数化应用篇
就拿小编实际项目中的管理台登录界面测试作为案例,代码浅而易学,前半部分是Fixture,后半部分是Parametrize
测试小兵
2021/01/20
6190
聊聊UI自动化的PageObject设计模式
当我们开发UI自动化测试用例时,需要引用页面中的元素(数据)才能够进行点击(动作)并显示出页面内容。如果我们开发的用例是直接对HTML元素进行操作,则这样的用例无法“应对”页面中UI的更改。
互联网金融打杂
2022/05/09
7880
WebUI 自动化测试的经典设计模式:PO
先来看下未使用 PO(PageObject) 设计模式下的代码,以网页版百度登录为例来说明。
Wu_Candy
2022/07/04
1.1K0
页面对象设计模式详解
在前面的技术文章中已经很系统的介绍了UI自动化测试的技术栈的知识体系,但是在维护的成本而言还是需要考虑进一步的优化,那么我们可以使用页面对象设计模式,它的优势具体可以总结为如下:
无涯WuYa
2021/12/02
9940
页面对象设计模式详解
web自动化测试进阶篇05 ——— 界面交互场景测试
🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。
Austin_zhai
2023/09/11
3870
web自动化测试进阶篇05 ——— 界面交互场景测试
利用人工智能ChatGPT自动生成基于PO的数据驱动测试框架
PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类,并以页面为单位来写测试用例,实现页面对象和测试用例的分离。
霍格沃兹测试开发Muller老师
2024/07/31
1260
自研测试框架ktest介绍(适用于UI和API)
在自动化测试的过程中,测试框架是我们绕不过去的一个工具,无论你是不需要写代码直接改动数据生成脚本,还是你需要检查测试结果甚至持续集成,测试框架都在发挥它的作用。
测试开发社区
2019/10/09
1.1K0
自研测试框架ktest介绍(适用于UI和API)
Java自动化测试(web自动化测试框架 28)
http://120.78.128.25:8765/Admin/Index/login.html
zx钟
2020/09/14
2.5K0
大模型与自动化:让AI成为你的全能助手
在数字化飞速发展的今天,人工智能(AI)已经成为我们生活中不可或缺的一部分。其中,大模型技术的突破为自动化领域带来了前所未有的机遇,让AI从简单的工具转变为真正的全能助手。本文将深入探讨大模型在自动化中的应用,结合实际代码实例,展示如何利用大模型技术提升自动化效率。
江南清风起
2025/03/22
1610
接口测试框架实践(Python)
2,3年以前给大家分享过如何用jmeter做接口测试,但工具毕竟有限制,所以在真实的项目中,大家还是用自研的框架多。 我之前写过一个简单的基于unittest+request的接口测试框架,也分享给大家过,最近在免费直播中我也有讲到,但直播毕竟讲不透彻,还是有很多同学不是特别清楚,到底如何做一个接口测试框架,今天我们再次详细解释下,如何生成自己的接口测试框架。
iTesting
2019/10/29
9780
接口测试框架实践(Python)
Appium PO模式UI自动化测试框架——设计与实践
相信做过测试的同学都听说过自动化测试,而UI自动化无论何时对测试来说都是比较吸引人的存在。相较于接口自动化来说它可以最大程度的模拟真实用户的日常操作与特定业务场景的模拟,那么存在即合理,自动化UI测试自然也是广大测试同学职业道路上必不可少的必修课题之一了。
Austin_zhai
2022/11/01
1.2K0
Appium PO模式UI自动化测试框架——设计与实践
Selenium 自动化综合实践
无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。
清风穆云
2021/08/09
3900
推荐阅读
相关推荐
搭建一个自动化框架(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验