Pytest中的装饰器fixture、selenium库(2)
Pytest中的fixture
fixture返回值 : fixture是在测试函数运⾏前后。比如在一个登录系统中,登录成功后,会返回一个token。fixture返回值的案例,代码如下:
#tests包下的test_fixture.py代码
import pytest @pytest.fixture() #装饰器 def login(username='lyl',password='zy'): if username=='lyl' and password=='zy': return True else: print('帐户或密码错误') def test_profile(login): assert login==True
在控制台Terminal里面进入到该代码目录下,执行命令python -m pytest -v test
s/test_fixture.py::test_profile,运行的结果如下:

声明fixture是一个函数用装饰器@pytest.fixture()。
如果测试函数的参数列表中包含了fixture这个名字,在执行pytest的时候,会先检测到,并且在运行测试函数之前先执行fixture,fixture会将数据返回给测试函数。代码如下:
import pytest from selenium import webdriver
@pytest.fixture()
def driver():
return webdriver.Chrome()
def test_baidu_title(driver):
driver.get('http://www.baidu.com')
assert driver.title=='百度一下,你就知道'
fixture初始化(初始化测试固件)
fixture函数中包含了yield关键字,那么pytest会在yield处停止,转而运行测试函数,等测试函数执行完毕后再回到fixture,继续执行yield后面的代码。代码如下:
#test_fixture_init.py
from selenium import webdriver import pytest import time as t @pytest.fixture() def driver(): return webdriver.Chrome() @pytest.fixture() def init(driver): '''UI自动化测试固件''' driver.maximize_window() driver.get('http://www.baidu.com') yield #测试步骤和断言 driver.close() def test_baidu_title(init,driver):
'''验证:百度首页的title''' assert driver.title=='百度一下,你就知道' def test_baidu_so(init,driver):
'''验证:搜索输入框的内容是否正确''' so=driver.find_element_by_id('kw') so.send_keys('周杰伦') t.sleep(2) assert so.get_attribute('value')=='周杰伦'
在控制台Terminal里面进入到该代码目录下,执行命令python -m pytest -v tests/test_fixture_init.py,运行的结果如下:

如果要使用对象的方式来实现,可对上面的代码进行改造,代码如下:
#test_fixture_init.py
from selenium import webdriver import pytest import time as t
class TestBaidu(object):
@pytest.fixture()
def driver(self):
return webdriver.Chrome()
@pytest.fixture()
def init(self,driver):
driver.maximize_window()
driver.get('http://www.baidu.com')
yield
driver.close()
def test_baidu_title( self,init, driver):
assert driver.title=='百度一下,你就知道'
def test_baidu_so(self,init, driver):
so = driver.find_element_by_id('kw')
so.send_keys('周杰伦')
t.sleep(2)
assert so.get_attribute('value')=='周杰伦'
在控制台Terminal里面进入到该代码目录下,执行命令python -m pytest -v test
s/test_fixture_init.py,运行的结果如下:

pytest框架的selenium插件
安装selenium插件,命令pip3 install pytest-selenium,如下图:

安装成功后,测试百度搜索为例,代码如下:
import pytest
import time as t
@pytest.fixture()
def init(selenium):
'''UI自动化测试固件'''
selenium.maximize_window()
selenium.get('http://www.baidu.com')
yield #测试步骤和断言
selenium.close()
def test_baidu_title(init,selenium):
assert selenium.title=='百度一下,你就知道'
def test_baidu_so(init,selenium):
so=selenium.find_element_by_id('kw')
so.send_keys('周杰伦')
t.sleep(2)
assert so.get_attribute('value')=='周杰伦'
执行命令,结果如下:

Conftest.py(该命名是系统固定,不可更改)
例如腾讯qq文件的登录和注册帐户,conftest.py代码如下:
#conftest.py存放公共的配置文件
from selenium import webdriver
import pytest
@pytest.fixture()
def driver():
return webdriver.Chrome()
@pytest.fixture()
def init(driver):
driver.maximize_window()
driver.get('https://file.qq.com/')
yield
t测试模块est_qq_init.py文件,代码如下:
#! /usr/bin/env pytho
# -*- coding:utf-8 -*-
import time as t
def test_file_qq_002(init,driver):
'''登录验证:校验点击注册跳转到注册的页面'''
driver.switch_to.frame('login_frame1')
t.sleep(2)
driver.switch_to.frame('ptlogin_iframe')
t.sleep(2)
t.sleep(2)
nowHandler=driver.current_window_handle
driver.find_element_by_link_text('注册新帐号').click()
allHandlers=driver.window_handles
for handler in allHandlers:
if nowHandler!=handler:
driver.switch_to.window(handler)
t.sleep(2)
assert driver.title=='QQ注册'
t.sleep(2)
driver.close()
def test_file_qq_003(init,driver):
'''登录验证,登录的提示信息'''
driver.switch_to.frame('login_frame1')
t.sleep(2)
driver.switch_to.frame('ptlogin_iframe')
t.sleep(2)
driver.find_element_by_link_text('帐号密码登录').click()
t.sleep(2)
username=driver.find_element_by_xpath('//*[@id="uin_tips"]')
assert username.text=='支持QQ号/邮箱/手机号登录'
执行命令后,代码如下:

pytest.ini文件
在Pytest的配置文件中,除了conftest.py外,我们还可以使用pytest.ini,它是Pytest测试框架的主配置文件,可以改变Pytest默认行为,比如我们每次在执行时候带的-v输出详细的信息,以及-s打印输出详细的测试用例信息。我们在工程的根目录下创建pytest.ini的文件,
[pytest]
#指定执行时候的默认信息
addopts= -v -s
#注册标记
markers=
login:执行标记为login的测试函数
register:执行标记为register的测试函数
logout:执行标记为logout的测试函数
#指定Pytest的最低版本号
minversion=3.0
#指定忽略执行的目录
norecursedirs=.pytest_cache
#指定测试目录
testpaths=tests
#指定测试模块搜索的规则
python_files=test_*
#指定测试类搜索的规则
python_classes=Test*
#指定测试函数搜索规则
python_functions=test_*
pytest常用的插件
1、 pytest-sugar
在执行的时候显示进度条,即使有失败的也会立刻显示出来,安装命令pip3 install pytest-sugar,安装如下图:

在添加pytest.ini后运行,如果出现如下报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 52: illegal multibyte sequence
解决方法如下图(打开pytest.ini的文件,在右下角把UTF-8切换为GBK):

浙公网安备 33010602011771号