当前位置: 首页 > news >正文

哔哩哔哩免费网站观看设计公司名字logo

哔哩哔哩免费网站观看,设计公司名字logo,如何建立网站教材,wordpress登陆失败点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接#xff1a;https://ceshiren.com/t/topic/26755 Pytest 命名规则 类型规则文件test_开头 或者 _test 结尾类Test 开头方法/函数test_开头注意#xff1a;测试类中不可以添加__init__构造函数 注…点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接https://ceshiren.com/t/topic/26755 Pytest 命名规则 类型规则文件test_开头 或者 _test 结尾类Test 开头方法/函数test_开头注意测试类中不可以添加__init__构造函数 注意pytest对于测试包的命名没有要求 方法类中定义的函数 函数类外面定义的函数 谷歌风格开源项目风格指南 https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/ 2 Pytest用例断言 断言的概念 断言(assert)是一种在程序中的一阶逻辑(如一个结果为真或假的逻辑判断式)目的为了表示与验证软件开发者预期的结果。当程序执行到断言的位置时对应的断言应该为真。若断言不为真时程序会中止执行并给出错误信息。 断言的用法 断言写法 assert 表达式assert 表达式,描述 assert bool expression; assert bool expression : message; 示例一 def test_a():assert Truedef test_b():a 1b 1c 2assert a b c, f{a}{b}{c}, 结果为真 示例二 def test_c():a 1b 1c 2assert abc in abcdimport sys def test_plat():assert (linux in sys.platform), 该代码只能在 Linux 下执行Pytest测试框架结构setup/teardown 测试装置介绍 类型规则setup_module/teardown_module全局模块级setup_class/teardown_class类级只在类中前后运行一次setup_function/teardown_function函数级在类外setup_method/teardown_method方法级类中的每个方法执行前后setup/teardown在类中运行在调用方法的前后重点 Pyrest参数化用例 参数化 通过参数的方式传递数据从而实现数据和脚本分离。并且可以实现用例的重复生成与执行。 参数化测试函数使用 单参数情况 单参数可以将数据放在列表中 search_list [appium,selenium,pytest]pytest.mark.parametrize(name,search_list) def test_search(name):assert name in search_list多参数情况 将数据放在列表嵌套元组中将数据放在列表嵌套列表中 # 数据放在元组中 pytest.mark.parametrize(test_input,expected,[(35,8),(25,7),(75,12) ]) def test_mark_more(test_input,expected):assert eval(test_input) expected # 数据放在列表中 pytest.mark.parametrize(test_input,expected,[[35,8],[25,7],[75,12] ]) def test_mark_more(test_input,expected):assert eval(test_input) expected用例重命名-添加 ids 参数 通过ids参数将别名放在列表中 pytest.mark.parametrize(test_input,expected,[(35,8),(25,7),(75,12) ],ids[add_358,add_257,add_3512]) def test_mark_more(test_input,expected):assert eval(test_input) expected用例重命名-添加 ids 参数中文 pytest.mark.parametrize(test_input,expected,[(35,8),(25,7),(75,12) ],ids[3和5相加,2和5相加,7和5相加]) def test_mark_more(test_input,expected):assert eval(test_input) expected ids不支持中文默认是unicode编码格式可以用如下方法转换 # 在项目最末一级下创建conftest.py 文件 将下面内容添加进去运行脚本 def pytest_collection_modifyitems(items):测试用例收集完成时将收集到的用例名name和用例标识nodeid的中文信息显示在控制台上for i in items:i.namei.name.encode(utf-8).decode(unicode_escape)i._nodeidi.nodeid.encode(utf-8).decode(unicode_escape)笛卡尔积 接口测试中用的较多因为接口的值很多 两组数据 a[1,2,3]b[a,b,c] 对应有几种组合形势 (1,a),(1,b),(1,c)(2,a),(2,b),(2,c)(3,a),(3,b),(3,c) pytest.mark.parametrize(b,[a,b,c]) pytest.mark.parametrize(a,[1,2,3]) def test_param1(a,b):print(f笛卡积形式的参数化中 a{a} , b{b})执行方向由近致远 使用 Mark 标记测试用例 Mark标记测试用例 场景:只执行符合要求的某一部分用例 可以把一个web项目划分多个模块然后指定模块名称执行。 解决: 在测试用例方法上加 pytest.mark.标签名 执行: -m 执行自定义标记的相关用例 pytest -s 文件名 -mwebtestpytest -s test_mark_zi_09.py -m apptestpytest -s test_mark_zi_09.py -m not ios必须要是双引号pytest -v是能输出更详细的用例信息成功与失败不再是.和F 如何解决warnings问题 [pytest] # 在项目目录下创建一个pytest.ini放标签这样这些标签就不会warning。而且要换行写也不要顶头写会被认为是key # 在这里注册好标签名后pytest可以识别 markers strbignumfloatintminuszeropytest 设置跳过、预期失败 Mark跳过(Skip)及预期失败(xFail) 这是 pytest 的内置标签可以处理一些特殊的测试用例不能成功的测试用例skip - 始终跳过该测试用例skipif - 遇到特定情况跳过该测试用例xfail - 遇到特定情况,产生一个“期望失败”输出 Skip 使用场景 调试时不想运行这个用例 标记无法在某些平台上运行的测试功能 在某些版本中执行其他版本中跳过 比如当前的外部资源不可用时跳过 如果测试数据是从数据库中取到的连接数据库的功能如果返回结果未成功就跳过因为执行也都报错 解决 1添加装饰器 pytest.mark.skippytest.mark.skipif 解决 2代码中添加跳过代码 pytest.skip(reason) # 形式一跳过这个方法 pytest.mark.skip(reason存在bug) def test_double_str():print(代码未开发完)assert aa aa# 形式二跳过这个方法 pytest.mark.skipif(sys.platform win32, reasondoes not run on win32) def test_case():print(sys.platform)assert True# 形式二在代码中跳过代码 def check_login():return Falsedef test_double_str():print(start)if not check_login():pytest.skip(未登录不进行下去)print(end) # 1 skipped in 0.02s xfail 使用场景 用于标记此用例可能会失败当脚本失败时测试报告也不会打印错误追踪只是会显示xfail状态。xfail的主要作用是比如在进行测试提前时,当产品某功能尚未开发完成而进行自动化脚本开发,当然此时也可以把这些脚本注释起来,但这不是pytest推荐的做法,pytest推荐使用xfail标记,如此则虽然产品功能尚未开发完成,但是自动化脚本已经可以跑起来了,只不过在测试报告中会显示xfail而已。 与 skip 类似 预期结果为 fail 标记用例为 fail与skip不同xfail标记的用例依然会被执行如果执行成功就返回XPASS执行失败就返回XFAIL。只是起到一个提示的作用。用法添加装饰器pytest.mark.xfail pytest.mark.xfail def test_case():print(test_xfail 方法执行)assert 2 2 # XPASS [100%]test_xfail pytest.mark.xfail def test_case():print(test_xfail 方法执行)assert 1 2# XFAIL [100%]test_xfail 方法执行xfail pytest.mark.xfail xfail(reasonbug 110) def test_case():print(test_xfail 方法执行)assert 1 2# XFAIL (bug 110) [100%]test_xfail 方法执行 pytest 运行用例 运行多条用例方式 如果要进入某个文件所在的目录终端可以右键文件-选择open in terminal 执行包下所有的用例pytest/py.test [包名] 执行单独一个 pytest 模块pytest 文件名.py 运行某个模块里面某个类pytest 文件名.py::类名 运行某个模块里面某个类里面的方法pytest 文件名.py::类名::方法名 加-v可以具体展示如pytest -v 文件名.py::类名::方法名 -v在前在后都行 test_skip.py::TestDemo::test_demo1 PASSED [100%] 运行结果分析 常用的fail/error/passerror可能是代码写错了特殊的结果warning/deselect后面会讲 python 执行 pytest 前面已经介绍了几种执行用例的方法一个是点击代码方法或类的左侧绿色箭头一个是右键测试用例一个是终端pytest解释器执行我们也可以用python解释器执行 Python 代码执行 pytest 方法一使用 main 函数 方法二使用 python -m pytest 调用 pytestjenkins 持续集成用到相当于在原来pytest 用例前加了python -m。 方便指定python版本比如有的用例使用python老版本写的 Python 代码执行 pytest - main 函数 if __name__ __main__:# 1、运行当前目录下所有符合规则的用例包括子目录test_*.py 和 *_test.pypytest.main()# 2、运行test_mark1.py::test_dkej模块中的某一条用例pytest.main([test_mark1.py::test_dkej,-vs])# 3、运行某个 标签pytest.main([test_mark1.py,-vs,-m,dkej])运行方式python test_*.py pytest 异常处理 异常处理方法 try …except try:可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]:处理异常的代码块1 except [ (Error3, Error4, ... ) [as e] ]:处理异常的代码块2 except [Exception]:处理其它异常异常处理方法 pytest.raise() 可以捕获特定的异常获取捕获的异常的细节异常类型异常信息发生异常后面的代码将不会被执行 def test_raise():with pytest.raises(ValueError, matchmust be 0 or None):raise ValueError(value must be 0 or None)def test_raise1():with pytest.raises(ValueError) as exc_info:raise ValueError(value must be 42)assert exc_info.type is ValueErrorassert exc_info.value.args[0] value must be 42这样可以选择一个异常 def test_raise():with pytest.raises((ZeroDivisionError,ValueError)):raise ZeroDivisionError(value must be 0 or None)Pytest 结合数据驱动 YAML 数据驱动 什么是数据驱动 数据驱动就是数据的改变从而驱动自动化测试的执行最终引起测试结果的改变。简单来说就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动数据量大的情况下建议大家使用一种结构化的文件(例如 yamljson 等)来对数据进行存储然后在测试用例中读取这些数据。 应用 App、Web、接口自动化测试测试步骤的数据驱动测试数据的数据驱动配置的数据驱动 yaml 文件介绍 对象键值对的集合用冒号 “:” 表示 数组一组按次序排列的值前加 “-” 纯量单个的、不可再分的值 字符串布尔值整数浮点数Null时间日期 # 编程语言 languages:- PHP- Java- Python book:Python入门: # 书籍名称price: 55.5author: Lilyavailable: Truerepertory: 20date: 2018-02-17Java入门:price: 60author: Lilyavailable: Falserepertory: Nulldate: 2018-05-11相当于 languages:[PHP, Java, Python] # languages是key值yaml 文件使用 查看 yaml 文件 pycharmtxt 记事本 读取 yaml 文件 安装pip install pyyaml方法yaml.safe_load(f)yaml-python方法yaml.safe_dump(f) python-yaml import yaml file_path ./my.yaml with open(file_path, r, encodingutf-8) as f:data yaml.safe_load(f)工程目录结构看项目文件datadriver_yaml data 目录存放 yaml 数据文件func 目录存放被测函数文件testcase 目录存放测试用例文件 # 工程目录结构 . ├── data │ └── data.yaml ├── func │ ├── __init__.py │ └── operation.py └── testcase├── __init__.py└── test_add.py测试准备 被测对象operation.py测试用例test_add.py测试数据data.yaml # operation.py 文件内容 def my_add(x, y):result x yreturn result # test_add.py 文件内容 class TestWithYAML:pytest.mark.parametrize(x,y,expected, [[1, 1, 2]])def test_add(self, x, y, expected):assert my_add(int(x), int(y)) int(expected) # data.yaml 文件内容 -- 1- 1- 2 -- 3- 6- 9 -- 100- 200- 300Pytest 数据驱动结合 yaml 文件 # 读取yaml文件 def get_yaml():获取json数据:return: 返回数据的结构[[1, 1, 2], [3, 6, 9], [100, 200, 300]]with open(../datas/data.yaml, r) as f:data yaml.safe_load(f)return dataPytest 结合数据驱动 Excel 读取 Excel 文件 第三方库 xlrdxlwingspandas openpyxl 官方文档 openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files — openpyxl 3.1.2 documentation openpyxl 库的安装 安装pip install openpyxl导入import openpyxl openpyxl 库的操作 读取工作簿读取工作表读取单元格 import openpyxl# 获取工作簿 book openpyxl.load_workbook(../data/params.xlsx)# 读取工作表 sheet book.active# 读取单个单元格 cell_a1 sheet[A1] cell_a3 sheet.cell(column1, row3) # A3# 读取多个连续单元格 cells sheet[A1:C3]# 获取单元格的值 cell_a1.value工程目录结构 data 目录存放 excel 数据文件func 目录存放被测函数文件testcase 目录存放测试用例文件 # 工程目录结构 . ├── data │ └── params.excel ├── func │ ├── __init__.py │ └── operation.py └── testcase├── __init__.py└── test_add.py测试准备 被测对象operation.py测试用例test_add.py # operation.py 文件内容 def my_add(x, y):result x yreturn result# test_add.py 文件内容 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)测试准备 测试数据params.xlsx 注意.xlsx文件要在外面创建不要在编辑器里创建 Pytest 数据驱动结合 Excel 文件 # 读取Excel文件 import openpyxl import pytestdef get_excel():# 获取工作簿book openpyxl.load_workbook(../data/params.xlsx)# 获取活动行非空白的sheet book.active# 提取数据格式[[1, 2, 3], [3, 6, 9], [100, 200, 300]]values []for row in sheet:line []for cell in row:line.append(cell.value)values.append(line)return valuesPytest 结合数据驱动 csv csv 文件介绍 csv逗号分隔值是 Comma-Separated Values 的缩写以纯文本形式存储数字和文本文件由任意数目的记录组成每行记录由多个字段组成 Linux从入门到高级,linux,¥5000 web自动化测试进阶,python,¥3000 app自动化测试进阶,python,¥6000 Docker容器化技术,linux,¥5000 测试平台开发与实战,python,¥8000csv 文件使用 读取数据 内置函数open()内置模块csv 方法csv.reader(iterable) 参数iterable ,文件或列表对象返回迭代器每次迭代会返回一行数据。 # 读取csv文件内容def get_csv():with open(demo.csv, r) as file:raw csv.reader(file)for line in raw:print(line)工程目录结构 data 目录存放 csv 数据文件func 目录存放被测函数文件testcase 目录存放测试用例文件 # 工程目录结构 . ├── data │ └── params.csv ├── func │ ├── __init__.py │ └── operation.py └── testcase├── __init__.py└── test_add.py测试准备 被测对象operation.py测试用例test_add.py测试数据params.csv # operation.py 文件内容 def my_add(x, y):result x yreturn result# test_add.py 文件内容 class TestWithCSV:pytest.mark.parametrize(x,y,expected, [[1, 1, 2]])def test_add(self, x, y, expected):assert my_add(int(x), int(y)) int(expected)# params.csv 文件内容 1,1,2 3,6,9 100,200,300Pytest 数据驱动结合 csv 文件 # 读取 data目录下的 params.csv 文件 import csvdef get_csv():获取csv数据:return: 返回数据的结构[[1, 1, 2], [3, 6, 9], [100, 200, 300]]with open(../data/params.csv, r) as file:raw csv.reader(file)data []for line in raw:data.append(line)return dataPytest 结合数据驱动 json json 文件介绍 json 是 JS 对象 全称是 JavaScript Object Notation 是一种轻量级的数据交换格式 json 结构 对象 {key: value}数组 [value1, value2 ...] {name:: hogwarts ,detail: {course: python,city: 北京},remark: [1000, 666, 888] }json 文件使用 查看 json 文件 pycharmtxt 记事本 读取 json 文件 内置函数 open()内置库 json方法json.loads()方法json.dumps() # 读取json文件内容 def get_json():with open(demo.json, r) as f:data json.loads(f.read())print(data)测试准备 被测对象operation.py测试用例test_add.py测试数据params.json # operation.py 文件内容 def my_add(x, y):result x yreturn result# test_add.py 文件内容 class TestWithJSON:pytest.mark.parametrize(x,y,expected, [[1, 1, 2]])def test_add(self, x, y, expected):assert my_add(int(x), int(y)) int(expected)# params.json 文件内容 {case1: [1, 1, 2],case2: [3, 6, 9],case3: [100, 200, 300] }Pytest 数据驱动结合 json 文件 # 读取json文件 def get_json():获取json数据:return: 返回数据的结构[[1, 1, 2], [3, 6, 9], [100, 200, 300]]with open(../data/params.json, r) as f:data json.loads(f.read())return list(data.values())pytest测试用例生命周期管理 Fixture 用法 Fixture 特点及优势 1命令灵活对于 setup,teardown,可以不起这两个名字2数据共享在 conftest.py 配置⾥写⽅法可以实现数据共享不需要 import 导⼊。可以跨⽂件共享3scope 的层次及神奇的 yield 组合相当于各种 setup 和 teardown4、实现参数化 Fixture 在自动化中的应用- 基本用法 场景 测试⽤例执⾏时有的⽤例需要登陆才能执⾏有些⽤例不需要登陆。 setup 和 teardown ⽆法满⾜。fixture 可以。默认 scope范围function 步骤 1.导⼊ pytest2.在登陆的函数上⾯加pytest.fixture()3.在要使⽤的测试⽅法中传⼊登陆函数名称就先登陆4.不传⼊的就不登陆直接执⾏测试⽅法。 # test_fixture.pyimport pytest# 定义登录的fixture pytest.fixture() def login():print(完成登录操作)def test_search():print(搜索)def test_cart(login): #不需要把login放在函数里面只要传参就可以print(购物车)def test_order(login):print(下单)Fixture 在自动化中的应用 - 作用域 取值范围说明function函数级每一个函数或方法都会调用class类级别每个测试类只运行一次module模块级每一个.py 文件调用一次package包级每一个 python 包只调用一次(暂不支持)session会话级每次会话只需要运行一次会话内所有方法及类模块都共享这个方法 注整个项目就是一个会话 import pytest# 定义登录的fixture pytest.fixture(scopeclass) def login():print(完成登录操作)def test_search(login):print(搜索)def test_cart(login):print(购物车)def test_order(login):print(下单)class TestDemo:def test_case1(self,login):print(case1)def test_case2(self,login):print(case2)Fixture 在自动化中的应用 - yield 关键字 场景 你已经可以将测试⽅法【前要执⾏的或依赖的】解决了 测试⽅法后销毁清除数据的要如何进⾏呢 解决 通过在 fixture 函数中加⼊ yield 关键字yield 是调⽤第⼀次返回结果 第⼆次执⾏它下⾯的语句返回。 步骤 在pytest.fixture(scopemodule)。 在登陆的⽅法中加 yield之后加销毁清除的步骤 import pytest# 定义登录的fixture pytest.fixture(scopeclass) def login():# setup 操作print(完成登录操作)token abcdusername hogwartsyield token, username # 相当于return# teardown 操作print(完成登出操作)def test_search(login):token, username loginprint(ftoken:{token},name:{username})print(搜索)def test_cart(login):print(购物车)def test_order(login):print(下单)class TestDemo:def test_case1(self,login):print(case1)def test_case2(self,login):print(case2)Fixture 在自动化中的应用 - 数据共享 场景 你与其他测试⼯程师合作⼀起开发时公共的模块要在不同⽂件中要在⼤家都访问到的地⽅。 解决 使⽤ conftest.py 这个⽂件进⾏数据共享并且他可以放在不同位置起着不同的范围共享作⽤。 前提 conftest ⽂件名是不能换的放在项⽬下是全局的数据共享的地⽅ 执⾏ 系统执⾏到参数 login 时先从本模块中查找是否有这个名字的变量什么的之后在 conftest.py 中找是否有。 步骤 将登陆模块带pytest.fixture 写在 conftest.py Fixture 在自动化中的应用 - 自动应用 场景 不想原测试⽅法有任何改动或全部都⾃动实现⾃动应⽤ 没特例也都不需要返回值时可以选择⾃动应⽤ 解决 使⽤ fixture 中参数 autouseTrue 实现 步骤 在⽅法上⾯加 pytest.fixture(autouseTrue) 比如要实现fixture时session级别的就要每个用例都添加fixture方法。可以通过自动应用来避免。 问题那yield返回参数的怎么办 Fixture 在自动化中的应用 -参数化 场景 测试离不开数据为了数据灵活⼀般数据都是通过参数传的 解决 fixture 通过固定参数 request 传递 步骤 在 fixture 中增加pytest.fixture(params[1, 2, 3, ‘linda’]) 在⽅法参数写 request方法体里面使用 request.param 接收参数 Fixture 的用法总结 模拟 setupteardown一个用例可以引用多个 fixtureyield 的用法作用域 sessionmodule, 类级别方法级别 自动执行 autouse 参数conftest.py 用法一般会把 fixture 写在 conftest.py 文件中这个文件名字是固定的不能改实现参数化 # test_fixture_param.py import pytestpytest.fixture(params[[selenium,123], [appium,123]]) def login(request):print(f用户名{request.param})return request.paramdef test_demo1(login):print(fdemo1 case:数据为{login})
http://www.yutouwan.com/news/94749/

相关文章:

  • 网站的原型怎么做网页友情链接
  • 内蒙古建设住房与城乡厅官方网站网站服务器免费吗
  • 明光网站建设用phpcms v9搭建手机网站后您没有访问该信息的权限!
  • 做外汇需要了解的网站部门规划书 网站建设
  • 网站优化培训中心旺道seo软件技术
  • 哪里做网站比较稳定交易 网站备案
  • 福州品牌网站建设公司企业vis是指什么
  • 网站过期会怎样解决wordpress 外观 自定义
  • 滁州医院网站建设费用港口建设网站
  • 做金融看哪些网站有哪些兼职网站编辑
  • jsp网站开发答辩分类wordpress
  • 在哪找人做网站ui设计培训收费标准
  • 正版视频素材网站群辉怎么进入wordpress后台
  • 宝安做网站信科做网站和网页有区别吗
  • 英文网站用什么字体好一键生成装修效果图app
  • 手机网站字体大小自适应dede大气黑色网站源码
  • 没人做网站了吗免费推广平台排行榜
  • 营销型网站建设软件做外贸用什么社交网站
  • 女人和男人做爰网站网站建设程序的步骤过程
  • 南阳网站建设xihewh做服装招聘的网站有哪些内容
  • 南京建站平台网上建立网站
  • 如何做网站数据库重庆定制网站建设
  • 摄影网站建设需求分析装修免费出效果图
  • html5风格网站特色滨州做网站的
  • 高端网站建设 aspx廊坊做网站企业教程
  • 唐山网站建设备案的网站建设书是什么意思
  • 网站网格布局内容营销的经典案例
  • 下载吧网站整站源码网页制作简易代码
  • 兰州网站建设索q479185700青岛网站推广服务
  • 站长工具百度百科淮安房产网