目录
一 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=33. 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
十三 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 openpyxl2.导入: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
文章来源:https://www.toymoban.com/news/detail-499343.html
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()
文章来源地址https://www.toymoban.com/news/detail-499343.html
到了这里,关于pytest 自动化学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!