Pytest中使用Fixture替换Unittest的Setupclass及Pytest使用装饰器应用参数化

这篇具有很好参考价值的文章主要介绍了Pytest中使用Fixture替换Unittest的Setupclass及Pytest使用装饰器应用参数化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1  类里使用Fixture

        Pytest中夹具(Fixture)有几种生命周期:function->model->class->session->packages,其中默认为function。    

import pytest
from Common.logger import Log
from Common.Operator import *
from Common.Logins import Logins
from Page.Credentials.CredentialsPage import CredentialsPage as cp
from selenium.webdriver.common.by import By
import allure

log = Log("TestJohnDeere")


class TestJohnDeere:
    driver = None
    lg = None
    page = None

    coll = (By.XPATH, '//*[@id="nav_arrow"]/div')

    @pytest.fixture()  # 使用默认值
    def begin(self):
        log.info('--------开始测试John Deere Credentials功能--------')
        self.driver = browser("chrome")
        self.lg = Logins()
        self.lg.login(self.driver, 'atcred@iicon004.com', 'Win.12345')
        self.driver.implicitly_wait(10)

        self.page = cp()
        ac = self.lg.get_attribute(self.coll, 'class')
        while True:
            if ac != 'icn collapse':
                ar = (By.ID, 'nav_arrow')
                self.page.click(ar)
                continue
            else:
                break
        self.lg.click(self.page.johndeere_menu)
        time.sleep(1)
        self.lg.switch_to_iframe(self.page.right_iframe)

        yield self.lg
        self.driver.quit()

    def add_jdlink(self, begin):
        log.info('点击 JD Link 的Add')
        if not begin.is_clickable(self.page.jdlink_add_btn):
            time.sleep(2)
        try:
            begin.click(self.page.jdlink_add_btn)
            time.sleep(1)
            self.driver.switch_to.window(self.driver.window_handles[1])
            time.sleep(2)
            txt = begin.get_text(self.page.jdlink_page_signin_lable)
        except Exception:
            log.info('Add 跳转失败!')
            return False
        else:
            log.info('Add 跳转成功!')
            self.driver.switch_to.window(self.driver.window_handles[0])
            if txt == 'Sign In':
                return True
            else:
                return False

    @allure.feature("测试Credentials功能")
    @allure.story("测试JD Link Credentials设置功能")
    def test_addJDlink(self, begin):
        """测试Add JD Link功能"""
        res = self.add_jdlink(begin)
        if res:
            log.info('Add JD Link 测试成功!')
        else:
            log.info('Add JD Link 测试失败!')
        assert res


if __name__ == '__main__':
    pytest.main(['-vs', 'TestJohnDeere.py'])  # 主函数模式

2  指定Fixture范围

        在类外写Fixture,通过@pytest.para.usefixtures("fixture name")来调用。

    


import pytest
from Common.logger import Log
from Common.Operator import *
from Common.Logins import Logins
from selenium.webdriver.common.by import By
import allure

log = Log("test_logins")

# 定义fixture
@pytest.fixture(scope='class')
def starts():
    driver = browser("chrome")
    lg = Logins()
    lg.login(driver)
    driver.implicitly_wait(10)

    yield lg
    driver.quit()


# 使用fixtures
@pytest.mark.usefixtures('starts')
class TestLogins(Operator):

    home_log = (By.ID, 'button_home')
    btnuser = (By.ID, 'btnuser')
    loc = (By.ID, 'spanusername')

    # 修改密码元素
    changePwBtn_loc = (By.XPATH, '//*[@id="usermenu_panel"]/ul/li[2]/table/tbody/tr/td[2]/span')
    oldpw_loc = (By.ID, 'txt_old_pass')
    newpw_loc = (By.ID, 'txt_new_pass')
    confirmpw_loc = (By.ID, 'txt_new_pass2')
    changeOk_loc = (By.ID, 'button_submit')

    # 退出登录相关元素
    logout_loc = (By.XPATH, '//*[@id="usermenu_panel"]/ul/li[3]/table/tbody/tr/td[2]/span')
    loginB_loc = (By.ID, 'btn_login')

    @allure.feature("用户登录相关测试")
    @allure.story("测试登录功能")
    def test_login(self, starts):
        starts.click(self.home_log)
        time.sleep(2)
        starts.click(self.btnuser)
        time.sleep(1)

        displayname = starts.find_element(self.loc).text
        starts.click(self.btnuser)
        assert displayname == 'Auto Test'

    def change_password(self, starts):
        starts.driver.refresh()
        time.sleep(2)

        starts.click(self.btnuser)
        try:
            starts.click(self.changePwBtn_loc)
            time.sleep(1)
        except Exception:
            log.info('open change password failed!')
            return False
        else:
            starts.send_keys(self.oldpw_loc, 'Win.12345')
            starts.send_keys(self.newpw_loc, 'Win.12345')
            starts.send_keys(self.confirmpw_loc, 'Win.12345')
            time.sleep(1)

            try:
                starts.click(self.changeOk_loc)
                time.sleep(2)
                starts.driver.switch_to.alert.accept()
                time.sleep(1)
            except Exception:
                return False
            else:
                return True

    @allure.feature("用户登录相关测试")
    @allure.story("测试修改密码")
    def test_change_password(self, starts):
        assert self.change_password(starts)

    @allure.feature("用户登录相关测试")
    @allure.story("测试退出功能")
    def test_logout(self, starts):
        starts.driver.refresh()
        time.sleep(3)

        starts.click(self.btnuser)
        time.sleep(1)
        starts.click(self.logout_loc)

        # 判断是否正确退出
        res = starts.is_text_in_value(self.loginB_loc, 'LOGIN')
        assert res


if __name__ == '__main__':
    pytest.main(['-v', 'Testlogins.py'])

3  fixture和参数化同时使用

        fixture中不使用参数,测试用例使用参数化。文章来源地址https://www.toymoban.com/news/detail-752767.html

__author__ = 'ljzeng'

import pytest
from Common.logger import Log
from Common.Operator import *
from Common.Logins import Logins
import allure
from Common.excel import *
from Common.queryMSSQL import updateSQL
from Page.ManageAssets.ManageDevicesPage import ManageDevicesPage

log = Log("TestManageDevices")
file_path = "TestData\\managedevice.xlsx"
testData = get_list(file_path)


# 初始化数据库数据
def clearTestData():
    log.info('从数据库删除测试数据')
    dta = 'ironintel_admin'
    dtm = 'IICON_001_FLVMST'
    sqlstr = "delete from GPSDEVICES where CONTRACTORID='IICON_001' and Notes like '%AutoTest%'"
    sqls = "delete from COMMENTS where COMMENTS like '%AutoTest%'"
    updateSQL(dta, sqlstr)
    updateSQL(dtm, sqls)


@pytest.fixture(scope='class')
def begin():
    driver = browser("chrome")
    lg = Logins()
    lg.login(driver, 'atdevice@iicon001.com', 'Win.12345')
    driver.implicitly_wait(10)
    clearTestData()

    lg.device = ManageDevicesPage()
    try:
        lg.switch_to_iframe(lg.device.iframe_loc)
        time.sleep(1)
    except Exception:
        log.info('------Open Manage Devices failed!')
    else:
        log.info('------Open Manage Devices completed!')

    yield lg
    clearTestData()
    driver.quit()


@pytest.mark.usefixtures("begin")
class TestManageDevices:
    def saveDevices(self, begin, data):
        current_time1 = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
        current_date1 = time.strftime('%m/%d/%Y')
        time.sleep(1)
        try:
            while not begin.is_clickable(begin.device.addBtn_loc):
                log.info('添加按钮不可点击,等待3秒再看')
                time.sleep(3)
            begin.click(begin.device.addBtn_loc)
            time.sleep(1)
            begin.switch_to_iframe(begin.device.addDeviceIframe_loc)
            time.sleep(1)
        except Exception:
            log.info('--------打开添加设备页面失败!--------')
        else:
            log.info('----测试:  %s' % data['casename'])
            time.sleep(3)
            begin.select_by_text(begin.device.selectSource_loc, data['source'])
            time.sleep(2)
            if data['source'] == 'Foresight ATU':
                begin.select_by_text(begin.device.seldeviceType_loc, data['type'])
            else:
                begin.send_keys(begin.device.deviceType_loc, data['type'])

            begin.send_keys(begin.device.deviceId_loc, data['sn'])
            time.sleep(2)

            begin.send_keys(begin.device.invoiceDate_loc, current_date1)
            begin.send_keys(begin.device.invoiceNo_loc, current_time1)
            begin.send_keys(begin.device.startDate_loc, current_date1)
            begin.send_keys(begin.device.notes_loc, 'AutoTestNotes' + current_time1)
            try:
                begin.click(begin.device.saveBtn_loc)
                time.sleep(1)
                mess = begin.get_text(begin.device.savemessage_loc)
                time.sleep(1)
                begin.click(begin.device.saveDialogOkBtn_loc)
                time.sleep(1)
                res = (mess == data['mess'])
            except Exception:
                log.info('-----保存设备添加失败!-----')
                res = False
            else:
                begin.click(begin.device.exitWithoutSavingBtn_loc)
                time.sleep(3)
                begin.driver.switch_to.default_content()
                begin.switch_to_iframe(begin.device.iframe_loc)
                time.sleep(3)
            return res

    @allure.feature('测试设备管理相关功能')
    @allure.story('测试新建设备')
    @pytest.mark.parametrize('data', testData)
    def test_add_devices(self, begin, data):
        """测试添加设备"""
        res = self.saveDevices(begin, data)
        assert res


if __name__ == '__main__':
    pytest.main(['-vs', 'TestManageDevices.py']) 

到了这里,关于Pytest中使用Fixture替换Unittest的Setupclass及Pytest使用装饰器应用参数化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pytest装饰器 @pytest.mark.parametrize 使用方法

    @pytest.mark.parametrize 有三种传参方法,分别是: 1.列表传参:将参数值作为列表传递给装饰器。 2.元组传参:将参数值作为元组传递给装饰器。 3.字典传参:将参数名和参数值以字典的形式传递给装饰器。 使用方法如下: 在上面的例子中,我们定义了名为 test_function 的测试函

    2024年02月03日
    浏览(47)
  • pytest笔记2: fixture

      没有 setup/teardown?    

    2024年02月09日
    浏览(38)
  • pytest的fixture梳理

    夹具是在测试中用于提供共享资源、设置测试环境或模拟行为的工具。 1. 可以重复使用,多个用例可以使用同一个fixture 2. 一个测试用例可以使用多个装置 2.1 如果多个装置存在yield,则是先进后出 如果一个fixture存在返回值,那么可以通过 函数名 直接使用其 返回值 ,如下所示

    2024年02月13日
    浏览(38)
  • pytest fixture 常用参数

    fixture 常用的参数 参数一:autouse,作用:自动运行,无需调用 举例一:我们在类中定义一个function 范围的fixture; 设置它自动执行autouse=True,那么我们看下它执行结果  输出:  说明:因为设置了自动执行,且范围是方法级别,那么每次在方法或函数前后都会执行fixture;yie

    2024年02月13日
    浏览(36)
  • Pytest教程__fixture(9)

    fixture是pytest特有的功能,使用装饰器 @pytest.fixture 标记的函数在其他函数中能被当作参数传入并被调用。 fixture有明确的名字,在其他函数,模块,类或整个工程调用它时会被激活。 fixture是基于模块来执行的,每个fixture的名字就可以触发一个fixture的函数,它自身也可以调用

    2024年02月09日
    浏览(36)
  • pytest fixture 用于teardown工作

    fixture通过scope参数控制setup级别,setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作。这里用到fixture的teardown操作并不是独立的函数,用yield呼唤teardown操作。 举个例子:  输出: 说明:yield yield 在 fixture 中起到了唤起 teardown 的作用,同时也可以和 r

    2024年02月13日
    浏览(35)
  • Pytest fixture参数传递的4种方式

    最近使用Pytest中的fixture和conftest时,遇到需要在conftest中的setup和teardown方法里传递参数。这里记录以下4种实现的方式。 结果: 结果: 结果:

    2024年02月16日
    浏览(35)
  • pytest fixture 创建一个 requests.session() 对象

    当你运行这段代码时,它会执行以下操作: 1. 导入必要的库:`pytest` 和 `requests`。 2. 定义一个夹具(fixture)函数 `session`,使用 `@pytest.fixture(scope=\\\'session\\\')` 装饰器进行标记。这个夹具函数在整个测试会话期间只会被执行一次。 3. 在 `session` 夹具函数中,创建一个 `requests.sess

    2024年02月11日
    浏览(36)
  • 自动化测试 —— Pytest fixture及conftest详解

    fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似unittest中setup/teardown,但是比它们要强大、灵活很多

    2024年04月08日
    浏览(33)
  • Pytest测试技巧之Fixture:模块化管理测试数据

    在 Pytest 测试中,有效管理测试数据是提高测试质量和可维护性的关键。本文将深入探讨 Pytest 中的 Fixture,特别是如何利用 Fixture 实现测试数据的模块化管理,以提高测试用例的清晰度和可复用性。  什么是Fixture? 在 Pytest 中,Fixture 是一种用于为测试用例提供设置和资源的

    2024年02月22日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包