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):