pytest的使用流程

1、安装pytest

pip install -i 镜像源 pytest

2、pytest的默认规则

a、pytest不需要定义类,可以直接写测试用例函数

def test_demo1:
    print('test_demo1')

3、pytest的ini配置文件,用来指定输出方式及指定用例名称规则,打mark标记过滤用例

[pytest]

addopts = -s #指定运行用例输出结果的格式为标准输出

#指定测试用例模块名规则
python_files=test_*.py
#指定测试用例类命名规则
python_classes=Test*
#指定测试用例命名规则
python_functions=test_*


markers
    conf: confest demo
    csdn: csdn test login

4、confest统一管理前置后置,避免冗余

先在pycharm里面建一个confest.py的文件,之后开始导包,写前置后置用例,以打开浏览器为例

import pytest
from selenium import webdriver

@pytest.fixture(默认为函数级别的前置,可以通过scope="class"/moudle/package指定前置后置的级别)
def _driver():
    driver=webdriver.Chrome()
    #print('函数级别的前置操作')
    yield driver #返回数据但不停止函数
    #print('函数级别的后置操作')

    

a.新建conftest.py文件,文件名必须是conftest

b.定义前置后置的fixture函数@pytest.fixture

        def _driver():

        #前置操作

        yield 返回数据1,返回数据2

        #后置操作

def _driver(): #前置操作 yield 返回数据1, 返回数据2 #后置操作 fixture默认为 function函数级别

3.每个包都可以 拥有自己的 conftest.py测试夹具, 它不是共有 session级别整个项目可用

4.fixture函数 可以作为参数传递给其它fixture函数, 灵活组合不同的应用场景

目的: 减少前置和后置操作的冗余代码

5.一个测试用例在使用fixture函数时, 形参位置可以接收多个fixture函数 fixture中的scope级别, 决定 前置后置操作 什么时间执行及执行的次数.

函数级别的的前置后置

def setup_function:
    print('函数级别的前置')

def teardown_function:
    print('函数级别的的后置')

类级别的前置后置



class LoginDemo1:
    def setup_class():
        print('类级别的前置')

    def setup_method():
        print('类中函数级别的前置')
    
    def teardown_method():
        print('类中函数级别的后置')

    def teardown_class():
        print('类级别后置')

模块级别的的前置后置

def setup():
    print('模块级别的前置')
    
def teardown():
    print('模块级别的后置')

项目级别的前置后置

5、在pycharm里建一个test_demo1.py的用例文件

import pytest
@pytest.mark.conf
def test_001(-driver):#将fixture的函数名称,写在测试用例的参数位置,测试用例执行时会自动调用
    driver = -driver
    driver.get('http://www.baidu.com')
    #print('第一条测试用')

6、pytest的参数化,在pycharm里建一个test_csdn_login.py的用例文件,在ini配置文件中加入csdn用例标签,在执行文件中将标签换为csdn

from time import sleep
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By

login_data=[('17525587986','123xjgjkh'),('17612454565','12sfgf')]#参数化的参数

class Test_CSDNLogin:
    def setup_class(self):
        self.driver=webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(10)
        self.driver.get('https://www.csdn.net/')
        self.driver.find_element(By.LINK_TEXT,'登录').click()
        self.driver.switch_to.frame('passport_iframe')
        self.driver.find_element(By.CSS_SELECTOR,'body > div > div > div > div.login-box > div.login-box-top > div.login-box-tabs > div.login-box-tabs-items > span:nth-child(4)').click()

    def teardown_class(self):
        sleep(3)
        self.driver.quit()

    def setup_method(self):
        pass

    def teardown_method(self):
        sleep(2)
        self.driver.refresh()

    @pytest.mark.csdn
    @pytest.mark.parametrize('uname,pwd',login_data)#参数化
    def test_tb_login(self,uname,pwd):
        self.driver.find_element(By.CSS_SELECTOR,'body > div > div > div > div.login-box > div.login-box-top > div > div.login-box-tabs-main > div > div:nth-child(1) > div > input').send_keys(uname)
        self.driver.find_element(By.CSS_SELECTOR,'body > div > div > div > div.login-box > div.login-box-top > div > div.login-box-tabs-main > div > div:nth-child(2) > div > input').send_keys(pwd)
        self.driver.find_element(By.CLASS_NAME,'base-button').click()

7、执行pytest的用例,在用例文件之外创建用例加载和执行的runner.py文件

import test
if __name__=='__main__':
    pytest.main(['-m','conf'])

8、allure报告

import os

import pytest

if __name__=='__main__':
    pytest.main(['-m','csdn','--alluredir','./csdn'])
    os.system('allure generate ./csdn -o ./csdnreport --clean')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值