pytest+allure使用confgtest.py失败截图
在写用例时怎么传到setup中?
我知道用例中可以def test(self,browser)就可以直接driver
但是不知道setup中怎么用,想在setup中初始化浏览器,登录,不知道大虾们什么方案解决的,难道直接不用setup跟teardown么
引用 皆我百晓生 小程序回复内容作答:
可以在conftest.py文件中定义一个fixture函数来实现在每个测试用例执行之前进行初始化操作。
例如,可以在conftest.py文件中定义一个fixture函数来初始化浏览器和登录:
import pytest
from selenium import webdriver
@pytest.fixture(scope="session", autouse=True)
def setup(request):
# 初始化浏览器
driver = webdriver.Chrome()
request.cls.driver = driver
# 进行登录操作
login(driver)
def teardown():
# 关闭浏览器
driver.quit()
request.addfinalizer(teardown)
在上述代码中,fixture函数的作用范围是session级别,autouse参数设置为True时,所有的测试用例都会自动使用该fixture函数进行初始化操作。
可以在测试用例类中引用conftest.py中的fixture函数,如下所示:
import pytest
class TestLogin:
def test_login(self):
# 可以直接使用初始化后的driver对象
self.driver.get("http://www.example.com")
assert self.driver.title == "Example Title"
在上述代码中,测试用例类可以直接使用初始化后的driver对象进行操作。
注意:conftest.py文件必须与测试用例在同一目录下,并且文件名必须为conftest.py。
【以下回答由 GPT 生成】
首先,为了在conftest.py
中初始化浏览器并登录,你可以使用fixture
实现。fixture
可以在conftest.py
中定义,然后在测试用例中使用。在fixture
中,你可以初始化浏览器并登录,然后将浏览器对象返回给测试用例。
下面是一个示例代码:
# conftest.py
import pytest
from selenium import webdriver
@pytest.fixture(scope="session")
def browser():
# 初始化浏览器
driver = webdriver.Chrome()
# 登录操作
driver.get("login_page_url")
# 输入用户名和密码
driver.find_element_by_id("username").send_keys("your_username")
driver.find_element_by_id("password").send_keys("your_password")
driver.find_element_by_id("login_button").click()
# 返回浏览器对象
yield driver
# 在所有测试用例结束后关闭浏览器
driver.quit()
在上面的代码中,我们定义了一个browser
的fixture
,scope
参数设置为session
表示在整个测试会话中只初始化一次浏览器对象,然后将其返回。在yield
语句之后,使用driver.quit()
关闭浏览器对象。
接下来,在测试用例中,你就可以直接使用browser
了。下面是一个示例测试用例:
# test_example.py
def test_login_success(browser):
# 使用 browser 对象进行操作
# ...
# 登录成功的测试逻辑
# ...
在上面的测试用例中,我们使用browser
作为参数,这样pytest会自动传递browser
对象给测试用例。
至于失败截图的问题,你可以使用pytest
的request
对象来获取测试用例的执行结果,并在失败时进行截图。修改conftest.py
文件如下:
# conftest.py
import pytest
import allure
from selenium import webdriver
@pytest.fixture(scope="session")
def browser(request):
# 初始化浏览器
driver = webdriver.Chrome()
# 登录操作
driver.get("login_page_url")
# 输入用户名和密码
driver.find_element_by_id("username").send_keys("your_username")
driver.find_element_by_id("password").send_keys("your_password")
driver.find_element_by_id("login_button").click()
# 添加失败截图的钩子
def take_screenshot_when_failure():
if request.node.rep_call.failed:
driver.save_screenshot("failure_screenshot.png")
allure.attach.file("failure_screenshot.png", name="Failure Screenshot", attachment_type=allure.attachment_type.PNG)
request.addfinalizer(take_screenshot_when_failure)
# 返回浏览器对象
yield driver
# 在所有测试用例结束后关闭浏览器
driver.quit()
在上面的代码中,我们使用addfinalizer
方法将take_screenshot_when_failure
方法作为清理函数添加到request
对象中。在测试用例执行完成之后,如果测试用例失败,就会执行take_screenshot_when_failure
方法。在该方法中,我们通过selenium
的save_screenshot
方法保存截图,并使用allure
的attach.file
方法将截图添加到allure报告中。
这样,在每个失败的测试用例结束时,都会自动生成一个失败截图,并在allure报告中显示出来。
希望以上解决方案对你有帮助。如果还有其他问题,请随时提问。