使用 conftest.py 来共享 fixture
通过上面的学习,我们掌握了如何在同一个文件中进行 fixture 的定义、共享和使用。但在日常工作测试中,
我们常常需要在全局范围内使用同一个测试前置操作。例如,测试开始时首先进行登录操作,接着连接数据库。
这种情况下,我们就需要使用 conftest.py。在 conftest.py 中定义的 fixture 不需要进行 import,pytest 会自动查找使用。
pytest 查找 fixture 的顺序是首先查找测试类(Class),接着查找测试模块(Module),然后是 conftest.py 文件,
最后是内置或者第三方插件。
例子
import pytest
import requests
from selenium import webdriver
@pytest.fixture(scope="session")
def login():
driver = webdriver.Chrome()
driver.implicitly_wait(30)
base_url = "http://www.baidu.com"
s=requests.session()
yield driver,s,base_url
driver.quit()
s.close()
import codecs
import json
import os
import yaml
import time
import xlrd
import pytest
def read_data_from_json_yaml(data_file):
return_value=[]
data_file_path=os.path.abspath(data_file)
print(data_file_path)
_is_yaml_file=data_file_path.endswith((".yaml",".yaml"))
with codecs.open(data_file_path,'r','utf-8')as f:
#load the data from Yaml or json
if _is_yaml_file:
data=yaml.safe_load(f)
else:
data=json.load(f)
for i,elem in enumerate(data):
if isinstance(data,dict):
key,value=elem,data[elem]
if isinstance(value,dict):
case_data=[]
for v in value.values():
case_data.append(v)
return_value.append(tuple(case_data))
else:
return_value.append((value,))
return return_value
@pytest.mark.baidu
class TestBaidu:
@pytest.mark.parametrize('search_string,expect_string',read_data_from_json_yaml('tests/test_baidu_ddt.yaml'))
def test_baidu_search(self,login,search_string,expect_string):
driver,s,base_url=login
driver.get(base_url+"/")
driver.find_element_by_id("kw").send_keys("iTesting")
driver.find_element_by_id("su").click()
time.sleep(2)
search_results=driver.find_element_by_xpath('//*[@id="1"]/h3/a').get_attribute('innerHTML')
assert (expect_string in search_results) is True
if __name__ == '__main__':
pytest.main(['-s','-v'])