pytest学习--conftest.py配置

# conftest.py配置

  当多个用例调用一个模块的功能时,比如:如果有多个.py的文件都需要调用这个登陆功能的话,那就不能把登陆写到用例里面去了。
此时应该要有一个配置文件,单独管理一些预置的操作场景,pytest里面默认读取conftest.py里面的配置

conftest.py配置需要注意以下点:

  • conftest.py配置脚本名称是固定的,不能改名称
  • conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
  • 不需要import导入 conftest.py,pytest用例会自动查找
  • 单独运行test_fixt.py能调用到mylogin()方法,这样就能实现一些公共的操作可以单独拿出来了

 

# 代码结构:

__init__
.py conftest.py # coding:utf-8 import pytest @pytest.fixture() def login(): print("输入账号/密码登录") test_f1.py # coding:utf-8 import pytest def test_s1(login): print("用例1") def test_s2(): print("用例2") def test_s3(login): print("用例3") if __name__ == "__main__": pytest.main(["-s", "test_f1.py"]) test_f2.py # coding:utf-8 import pytest def test_s4(login): print("用例4") def test_s5(): print("用例5") if __name__ == "__main__": pytest.main(["-s", "test_f2.py"])

 ❤项目实例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/1/21 14:31
# @Author  : Administrator
# @File    : conftest.py
import time

import pytest
from selenium import webdriver
from py_test_pack.test_data.locator_eles import Mylocator

@pytest.fixture()
def login():
    driver = webdriver.Chrome()
    driver.get("http://192.168.0.xxx")
    driver.implicitly_wait(10)
    driver.maximize_window()
    loc = Mylocator
    uname = loc.username_loc
    username = driver.find_element_by_css_selector(uname)
    username.send_keys("yourname")

    pwd = loc.password_loc
    password = driver.find_element_by_css_selector(pwd)
    password.send_keys("yourpassword")

    subbutton = loc.login_button_loc
    login_button = driver.find_element_by_css_selector(subbutton)
    login_button.click()
    yield driver
    driver.quit()
    return driver

# scope="module"   

  1.fixture参数scope="module",module作用是整个.py文件都会生效,用例调用时,参数写上函数名称就行
  2.module级别的fixture在当前.py模块里,只会在用例(test_s2)第一次调用前执行一次。

import pytest
from selenium import webdriver


@pytest.fixture(scope="module")
def open_broswer():
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")


def test_s1(open_broswer):
    print("用例1")


def test_s2(open_broswer):
    print("用例2")


if __name__ == '__main__':
    pytest.main(['-s', "test_f1.py"])

当只有test_s2调用open时,顺序会发生什么样的变化?

import pytest
from selenium import webdriver


@pytest.fixture(scope="module")
def open_broswer():
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    print("打开浏览器")


def test_s1():
    print("用例1")


def test_s2(open_broswer):
    print("用例2")


def test_s3():
    print("用例3")


if __name__ == "__main__":
    pytest.main(["-s", "test_f1.py"])

yield 执行teardown

  1.如果其中一个用例出现异常,不影响yield后面的teardown执行,运行结果互不影响,并且全部用例执行完之后,yield呼唤teardown操作
  2.如果在setup就异常了,那么是不会去执行yield后面的teardown内容了
  3.yield也可以配合with语句使用

import pytest


@pytest.fixture(scope="module")
def open():
    print("打开浏览器")

    yield
    print("执行teardown")
    print("关闭浏览器")


def test_s1(open):
    print("用例1")


def test_s2(open):
    print("用例2")
    raise NameError  # 模拟异常


def test_s3(open):
    print("用例2")

 ♥项目实战

# 封装的driver驱动

driver = None

@pytest.fixture(scope='session', autouse=True)
def browser(request):
    global driver
    if driver is None:
        driver = webdriver.Chrome()

    def end():
        driver.quit()
    request.addfinalizer(end)
    return driver

 

# 自己用到项目的 封装到contest.py:

import time

import pytest
from selenium import webdriver
from test_data.locator_eles import Mylocator


@pytest.fixture()
def login():
    driver = webdriver.Chrome()
    driver.get("http://xxx.html")
    driver.implicitly_wait(10)
    driver.maximize_window()
    loc = Mylocator
    uname = loc.username_loc
    username = driver.find_element_by_css_selector(uname)
    username.send_keys("username")

    pwd = loc.password_loc
    password = driver.find_element_by_css_selector(pwd)
    password.send_keys("passwd")

    subbutton = loc.login_button_loc
    login_button = driver.find_element_by_css_selector(subbutton)
    login_button.click()
    yield driver
    driver.quit()
    return driver

 

posted @ 2021-01-05 11:13  弹弹大魔王  阅读(410)  评论(0编辑  收藏  举报