pytest 自动化学习

目录

一  pytest简介与安装

二  Pytest 命令规则

三  pycharm配置与界面化运行

四  pytest测试用例结构

五  Pytest 测试用例断言

六 Pytest 测试框架结构

七  pytest参数化用例

八  Pytest 标记测试用例

九   Pytest 设置跳过、预期失败用例

十  运行用例

十一 测试用例调度与运行

十二 常用命令行参数

十三  Python 代码执行 pytest

十四 Pytest 异常处理

十五  数据驱动-yaml

十六  pytest数据驱动-excel

十七 Pytest结合数据驱动csv

十八  Pytest结合数据驱动json


一  pytest简介与安装

def inc(x):
return x+1

def test_answer():
assert inc(3) == 5 #判断 4会不会等5

二  Pytest 命令规则

三  pycharm配置与界面化运行

 

 

 

Pytest简介以及常用插件安装
1.pytest是一个非常成熟的单元测试框架。灵活和简单
2.它可以结合selenium,requests,appium完成各种不同的自动化
3.它还可以生成自定义allure报告以及和Jenkins持续集成
4.pytest有很多强大的插件

pytest
pytest-html(生成html报告的插件)
pytest-xdist(多线程运行的插件)
pytest-ordering(改变用例的执行顺序的插件 )
pytest-rerunfailres( 失败用例重跑的插件)
allure-pytest(生成美观自定义的allure报告)

pytest默认测试用例的规则以及基础应用
1.模块名必须以test_开头或者_test结尾。
⒉测试类必须以Test开头,并且不能带有init方法。
3.测试用例必须以test_开头。



四  pytest测试用例结构

用例结构
三部分构成
      1.用例名称用例步骤                2.编辑                 3.断言

 

 

 

五  Pytest 测试用例断言

def test_a():
    a = 1
    b = 2
    expect = 3
    assert a + b == expect


def test_str():
    assert  "abc" in "abcd"  # abcd 是否包含在 abc 里面 

def test_plat():
    assert ('linux' in sys.platform) ,"该代码不在 linux 下运行"  #直接报我写的这个错误

六 Pytest 测试框架结构

七  pytest参数化用例

 

import pytest

search_list =['appium']

# 单参数  的第一个名字 ,第一个如果有多的数字可以放在列表里面
# 第一个是变量名字,第二个是 序列
@pytest.mark.parametrize('name',search_list)

def test_search(name):
    assert name in search_list
import pytest

#1、参数化的名字,要与方法中的参数名,——对应,
#2、如果传递多个参数的话,要放在列表中,列表中嵌套列表/元组
@pytest.mark.parametrize("test_input,expected",[
    ("3+5",8),("2+5",7),("7+5",12)   #不能有空格
])

def test_mark_more(test_input,expected):
    assert eval(test_input) == expected
# 用例重用名

import pytest

#1、参数化的名字,要与方法中的参数名,——对应,
#2、如果传递多个参数的话,要放在列表中,列表中嵌套列表/元组
#3.ids 的个数==传递的数据个数
@pytest.mark.parametrize("test_input,expected",[
    ("3+5",8),("2+5",7),("7+5",12)
],ids=["number1","number2","number3"])  #ids用于重命名

def test_mark_more(test_input,expected):
    assert eval(test_input) == expected

 

 

  

八  Pytest 标记测试用例

 

 

 

 

九   Pytest 设置跳过、预期失败用例

 

  

import sys

import pytest

# skip 用法
@pytest.mark.skip    #里面的所有内容被跳过
def test_aaa():
    print("里面的所有内容被跳过,不显示,用于开发代码未开发完,代码没有实现")
    assert True

@pytest.mark.skip(reson =" 代码没有被实现") # 写备注
def test_bbb():
    assert False


# 代码里面 添加,跳过代码块 putest.skip(reson="")
def check_login():
    return True


def test_function():
    print("start")
    # 如果没有登入,就跳过后续步骤
    if not check_login():
        # 如果没有登入执行下面的的语句被跳过
        pytest.skip("unsupported configuration")
    print("end")

# skipif 用法
#  sys.platform 版本系统,如果是 mac 系统 希望在 mac系统 跳过
@pytest.mark.skipif(sys.platform == 'darwin',reason=" does not run on mac ")
def test_case1():
    assert True

#  sys.platform 版本系统,win 系统,希望在 win 系统 跳过
@pytest.mark.skipif(sys.platform == 'win',reason=" does not run on mac ")
def test_case2():
    assert True

#  sys.platform 版本系统,puthon 版本系统 希望在 python 3.6 几的版本 跳过
@pytest.mark.skipif(sys.version_info < (3,6),reason=" requires python3.6 or higher ")
def test_case3():
    assert True

 

import pytest


# xfail 只是起到一个提示的作用,如果成功就回提示,跳过语句
@pytest.mark.xfail
def test_aaa():
    # 如果成功 提示 XPASS 失败提示 XFAIL
    print("test_xfail1 方法执行")

xfail = pytest.mark.xfail

@xfail(reason="bug 110")
def test_hello4():
    assert 0

def test_xfail():
    print("** 开始测试 ** ")
    pytest.xfail(reason="该功能没有完成") # 后面的不执行
    print("测试过程")
    assert 1 == 1

@pytest.mark.xfail
def test_aaa():
    print("test_xfail1 方法执行")
    print("测试过程2")
    assert 1 == 2

十  运行用例

 

十一 测试用例调度与运行

十二 常用命令行参数及插件报告

 1. pytest test_demo1.py -v 
 2.  pytest test_demo1.py -v --maxfail=3 

 3.  pytest test_demo1.py -v -k "str"   # 运行标题包含 str 的用例 

 4.  pytest test_demo1.py -v -k  "not  str"    # 运行标题不包含 str 的用例 

 5.  pytest test_demo1.py -k "not big" -v -s   # 打印日志 

 6.  pytest --collect-only

2.python插件报告 

   安装的命令

执行 pytest 命令就可以执行html 文件

十三  Python 代码执行 pytest

 

 

 

 

python -m pytest test_demo1.py

十四 Pytest 异常处理

常用的异常处理方法
1. try...except
2. pytest.raises()
 


try:
a = int(input("除数: "))
b = int(input("被除数: "))
c = a / b
print(" c 的结果是 ",c)

except(ValueError,ArithmeticError):
print("程序发生意外,算数的异常")
except:
print("都有异常")

print("程序继续运行")

异常处理方法 pytest.raise()
可以捕获特定的异常
● 获取捕获的异常的细节(异常类型,异常消息)

● 发生异常,后面的代码将不会被执行

 

import pytest

# 如果有发生错误,下面的代码不会运行
def test_raise():
    with pytest.raises((ZeroDivisionError,ValueError)):
        # raise ValueError("value must be 0 or None")
        raise ZeroDivisionError(" 除数未0 ")

def test_raise1():
    with pytest.raises(ValueError) as exc_info:
        raise ValueError("Value must be 42")

    assert  exc_info.type is ValueError
    assert exc_info.value.args[0] == "value must be 41"

十五  数据驱动-yaml

简介


     数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件(例如yaml,json等)来对数据进行存储,然后在测试用例中读取这些数据
 

应用场景
   App、Web、接口自动化测试

     1.测试步骤的数据驱动
     2.测试数据的数据驱动。配置的数据驱动
 

import  pytest
import yaml


class Testdemo3:
    @pytest.mark.parametrize("evn",yaml.safe_load(open("./evn.yml")))
    def test_demo(self,evn):
        if "test" is evn:
            print("测试环境")
            print("测试环境的IP 是 "+evn["test"])
        elif "dev" is evn:
            print("这个是开发环境")
            print("测试环境的IP 是 " +evn["dev"])

    def test_yaml(self):
        print(yaml.safe_load(open("./evn.yml")))

十六  pytest数据驱动-excel

 https://openpyxl.readthedocs.io/en/stable/

 openpyxl库的安装
   1. 安装:pip install openpyxl 

    2.导入:import openpyxl


import openpyxl

# 获取工作谱
book = openpyxl.load_workbook('params.xlsx')

# 获取工作表
sheet = book.active

# 获取单元格数据
a_1 = sheet['A1'].value
print(a_1)

c_3 = sheet.cell(column=3,row=3).value
print("c_3",c_3)

# 获取多个单元格
cells = sheet["A1":"C3"]
# 这个是一个集合的元素,可以打印他的类型
print(type(cells),cells)



 

 

 

 

import openpyxl
import pytest

from utils.data.operation import my_add




def get_excel():
        # 获取工具谱
        book = openpyxl.load_workbook('params.xlsx')
        # 获取工作表 [1,1,2][3,6,9][100,200,300]
        sheet = book.active
        #读取取单元格数据
        cells = sheet["A1":"C3"]
        print(cells)
        values = []
        for row in cells:
            data =[]
            for cell in row:
                data.append(cell.value)
            values.append(data)

        return values



class TestWithEXCEL:
    @pytest.mark.parametrize('x,y,expected',get_excel())
    def test_add(self,x,y,expected):
        assert my_add(int(x),int(y))  == int(expected)

十七 Pytest结合数据驱动csv

import  csv

def get_csv():
    with open('democsv.csv','r',encoding='utf-8') as file:
        raw = csv.reader(file)

        for line in raw:
            print(line)

if __name__ == '__main__':
    get_csv()

 

def my_add(x,y):
    result = x + y
    return result




import csv

import pytest

from utils.data.operation import my_add

def test_get_csv():
    with open('paramsdemo.csv',encoding='utf-8') as file:
        raw =csv.reader(file)

        data = []
        for line in raw:
            data.append(line)

        print(data)

    return data



class TestWithCSV:
    @pytest.mark.parametrize('x,y,expected',test_get_csv())
    def test_add(self,x,y,expected):
        assert my_add(int(x),int(y)) == int(expected)

十八  Pytest结合数据驱动json

import  json

def get_json():
    with open('json.json','r',encoding='utf-8') as file:
        data = json.loads(file.read())
        print(data,type(data))

        # 同时使用ensure_ascii=False参数确保输出的JSON字符串中的非ASCII字符(例如中文字符)被正确编码。转换后的 JSON 字符串存储在变量s中。
        s = json.dumps(data,ensure_ascii=False)
        print(s)
        print(type(data))


if __name__ == '__main__':
    get_json()

十九 pytest 插件

1. 控制用例执行的插件
    unittest测试用例执行顺序是根据测试方法名称的assicc码值的大小来的,值越小排在前面(a-z)        pytest正常情况下是根据测试方法的从上到下的顺序来执行。

可以通过 pytest-ordering 插件来控制pytest 测试的方式 执行的顺序

安装 

    在线安装:pip install pytest-ordering
离线安装:

    下载对应的离线安装包,解压后,并进入到对应的目录,执行python setup.py install pycharm

通过 @pytest.mark.run(order=5)  来控制执行的顺序

 @pytest.mark .last   #设置用例最后执行

    @pytest.mark.run(order=5) #执行的顺序
    def test_add_01(self):
        result = add(1,5)
        print(result)
        assert result !=4 # 断言

    @pytest.mark.run(order=3)
    def test_add_02(self):
        result2 = add(1, 5)
        print(result2)
        assert result2 == 6  # 断言

    @pytest.mark.run(order=2)
    def test_add_03(self):
        result3 = add(1, 5)
        print(result3)
    @pytest.mark.run(order=-1)
    def test_add_04(self):
        result4 = add(1, 5)
        print(result4)
        assert result4 == 6  # 断言

2. 失败执行用例的插件

 有的时候网络问题会导致加载失败 所以要用到 这个插件:    pytest-rerunfailures

 

 3. 跳过用例的插件

pytest-rerunfailures 安装。

在线安装
离线安装o pycharm使用
在addopts参数行中增加对应的参数项:   --reruns 3   

当重复执行成功时,就不会再重复执行。

pytest.mark.skipif(condition, reason=None)
condition表示是跳过的条件
pytest.mark.skip(reason=None)

reason表示的是跳过的原因
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值