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(该命名是系统固定,不可更改)

       通过conftest.py可以共享fixture,fixture可以很好的解决测试固件的案例应用,依据它的思想可以编写多个案例,再本质的说就是通过conftest.py文件来达到共享fixture。conftest.py虽然是一个Python模块的文件,但是它是不能导入的,这点需要特别的注意。
        在pytest中通过conftest.py来共享fixture,如果希望多个测试 ⽂件共同使⽤⼀个fixture时候,可以在该⽬录下创建conftest.py⽂件,但是切记该⽂件绝对不能倒⼊使⽤,这点⼀ 定要注意,创建conftest.py⽂件后,把需要的fixture加⼊到⾥⾯,就可以使⽤了

例如腾讯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):

 

  

posted @ 2021-08-25 18:55  就不将就就  阅读(368)  评论(0编辑  收藏  举报