自动化测试基础篇:Selenium 框架设计(POM)

news2024/9/28 5:23:13

【导语】Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。本文介绍selenium的框架设计。

自动化测试框架

1.什么是自动化测试框架

简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境。自动化测试框架能够提供很多便利给用户高效完成一些事情。

框架具有以下一些优点:

1)代码复用

2)最大覆盖率

3)很低成本维护

4)很少人工干预

5)简单报告输出

2.常见的测试框架分类

1)基于模块的测试框架

2)基于库(Library)结构测试框架

3)数据驱动测试框架,和QTP很像

4)关键字驱动测试框架,也是QTP过来的

5)混合测试框,3 4和综合

6)行为驱动开发测试框架

3.框架基本组件

1)需要配置文件管理

2)业务逻辑代码和测试脚本分离

3)报告和日志文件输出

4)自定义的库的封装

5)管理、执行脚本方式

6)第三方插件引入

7)持续集成

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

解释:

我们需要一个配置文件去控制一些,环境信息,开关,配置文件可以是txt/xml/yaml/properties/ini,一般.properties使用较多在JAVA里,本文是Python系列,我可能会选择ini文件。

业务逻辑代码和测试脚本分离,不像我们刚开始学习Selenium那样,代码和脚本在一个类文件里演示。我们根本没有用到代码重构,复用。代码和用例文件分离后,更加清晰,去多人开发脚本,方便调试。

报告和日志文件输出,你执行了多少case,case结果如何,这都需要报告来展示,一般采用第三方插件来实现这个功能,好多报告格式是html,简单,明了的风格。日志输出也很重要,如果发生报错,脚本执行失败,通过日志快速定位发生问题位置。

用户自定义库,这个很好理解,我们很多功能需要重复调用,这样我们就写成一个公用方法,放到工具包下,每次方便调用,例如浏览器引擎类和basepage.py的封装。

管理和执行脚本的方式,例如Python中单元测试框架unittest使用率非常高。

第三方插件,有时候,我们一些功能,需要借助第三方插件,能够更好实现,例如AutoIT,来实现文件上传和下载。还有利用第三方报告插件生成基于html格式的测试报告。

持续集成,git,svn,ant,maven,jenkins,我们会把这整合到jenkins,达到持续集成,一键执行测试脚本。

根据以上的特点介绍,我大致用以下图来描述一下,一个简单的自动化测试框架,可能包含哪些组成部分。

unittest单元测试框架

unittest是一个单元测试框架,是Python编程的单元测试框架。

unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是test,也就是一个测试用例。要了解unittest单元测试框架,先来了解以下几个重要的概念。

测试固件(test fixture)

一个测试固件包括两部分,执行测试代码之前的准备部分和测试结束之后的清扫代码。这两部分一般用函数setUp()和tearDown()表示。这里举例以下,例如要测试百度搜索selenium这个场景,我们的测试固件可以这样写,setUp()里写打开浏览器,浏览器最大化,和打开百度首页等脚本代码;在tearDown()里写结束搜索后,退出并关闭浏览器的代码。

测试用例(test case)

unittest中管理的最小单元是测试用例,一个测试用例,包括测试固件,和具体测试业务的函数或者方法。一个测试用例中,测试固件可以不写,但是至少有一个已test开头的函数。unittest会自动化识别test开头的函数是测试代码,如果你写的函数不是test开头,unittest是不会执行这个函数里面的脚本的,这个千万要记住,所有的测试函数都要test开头,记住是小写的哦。

测试套件 (test suite)

很简单,就是很多测试用例的集合,叫测试套件,一个测试套件可以随意管理多个测试用例。如果测试用例比作单个学生,测试套件就是好像是班级的概念。

测试执行器 (test runner)

test runner是一个用来执行加载测试用例,并执行用例,且提供测试输出的一个组建。它可以加载test case或者test suite进行执行测试任务。

我们举例来,练习一下test fixture和test case的使用,学习unittest的简单用法:

1. 新建一个testbaidu.py的文件

2. 导入unittest模块

3. 当前测试类继承unittest.TestCase,相当于当前利用unittest创建了一个test case,这个test case是能够被unittest直接识别。

4. 写setUP(),主要是打开浏览器和打开站点

5. 写一个test_search()用例写搜索的代码

6. 写tearDown(),主要是浏览器退出操作

相关脚本代码如下:

# coding=utf-8  import time  import unittest  from selenium import webdriver      class BaiduSearch(unittest.TestCase):        def setUp(self):          """         测试固件的setUp()的代码,主要是测试的前提准备工作         :return:         """          self.driver = webdriver.Chrome()          self.driver.maximize_window()          self.driver.implicitly_wait(8)          self.driver.get("https://www.baidu.com")        def tearDown(self):          """         测试结束后的操作,这里基本上都是关闭浏览器         :return:         """          self.driver.quit()        def test_baidu_search(self):          """         这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。        :return:         """          self.driver.find_element_by_id('kw').send_keys('selenium')          time.sleep(1)          try:              assert 'selenium' in self.driver.title              print ('Test Pass.')          except Exception as e:              print ('Test Fail.', format(e))    if __name__ == '__main__':      unittest.main()
解释:

最后结尾处的unittest.main(),添加这个是支持在cmd,里面,cd到这个脚本文件所在的目录,然后python 脚本名.py执行,如果不添加这一段,是无法执行cmd里面运行脚本的,在PyCharm中,不添加最后一段,也可以通过,右键 Run "unittest xxx",来达到执行效果。

什么是POM

POM,中文字母意思是,页面对象模型,POM是一种最近几年非常流行的自动化测试模型,或者思想,POM不是一个框架,就是一个解决问题的思想。采用POM的目的,是为了解决前端中UI变化频繁,从而造成测试自动化脚本维护的成本越来越大。下图,形象描述了POM的好处。

图片

从上图看出,采取了POM设计思路和不采取的区别,左侧把测试代码和页面元素都写在一个类文件,如果需要更改页面,那么就要修改页面元素定位,从而要修改这个类中测试代码,这个看起来和混乱。右侧,采取POM后,主要的区别就是,把页面元素和业务逻辑和测试脚本分离出来到两个不同类文件。ClassA只写页面元素定位,和业务逻辑代码操作的封装,ClassB只写测试脚本,不关心如何元素定位,只写调用ClassA的代码去覆盖不同的测试场景。如果前端页面发生变化,只需要修改ClassA的元素定位,而不需要去修改ClassB中的测试脚本代码。

POM主要有以下优点:

1. 把web ui对象仓库从测试脚本分离,业务代码和测试脚本分离。

2. 每一个页面对应一个页面类,页面的元素写到这个页面类中。

3. 页面类主要包括该页面的元素定位,和和这些元素相关的业务操作代码封装的方法。

4. 代码复用,从而减少测试脚本代码量。

5. 层次清晰,同时支持多个编写自动化脚本开发,例如每个人写哪几个页面,不影响他人。

6. 建议页面类和业务逻辑方法都给一个有意义的名称,方便他人快速编写脚本和维护脚本。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue-2.1scoped样式冲突

默认情况&#xff1a;写在组件中的样式会全局生效->因此很容易造成多个组件之间的样式冲突问题 1.全局样式&#xff1a;默认组件中的样式会作用到全局 2.局部样式&#xff1a;可以给组件加上scoped属性&#xff0c;可以让样式只作用于当前组件 <style scoped> <…

长沙建筑模板生产厂家有哪些?

在湖南长沙地区&#xff0c;建筑施工企业寻找一家可信赖的建筑模板供应商是非常重要的。在长沙地区&#xff0c;有多家建筑模板生产厂家&#xff0c;其中值得一提的是能强优品木业&#xff0c;他们是长沙地区建筑模板生产的领先供应商之一。 能强优品木业位于广西贵港市&#x…

Leetcode: 63. 不同路径 II(动态规划)

1. 题目解析 LeetCode链接 根据题目可以得出&#xff0c;当处于 [i][j] 位置时只能从 [i][j - 1], 和 [i - 1][j] 到达&#xff0c;所以我们只需要将到达上述两点的路径相加就可以得到到达该点的路径和 2. 解题思路 通过分析题目我们可以使用动态规划来解决这道题 首先我们…

【计算机网络笔记】什么是计算机网络?

前言计算机网络的定义交换网络什么是Internet从组成细节角度看从服务角度看 最后感谢 &#x1f496; 本篇文章总字数&#xff1a;1342字 预计阅读时间&#xff1a;5~10min 建议收藏之后慢慢阅读 前言 计算机网络通信技术计算机技术。 计算机网络是通信技术与计算机技术紧密结…

求后缀表达式的值

后缀表达式的值 【题目描述】 从键盘读入一个后缀表达式&#xff08;字符串&#xff09;&#xff0c;只含有0-9组成的运算数及加&#xff08;&#xff09;、减&#xff08;—&#xff09;、乘&#xff08;*&#xff09;、除&#xff08;/&#xff09;四种运算符。每个运算数之间…

面试题____Java小白找工作必须领悟的修仙秘籍(二)

当我们走出校园&#xff0c;步入社会&#xff0c;必须得找工作&#xff0c;那么作为it小白你必须拥有过硬的基础应用知识&#xff0c;才能慢慢的适应工作的节奏&#xff0c;以下内容则都是基础中的基础&#xff0c;需要全部进行掌握&#xff0c;因为这里可能有你面试时需要回答…

故障注入常用方法有哪些 其重要性是什么

故障注入是一种有效的测试方法&#xff0c;可用于评估系统对异常情况的响应。通过这种测试方法&#xff0c;可以发现系统中的潜在问题&#xff0c;并采取适当措施来改进系统的质量和性能。本文将介绍故障注入常用方法及重要性! 一、故障注入常用方法 1、随机故障注入&#xff1…

交易履约之结算平台实践 | 京东云技术团队

导读 京东科技业务在快速发展的同时&#xff0c;产生了众多线上化资金结算的需求。传统的线下资金结算模式有着人力成本高、耗时长、多方沟通协调成本高、结算准确率低等固有缺点&#xff0c;且无法满足“风法财审”对于资金流程的管控要求&#xff0c;在此背景下金道结算平台…

springboot就业信息管理系统springboot32

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

[UUCTF 2022 新生赛]ezpop - 反序列化(字符串逃逸)【***】

[UUCTF 2022 新生赛]ezpop 一、解题过程二、其他WP三、总结反思 一、解题过程 题目代码&#xff1a; <?php //flag in flag.php error_reporting(0); class UUCTF{public $name,$key,$basedata,$ob;function __construct($str){$this->name$str;}function __wakeup(){i…

成集云 | 嗨便利集成金蝶云星辰 | 解决方案

方案介绍 嗨便利是一款便捷即时到家服务平台。它集合了即时零售、即时配送、前置仓、数字化中台、会员体系以及自研SAAS系统等众多前沿科技&#xff0c;利用大数据驱动的预测算法&#xff0c;通过多渠道订单整合&#xff0c;智能调度配送系统&#xff0c;致力于为消费者提供“…

互联网干洗店洗鞋店预约收衣下单软件

拽牛科技洗护软件系统可以实现用户在线下单&#xff0c;商家依托平台来接单&#xff0c;将用户的订单运送到校外来清洗处理&#xff0c;这样可以有效的避免学校的高房租成本。 软件有四种下单模式&#xff0c;网点自取模式&#xff5c;上门取送模式&#xff5c;快递柜模式&…

实验室管理系统LIMS

在数字化浪潮中&#xff0c;越来越多的企业开始有数字化转型的意识。对于实验室而言&#xff0c;数字化转型是指运用新一代数字技术&#xff0c;促进实验室业务、生产、研发、管理、服务、供应链等方面的转型与升级&#xff0c;实现实验室业务“人、机、料、法、环”的多维度发…

【使用 TensorFlow 2】02/3 使用 Lambda 层创建自定义激活函数

一、说明 TensorFlow 2发布已经接近2年时间&#xff0c;不仅继承了Keras快速上手和易于使用的特性&#xff0c;同时还扩展了原有Keras所不支持的分布式训练的特性。3大设计原则&#xff1a;简化概念&#xff0c;海纳百川&#xff0c;构建生态.这是本系列的第三部分&#xff0c;…

【pycharm】控制台报错:终端无法加载文件\venv\Scripts\activate.ps1

目录 一、在pycharm控制台输入 二、在windows的power shell &#xff08;以管理员方式打开&#xff09; 三、 在pycharm控制台输入 四、重新打开pycharm即可 前言&#xff1a;安装pycharm2022-03版本出现的终端打开报错 一、在pycharm控制台输入 get-executionpolicy …

单目标分割标签图叠加代码

本代码只适合两个图片合并&#xff0c;如果出现三个图片合并&#xff0c;就将第三个图删除&#xff0c;先合并一次&#xff0c;然后再将图片加入&#xff0c;再合并一次 1. 问题背景 有的时候标签有多个&#xff0c;需要将两张或者是多张图象叠加在一起&#xff0c;成为以下情…

Redis学习6——新数据类型

Bitmaps bitfield HyperLog Geographic Stream 重点来了 redis各个数据类型的操作命令可以到:http://www.redis.cn/commands.html查看

面试经典 150 题 20 —(数组 / 字符串)— 151. 反转字符串中的单词

151. 反转字符串中的单词 方法一 class Solution { public:string reverseWords(string s) {istringstream instr(s);vector<string> words{};string word;while(instr>>word){words.push_back(word);}int length words.size();string result words[length-1];f…

怒刷LeetCode的第26天(Java版)

第一题 题目来源 64. 最小路径和 - 力扣&#xff08;LeetCode&#xff09; 题目内容 解决方法 方法一&#xff1a;动态规划 可以使用动态规划来解决这个问题。 首先创建一个与网格大小相同的二维数组dp&#xff0c;用于存储从起点到每个位置的最小路径和。然后初始化dp[0…