核心pytest-conftest文件使用

一、conftest特点:

  • 可以跨.py文件调用,有多个.py文件调用时,可让conftest.py只调用了一次fixture,或调用多次fixture
  • conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
  • 不需要import导入 conftest.py,pytest用例会自动识别该文件,放到项目的根目录下就可以全局目录调用了,如果放到某个package下,那就在改package内有效,可有多个conftest.py
  • conftest.py配置脚本名称是固定的,不能改名称
  • conftest.py文件不能被其他文件导入
  • 所有同目录测试文件运行前都会执行conftest.py文件

 

二、pytest-fixture

fixture的作用是将一些非核心测试逻辑(如测试数据检索和生成)从测试函数中分离出来,以便其它测试复用

作用范围:scope便是定义用例域的范围

  • function:默认范围,每一个函数或方法都会调用,不填写时便是它
  • class:每一个类调用一次
  • module: 每一个.py文件调用一次,文件中可以有多个function和class
  • session:多个文件调用一次,可以跨文件,如在.py文件中,每一个.py文件就是module

范围: session > module > class > function

 

三、conftest结合fixture的使用

 

使用fixture执行配置及销毁逻辑

场景:测试用例执行时,有的业务必须先执行(预置条件)

例如:登录,连接数据库、停止数据库连接等

解决:

   1)导入pytest

   2)在登录的函数上面加@pytest.fixture()

   3)在要使用的测试方法中传入(登录函数名称)

   4)不传入的就不登录直接执行测试方法

 

项目实例:

 

 

 

# conftest.py
 
from web.common.driver_factory import Driver
import pytest
 
@pytest.fixture(autouse=False)
def login(driver):
    login = LoginPage(driver)
    login.open()
    login.username.send_keys('admin123')
    login.password.send_keys('12345678')
    login.submit.click()
 
@pytest.fixture(scope='function')
def driver():
    # 打开driver
    driver = Driver.get_driver()
    yield driver
    #关闭driver
    driver.close()

 

 

# test_indexsearch.py
 
from web.page.indexsearch_page import IndexSearchPage
import pytest
class TestIndexSearch:
    def test_indexsearch_001(self,driver,login):
        search = IndexSearchPage(driver)
        search.open()
        search.selectDate('1','三星')
 
    def test_indexsearch_002(self):
        search = IndexSearchPage()
        search.open()
        search.selectDate('2', '耳机')
 
    data = [('1','三星'),('2','耳机')]
    @pytest.mark.parametrize('index,keyword',data)
    def test_indexsearch_003(self,driver,login,index,keyword):
        search = IndexSearchPage(driver)
        search.open()
        search.selectDate('2', '耳机')

 

 

  • 在包tests下模块中的测试用例在执行前需要先执行conftest.py中的login,driver函数
  • 参数autouse=False时,测试用例在执行前想要先执行login函数时,需要把login传给函数,即test_indexsearch_001(self,driver,login),若不传则在运行前不会先执行login函数
  • 参数autouse=True时,无需传login函数,测试用例在执行前都会先执行login函数
  • 参数scope='class'时,在类TestIndexSearch中多个测试用例只会调用一次driver函数
  • 参数scope='fuction'时,在类TestIndexSearch中不同测试用例执行前都会调用一次driver函数
  • yield的作用,相当于return,如函数test_indexsearch_001,执行顺序是driver中driver = Driver.get_driver(),yield driver代码、执行login函数、执行test_indexsearch_001函数、再执行driver中的 driver.close()代码

 

二、pytest-fixturefixture的作用是将一些非核心测试逻辑(如测试数据检索和生成)从测试函数中分离出来,以便其它测试复用
作用范围:scope便是定义用例域的范围
function:默认范围,每一个函数或方法都会调用,不填写时便是它class:每一个类调用一次module: 每一个.py文件调用一次,文件中可以有多个function和classsession:多个文件调用一次,可以跨文件,如在.py文件中,每一个.py文件就是module范围: session > module > class > function
posted @ 2022-05-18 17:17  CNF油条  阅读(339)  评论(0)    收藏  举报