zoukankan      html  css  js  c++  java
  • web自动化中的page object模式

    一. 原理

    将页面的元素定位和元素行为封装成一个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=reportlog.txt

    3. 生成Html格式的测试报告: --html=report est_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()   #测试用例执行完成之后,要执行的清理操作

  • 相关阅读:
    Linux下编译安装redis
    docker搭建swoole的简易的聊天室
    Linux下面安装swoole
    laravel命令
    史上最污技术解读,60 个 IT 术语我竟然秒懂了.....
    redis集群搭建
    Windows安装MongoDB
    十大经典排序算法(动图演示)
    消息中间件基础
    laravel邮件发送
  • 原文地址:https://www.cnblogs.com/my_captain/p/9270830.html
Copyright © 2011-2022 走看看