大佬教程收集整理的这篇文章主要介绍了pytest测试夹具(fixture)简介,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Fixture是pytest精髓所在,就像unittest中的setup和teardown一样,但相对之下它的功能更加强大和灵活。
1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现
2.测试用例的前置条件可以使用fixture实现
3.支持经典的xunit fixture ,像unittest使用的setup和teardown
4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题
fixture通过@pytest.fixture()装饰器装饰一个函数,那么这个函数就是一个fixture,看个实例:
@pytest.fixture()
def manage_browser():
driver = webdriver.Chrome() # 前置条件
return driver
print("后置条件") # 后置条件
@pytest.mark.fixe
def test_baidu(manage_browser):
driver = manage_browser
driver.get("https://www.baidu.com/")
声明的测试夹具函数名称,作为参数传入其他函数,即可完成调用。可以传多个fixture,按先后顺序执行。
上面的测试夹具中只用return返回初始化浏览器,return后面的后置条件不会执行,因此需要将return改成yield,后置条件就会被调用执行。
Yield是Python中的一个关键字,表示生成器。测试夹具的前置条件遇到yield时返回一个结果,然后将测试夹具挂起,转而去执行测试用例,最后回来测试夹具中执行后置条件。Return和yield后面可以不写任何返回值,表示空没有数据返回。Yield使用示例如下:
import pytest
from SELEnium import webdriver
@pytest.fixture()
def manage_browser():
# 前置条件
driver = webdriver.Chrome()
yield driver # yield,返回函数值,可以继续执行下面的代码
# 后置条件
driver.quit()
@pytest.mark.fix
def test_baidu(manage_browser):
driver = manage_browser # 这里是参数接收,不能打括号
driver.get("https://www.baidu.com/")
Pytest框架中将前置条件,后置条件单独放在fixture的函数中,所有的用例调用测试夹具的前后置条件。Web自动化的前后置条件如下:
@pytest.fixture()
def manage_browser():
"""初始化浏览器"""
driver = webdriver.Chrome()
# 设置隐式等待
driver.implicitly_wait(20)
# 最大化浏览器
driver.maximize_window()
# 初始化要用到的页面
login_page = LoginPage(driver)
# 初始化首页
index_page = IndexPage(driver)
yield driver, login_page, index_page
# 后置条件
driver.quit()
@pytest.fixture() # 可以同时创建多个测试夹具
def login():
"""登录的夹具"""
manage_browser()
pass
要使用测试夹具,在测试用例类中的test方法中传入夹具函数名(例如上面函数的manage_browser),且框架中所有的测试用例文件中不需要导入夹具函数名,是直接使用的。如下代码:
class TestLogin: @pytest.mark.parametrize("test_info", test_data_error) def test_01_login_error(self, test_info, manage_browser): """登录时,手机号为空""" # 拆开元祖中的参数 driver, login_page, index_page = manage_browser # 第一步:登录 login_page.login(test_info["@H_927_69@mobile"], test_info["pwd"]) # 获取实际结果(封装以后执行的函数或者方法) actual = login_page.get_error_msg() # 第二步:获取预期结果 test_info["expected"] expected = test_info["expected"] # 第三步:断言 # self.assertEqual(expected, actual) unitte中的断言方式 assert expected == actual
测试用例类中使用测试夹具,以及数据传递的方式:
注意:Pytest中的fixture测试夹具单独放在conftest.py文件中,且conftest.py文件需要与pytest启动文件放在同一级目录。
Unittest框架中setup的作用是每条测试用例执行之前都会执行一次,setupclass的作用是每个测试用例类执行之前都会执行一次。
pytest的fixture同样有这样的作用域,且使用更广泛更灵活。
关键代码:@pytest.fixture(scope='作用范围'),参数如下:
🍉 function:默认作用域,每个测试用例都运行一次
🍉 class:每个测试类只执行一次
🍉 @H_955_2@module:每个模块只执行一次(模块:一个.py文件)
🍉 package:每个python包只执行一次
🍉 session:整个会话只执行一次,即运行项目时整个过程只执行一次
Fixture后面的括号不加任何参数,就代表默认作用域,与function作用一样。
示例一:class --每个测试类只执行一次
import pytest
from SELEnium import webdriver
test_data = [1, 2, 3]
@pytest.fixture(scope="class")
def manage_browser():
"""初始化浏览器"""
driver = webdriver.Chrome()
yield driver
# 后置条件
driver.quit()
class TestHelloWord:
@pytest.mark.parametrize("test_info", test_data)
def test_Helloword(self, test_info, manage_browser):
pass
def test_Hello(self, manage_browser):
pass
上面的示例TestHelloWord虽然有4条测试用,但是@pytest.fixture(scope="class") 申明了每个测试类只执行一次,所以整个过程只打开了一次浏览器。如果一个.py文件中有2个类,就会打开2次浏览器。
示例一:@H_955_2@module --每个模块只执行一次
import pytest from SELEnium import webdriver test_data = [1, 2, 3] @pytest.fixture(scope="@H_927_69@module") def manage_browser(): """初始化浏览器""" driver = webdriver.Chrome() yield driver # 后置条件 driver.quit() class TestHelloWork: @pytest.mark.parametrize("test_info", test_data) def test_Helloword(self, test_info, manage_browser): pass def test_Hello(self, manage_browser): pass class TestModule: @pytest.mark.parametrize("test_info_2", test_data) def test_R_849_11845@odule(self, test_info_2, manage_browser): pass def test_R_849_11845@odule2(self, manage_browser): pass
上面的示例中有两个类,8条测试用例,但是测试夹具作用域设为@H_955_2@module --每个模块只执行一次,所以整个过程只打开一次浏览器。
特殊方式:fixture里面有个参数autouse(自动使用的意思),默认是false,当设置为True时,用例就会自动调用该fixture功能,这样的话写用例时就不用每次都去传参了。
当有多个测试夹具,可以设置不同的作用域,测试用例方法后面可以传需要的测试夹具,也可以传入全部测试夹具
test_data = [1, 2, 3]
@pytest.fixture(scope="function")
def manage_browser():
"""初始化浏览器"""
driver = webdriver.Chrome()
yield driver
print("后置执行")
# 后置条件
driver.quit()
@pytest.fixture(scope="class")
def delete_cookie():
print("delete cookie before")
yield
print("delete cookie after")
class TestHelloWork:
@pytest.mark.parametrize("test_info", test_data)
def test_Helloword(self, test_info, manage_browser, delete_cookiE):
pass
以上是大佬教程为你收集整理的pytest测试夹具(fixture)简介全部内容,希望文章能够帮你解决pytest测试夹具(fixture)简介所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。