LeetCode《程序员面试金典》面试题 04.12. 求和路径

java小白困惑的那些事

  返回  

web自动化——pytest概念

2021/8/21 18:25:36 浏览:

web自动化——pytest概念

  • pytest框架
    • 安装
    • 搜集用例的规则
    • 用例的区分与执行
    • fixtures模块 处理前置和后置
      • 定义fixtures
    • 代码
      • fixcure的代码
      • 测试用例的代码

pytest框架

  • pytest:基于unittest之上的单元测试框架
  • 自动发现测试模块和测试方法
  • 断言使用assert+表达式即可
  • 可以设置会话级、模块级、类级、函数级的fixtures、数据准备和清理工作;注意使用fixtures模块的时候,不能和unittest混用
  • 有丰富的插件库,目前有300个以上。==allure

安装

  • 直接file_setting安装即可
  • 或者在网上下载插件,然后pip install 插件名

搜集用例的规则

  • 默认从当前目录搜集测试用例,即在那个目录下运行的pytest命令,就从那个目录中开始搜索
  • 搜索规则:
  • 符合命名规则:test_py,或者* *_test.py **
  • 在上面的基础找以下方法:
  • 以test_开头——没有测试类的情况下
  • 以Test开头的测试类(不能有__init__函数)当中,以test开头的函数
  • pytest执行用例的顺序为:按照搜索的先后顺讯来执行,想要修改顺序,直接修改位置即可
  • unittest一定是在类当中,pytest不继承父类,所以,用例可以不用固定在测试类当中

用例的区分与执行

  • 区分测试用例可以对用例打标签,在运行测试用例的时候,可以根据标签名来过滤要运行的用例
  • 用法:在类或者方法前面加上 @pytest.mark.标记名,标签名可以自定义
  • 指定测试模块:pytest py文件名
  • 指定测试目录:pytest 路径信息,最后一层要加/
  • 通过标签过滤执行:pytest -k "MyClass and not method";这个命令会匹配文件名、类名、方法名,后面的是表达式
  • 通过节点id来运行测试,节点id的组成:py模块名::类名::函数名 或者 py模块名::函数名。示例:pytest test_xxx.py::TestXXX::func_XXX
  • 通过标记表达式执行:pytest -m smoke(用and连接多个标签名);这条命令会执行被装饰器@pytest.mark.标记名装饰的所有测试用例
  • 获取用例执行性能数据:获取最慢的10个测试用例的执行耗时:pytest --durations 10

fixtures模块 处理前置和后置

  • 即测试用你管理执行的环境准备和清理,相当于unittest中的setUp和tearDown
  • fixtures的主要目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。例如在测试网站时,每个测试用例都要登录和退出。利用 fixtures就可以只写一次,不需要每条用例中写一次
  • fixtures通过函数来实现的
  • 公共处理方法:所有的fixtures去出来当成一个公共的文件来进行存放,防止的py文件名称必须是:conftest.py
  • 这个文件要自己创建,并且在里面写入前置后置,其机制当中会自动识别这个文件
  • 文件与测试用例:这个文件的位置必须与测试用例平级或者测试用例是这个文件的子集
  • conftest.py文件可以创建多个,识别的顺序是:先查找子集模块下的py文件,然后查找模块外的py文件

定义fixtures

  • 第一点:将函数定义为fixtures,就直接在函数声明的时候加上装饰器:@pytest.fixture(),表示此函数为测试环境数据的准备和清理;fixture在不传参数的时候,可以不加括号

  • fixtures中的参数:

  • scope参数:
    The scope for which this fixture is shared; one of "function"
    (default), "class", "module", "package" or "session"

  • 这句话的意思是:不设置的情况下,默认使用function(每条用例);class为类;module是模块(py文件);package是包名(没有在用,可跳过),session是会话层

  • param:参数,可以进行参数化,列表形式

  • autouse自动使用,输入布尔值,默认False

  • 第二点:在函数中使用yield关键字,可识别环境情况和环境准备;这个关键字之后的就是环境 清理的代码,即在测试用例执行完成之后执行清理数据的代码

  • 如果一个函数没有前置条件,也需要加yield关键字
    在这里插入图片描述

  • 调用:测试类或者测试用例当中,主动通过fixcure的函数名来调用fixcure;不需要在测试文件中引用conftestpy文件

  • 使用的装饰器:@pytest.mark.usefixtures("fixture的函数名");在测试类或者测试用例的前面使用

  • 定义conftest.py文件,再次文件中可定义多个fixcure

  • 如果有返回值,直接在关键字yield后面,用空格隔开

  • 测试用例接收fixcure的返回值时,需要将函数名称作为测试用例的参数传入测试用例

  • pytest的断言是:是assert 断言表达式 ——中间要有空格

代码

fixcure的代码

from selenium import webdriver
from web_login.class_test_datas import test_common_data as CO
import pytest
driver = None

#第一点,函数前面打标签(装饰器),scope决定作用域,默认function
#第二点:关键字yield前为前置代码;后面为后置代码
#第三点:driver定义在一个函数中,使用global全局变量,更改变量值
#第四点:方法不能和unittest和ddt一起使用
#第五点:如果有返回值,显示在yield后面

#类级别,传参
@pytest.fixture(scope="class")
def prepare_chrome():
    print('================测试类级别===============')
    #前置条件
    # 打开一个会话
    global driver
    driver = webdriver.Chrome()
    # 全屏
    driver.maximize_window()
    driver.get(CO.login_url)
    yield driver
    #后置条件
    driver.quit()

@pytest.fixture
#函数级别,不需要传参
def refresh_page():
    print('================测试用例级别===============')
    yield
    global driver
    driver.refresh()

测试用例的代码

#调用:测试类或者测试用例当中,主动通过fixture的函数名称来调用
#不需要导入conftest的py文件
#用法:@pytest.mark.usefixtures("函数名称")
#如何接收fixture的返回值?答:函数名称代表返回值,
# 如果测试用例要使用,将函数名称传入用例后使用


@pytest.mark.usefixtures("prepare_chrome")
@pytest.mark.usefixtures("refresh_page")
@pytest.mark.login
class TestLogin:

    #登录成功
    @pytest.mark.smake
    def test_login_success(self,prepare_chrome):
        #在本页面打开会话,将diver传入页面page的初始化函数中,调用的时候直接传入
        user = Lo.login_success_datas.get("user")
        pwd = Lo.login_success_datas.get("pwd")
        Login(driver=prepare_chrome).click_login_button()
        Login(driver=prepare_chrome).ifram_swith_and_click_user_pwd()
        Login(driver=prepare_chrome).send_login_data(user,pwd)
        try:
            #断言使用assert+表达式
            assert UserPage(driver=prepare_chrome).isExit_name()
            MyLog().info_mes("登录成功验证通过")
        except Exception as e:
            MyLog().error_mes("登录成功验证未通过")
            raise e

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号