image.png
将公共前置部分放到conftest.py (一般,web测试就是将打开浏览器放到前置去做)
# conftest.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
@pytest.fixture(scope="session")
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
print("打开浏览器")
return driver
# test_fixture.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestBaidu:
def test_baidu(self, driver):
driver.get("https://www.baidu.com/")
title = driver.title
url = driver.current_url
text = driver.find_element(By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]').text
button_text = driver.find_element(By.ID, 'su').accessible_name
assert title == "百度一下,你就知道"
assert url == "https://www.baidu.com/"
assert text == "新闻"
assert button_text == "百度一下"
def test_baidu1(self, driver):
driver.get("https://www.baidu.com/")
title = driver.title
url = driver.current_url
text = driver.find_element(By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]').text
button_text = driver.find_element(By.ID, 'su').accessible_name
assert title == "百度一下,你就知道"
assert url == "https://www.baidu.com/"
assert text == "新闻"
assert button_text == "百度一下"
# 后置处理
if __name__ == '__main__':
pytest.main()
session、module、function、class级别区别
# conftest.py
import pytest
from selenium import webdriver
@pytest.fixture(scope="session")
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
print("打开浏览器")
return driver
@pytest.fixture(scope="session",autouse=True)
def session():
print("我是session级别")
@pytest.fixture(scope="module",autouse=True)
def module():
print("我是module级别")
@pytest.fixture(scope="class",autouse=True)
def ts_classn():
print("我是class级别")
@pytest.fixture(scope="function",autouse=True)
def function():
print("我是function级别")
# test_one.py
class TestOne:
def test_one(self):
assert 1 == 1
def test_two(self):
assert 1 == 1
# test_two.py
class TestTwo:
def test_one(self):
assert 1 == 1
def test_two(self):
assert 1 == 1
(venv) C:\Users\xxx\PycharmProjects\spider\CH0>pytest
================================================================= test session starts =================================================================
platform win32 -- Python 3.7.6, pytest-7.4.4, pluggy-1.2.0 -- C:\Users\wesley\PycharmProjects\spider\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\wesley\PycharmProjects\spider
configfile: pytest.ini
plugins: assume-2.4.3, ordering-0.6
collected 4 items
test_one.py::TestOne::test_one 我是session级别
我是module级别
我是class级别
我是function级别
PASSED
test_one.py::TestOne::test_two 我是function级别
PASSED
test_two.py::TestTwo::test_one 我是module级别
我是class级别
我是function级别
PASSED
test_two.py::TestTwo::test_two 我是function级别
PASSED
================================================================== 4 passed in 0.02s ==================================================================
image.png
function: 每个测试用例都会执行,但是最后执行
session:只执行一次
module:每个.py文件执行一次
class:每个类执行一次
fixture夹具,使用yield做后置(测试完成后链接数据库删除测试数据、关闭浏览器等)
@pytest.fixture(scope="session")
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
print("打开浏览器")
yield driver
driver.quit()
# conftest.py
import pytest
from selenium import webdriver
@pytest.fixture(scope="session")
def driver_project():
global driver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://meikefresh.5istudy.online/")
print("打开浏览器")
yield driver
print("关闭浏览器")
driver.close()
driver.quit()
@pytest.fixture(autouse=True)
def fixture():
print("我是前置步骤")
yield
print("我是后置步骤")
return: 后面的代码就不会被执行
yield:其后面的代码会被执行
网友评论