一. 原理

将页面的元素定位和元素行为封装成一个page类,实现页面对象和测试用例分离

类的属性:元素定位

类的行为:元素的操作

测试用例:调用所需页面对象中的行为,组成测试用例

二. 好处

1. 当某个页面的元素发生变化,只需要修改该页面对象中的代码即可,测试用例不需要修改

2. 提高代码重用率,结构清晰,维护代码更容易

3. 测试用例发生变化时,不需要或者只需要修改少数页面对象代码即可

三. 分析

四. 优化—pytest

pytest:基于unittest之上的单元测试框架

1. 自动发现测试模块和测试方法

2. 断言使用assert + 表达式即可

3. 可以设置会话级、模块级、类级、函数级的fixtures

4. 有丰富的插件库,目前在300个以上

安装命令

pip install pytest

安装html报告的插件

pip install pytest-html

pytest插件地址

http://plugincompat.herokuapp.com/

pytest—mark

对测试用例打标签,在运行测试用例的时候,可根据标签名来过滤要运行的用例

使用方法:

在测试用例/测试类前面加上:@pytest.mark.标记名

示例:

@pytest.mark.smoke

pytest—收集测试用例

pytest收集测试用例的规则:

1. 默认从当前目录中搜集测试用例,即在哪个目录下运行pytest命令,则从哪个目录当中搜索

2. 搜索规则:

  1) 符合命令规则test_*.py 或者 *_test.py 的文件

  2) 以test_开头的函数名

  3) 以Test开头的测试类 (没有__init__函数) 当中,以test_开头的函数

pytest—用例运行方式

指定测试模块:pytest test_mod.py

指定测试目录:pytest testing/

通过关键字表达式过滤执行:

pytest -k *MyClass and not method*

这条命令会匹配文件名、类名、方法名匹配表达式的用例

通过节点id来运行测试:

节点id的组成: py模块名::类名::函数名   或者  py模块名::函数名

示例:pytest test_xxx.py::TestXXX::func_XXX

通过标记表达式执行

pytest -m smoke

这条命令会执行被装饰器 @pytest.mark.smoke 装饰的所有测试用例

获取用例执行性能数据

五. 优化—pytest—html

需要安装pytest-html插件

pytest可以生成多种样式的结果:

1. 生成JunitXML格式的测试报告: --junitxml=path

2. 生成result log格式的测试报告: --resultlog=report\log.txt

3. 生成Html格式的测试报告: --html=report\test_one_func.html

只运行打了smoke标记的测试用例

import pytest
from Common.conf_dir import htmlreport_dir
import time

cur_Time = time.strftime("%Y-%m-%d_%H-%M-%S")

pytest.main(["-m", "smoke",
             "--junitxml", "{0}/WEB_AutoTest_{1}.xml".format(htmlreport_dir, cur_Time),
             "--html", "{0}/WEB_AutoTest_{1}.html".format(htmlreport_dir, cur_Time)])

运行全部的测试用例

import pytest
from Common.conf_dir import htmlreport_dir
import time

cur_Time = time.strftime("%Y-%m-%d_%H-%M-%S")

pytest.main(["--junitxml", "{0}/WEB_AutoTest_{1}.xml".format(htmlreport_dir, cur_Time),
             "--html", "{0}/WEB_AutoTest_{1}.html".format(htmlreport_dir, cur_Time)])

六. pytest—定义fixture

fixture:即测试用例执行的环境准备和清理,在unittest中即指setup()、teardown()

fixture主要的目的:是为了提供一种可靠和可重复的手段去运行那些最基本的测试内容。比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步也是冗余

定义fixture:

  把一个函数定义为fixture很简单,在函数声明之前加上@pytest.fixture,表示此函数为测试环境数据的准备和清理

  

  那么,在一个fixture内部如何区分环境准备、环境清理呢?

  在函数内使用yield关键字

  yield关键字以后的代码,就是环境清理的代码,即在测试用例执行完成之后会执行的代码

  fixture返回值

  fixture定义之后的使用

七. pytest—调用fixture

调用fixture的三种方式:

1. 在测试用例中直接调用它:

将fixtures的函数名字作为测试用例的参数

如果fixture有返回值,那么测试用例中的fixture函数名字就接收返回值

示例:

def test_tttt(self, myfixture):             #fixture函数名字作为参数传入

  myfixture.find_element_by_xpath("XXX")      #函数名代表了fixture的返回值,即driver

2. 用fixture装饰器调用fixture

在测试用例/测试类前面加上@pytest.mark.usefixtures("fixture函数名字")

ps:定义conftest.py文件,在此文件中可定义多个fixture,pytest会自动搜索此文件

3. 用autos调用fixture

当定义fixture时,有一个参数是autouse,默认设置为False

当默认为False,就可以选择用上面两中方式来试用fixture

当设置为True时,在一个session内所有的test都会自动调用这个fixture

权限大,责任也大,所以用该功能时也要谨慎小心

八. pytest—conftest.py

定义公共的fixture,多个测试类中都可以调用

pytest提供了conftest.py文件,可以将fixture定义在此文件中

运行测试用例时,不需要去导入这个文件,会自动去查找conftest.py文件,然后去找到对应的fixture

九. pytest—定义fixture

fixture的参数中,有scope作用域

function:每个test都运行,默认是function的scope,即unittest中的setUp和tearDown

class:每个class的所有test只运行一次。即unittest中的setUpClass和tearDownClass

module:每个module的所有test只运行一次

session:每个session只运行一次(如连接数据库操作)

fixture中设置返回值

有的时候,我们在测试环境初始化时,会对资源进行处理后,在测试用例中要使用这个资源

yield 返回值

示例:

@pytest.fixture   #默认scope为function

def myfixture():

  driver = webdriver.Chrome()

  yield driver        #将driver作为返回值,在测试用例中需要使用driver

  driver.close()   #测试用例执行完成之后,要执行的清理操作

  driver.quit()   #测试用例执行完成之后,要执行的清理操作

web自动化中的page object模式的更多相关文章

  1. 转 Page Object模式

    Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通 ...

  2. UI自动化测试的Page Object模式

    在UI级的自动化测试框架中,当页面样式改变或者页面元素属性改变,那么代码也要随之进行修改,如何做到高效快速的修改代码来适应这些改变呢,这个时候可以引入Page Object模式,也是页面对象设计模式. ...

  3. 【C#|.NET】从细节出发(三) 逻辑层事务和page object模式

    一. 业务逻辑层的事务问题 如果你的程序分层清晰并且系统禁用复杂存储过程,那么在DA中的职责比较单一.程序的逻辑通过BLL调用各种不同模块的DA来实现数据操作.如果当需要不同模块在一个事务的时候,问题 ...

  4. selenium page object模式

    页面对象模式将测试代码和被测试页面的元素及操作进行分离,以降低页面元素的变化对测试代码的影响.每个被测试的页面都会被定义一个类,类中会定位元素和操作. 如果不使用page object模式,则相同的操 ...

  5. python+selenium自动化软件测试(第7章):Page Object模式

    什么是Page ObjectModel模式Page Objects是selenium的一种测试设计模式,主要将每个页面看作是一个class.class的内容主要包括属性和方法,属性不难理解,就是这个页 ...

  6. 浅析selenium的page object模式

    selenium目前比较流行的设计模式就是page object,那么到底什么是page object呢,简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好 ...

  7. Page Object 模式编写UiAutomator脚本

    在我们学习Page Object Model之前,我们先了解一下Page Object Model(以下简称POM). 为什么要POM 用UiAutomator启动UI自动化测试不是一件困难的任务.你 ...

  8. 使用page object模式抓取几个主要城市的pm2.5并从小到大排序后写入txt文档

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

  9. python selenium-8 Page Object模式

    封装空间操作为一个接口使用,而不是直接在页面中查找 from selenium import webdriver from selenium.webdriver.common.by import By ...

随机推荐

  1. PHP的语言结构和函数的区别

    相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等. 例子: if ( isset($user) ) { //do some thi ...

  2. 服务器1M带宽同时能承受多少人在线

    最近网站的流量一直在增长,这个肯定是好事.不过也有个麻烦的问题,目前本站用的的虚拟空间,每月流量30G,虽然95%的图片都已外链,但流量还是很吃紧,日均2000ip,4月份流量34g左右,单JS的响应 ...

  3. 在容器最前面添加DOM元素 parent.insertBefore(new, parent.children[0])

    //判断容器当前有没有子级元素,如果没有直接appendChild就行了; if (p.children[0]) { p.insertBefore(span, p.children[0]); } el ...

  4. Django模板继承后出现logo图片无法加载的问题

    父文件:index.html <!DOCTYPE html> <html lang="en"> <head> <title>{% b ...

  5. UML图箭头关系

    ML定义的关系主要有:泛化.实现.依赖.关联.聚合.组合,这六种关系紧密程度依次加强,分别看一下 泛化 概念:泛化是一种一般与特殊.一般与具体之间关系的描述,具体描述建立在一般描述的基础之上,并对其进 ...

  6. C#笔试面试宝典值得收藏

    又是一年换工作纠结的季节,前一阵子由于工作的缘故,薪资降低,加之被其他部门以莫须有的罪名投诉:固然愤慨之,遂升起离职念想,下面是这几天电话面试和笔试中常问到的问题汇总,给大家分享下,不足之处往大神拍砖 ...

  7. Redis一(Redis-py与String操作)

    Redis 介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...

  8. mysql-xtrabackup

    使用xtrabackup进行MySQL数据库备份 2013年10月04日 ⁄ MySQL ⁄ 共 11306字 ⁄ 使用xtrabackup进行MySQL数据库备份已关闭评论 ⁄ 被围观 34,116 ...

  9. Hbase 学习笔记2----概念

    说在前面,本文部分内容来源于社区官网经过适度翻译,部分根据经验总结,部分是抄袭网络博文,(不一一列举引用,在此致歉)一并列在一起,本文的目的,希望能总结出一些有用的,应该注意到的东西,基本思路是先提出 ...

  10. PAT 天梯赛 L1-045. 宇宙无敌大招呼 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-045 AC代码 #include <iostream> #include <cstdio&g ...