上海-悠悠
上海-悠悠 专注python自动化测试
展开
-
pytest运行警告问题解决:DeprecationWarning: pkg_resources is deprecated as an API
前言最近在运行pytest的时候,经常出现这个警告DeprecationWarning: pkg_resources is deprecated as an APISee https://setuptools.pypa.io/en/latest/pkg_resources.html from pkg_resources import iter_entry_points从警告上看是方法被弃用...原创 2023-09-09 09:05:00 · 9019 阅读 · 0 评论 -
pytest文档 88- pytest-runtime-yoyo 对用例运行时长断言
说明pytest 执行用例的时候,我们希望对用例的运行时间断言,当用例执行时长大于预期标记此用例失败。@pytest.mark.runtime(1) 运行时长单位是秒此插件已打包上传到pypi https://pypi.org/project/pytest-runtime-yoyo/基本示例 test_demo.pyimport pytestimport timedef test...原创 2023-06-12 11:44:00 · 93 阅读 · 0 评论 -
pytest文档 87 - 如何禁用插件
前言在运行用例的时候,我们可能出于某种需求,不想加载某个插件,比如我通过pip安装了一个pytest的插件。后续我想修改插件的一些代码,于是放到项目本地,自己去注册本地插件了。这样就需要禁用 pip 安装的那个插件。查看激活的插件我们可以通过 --trace-config 命令插件当前运行环境中的相关插件与已激活的插件pytest --trace-config将获得一个扩展的测试头,...原创 2023-06-06 22:17:00 · 102 阅读 · 0 评论 -
pytest文档 86 - 如何在用例运行后判断测试结果(exitstatus)是通过还是失败?
前言当用例之前完成后,如何判断pytest执行用例的情况是成功还是失败呢?pytest 提供了一个 exitstatus 退出状态标记用例执行情况,可以在 pytest_terminal_summary 中 捕获pytest执行状态pytest.main() 执行结果pytest 从 5.x 版本后,执行 pytest.main() 可以获取到运行退出状态运行退出状态,就是控制台上打印...原创 2023-05-12 14:20:00 · 559 阅读 · 0 评论 -
pytest文档85 - logging 日志的使用
前言pytest 框架有日志管理开关,不需要再添加额外的配置logging的使用在用例中添加logging的日志内容import pytestimport logginglog = logging.getLogger(__name__)@pytest.fixturedef first(): log.debug('debug message: first to do...原创 2022-12-07 14:38:00 · 120 阅读 · 0 评论 -
pytest文档84 - 把收集的 yaml 文件转成pytest 模块和用例
前面实现了一个基础的读取yaml文件内容,当成用例去执行。虽然入门简单,但需要扩展功能,比如在 yaml 用例实现参数化,就不好扩展了。因为它并不是一个真正的pytest的模块和用例,无法被钩子函数探测到。所以这篇会把yaml文件动态生成一个py模块,把yaml文件的数据,动态生成一个函数。原创 2022-11-30 17:21:13 · 982 阅读 · 0 评论 -
pytest文档83 - 把收集的 yaml 文件转 Item 用例并运行
上一篇通过用例收集钩子 pytest_collect_file 把 yaml 文件收集起来的,仅仅只是收集到用例,还不能执行。接下来详细讲解,如何把yaml 文件的内容,转成Item 用例去执行。原创 2022-11-30 17:20:35 · 864 阅读 · 0 评论 -
pytest文档82 - 用例收集钩子 pytest_collect_file 的使用
前言pytest 提供了一个收集用例的钩子,在用例收集阶段,默认会查找test_*.py 文件或者 *_test.py文件。如果我们想运行一个非python的文件,比如用yaml 文件写用例,那么就需要改变用例的收集规则。以最新版pytest 7.2.0版本为例YAML 测试示例在 Yaml 文件中指定测试的基本示例, 以下是官方文档上给的一个执行yaml格式的内容作为自定义测试的例子...原创 2022-11-16 23:13:00 · 88 阅读 · 0 评论 -
pytest文档81 - 如何管理Captured logging日志
pytest 自动捕获级别为 WARNING 或以上的日志消息,并以与捕获的 stdout 和 stderr 相同的方式在每个失败测试的各自部分中显示它们。原创 2022-11-30 17:19:19 · 1032 阅读 · 0 评论 -
pytest文档80 - 内置 fixtures 之 cache 写入中文显示\u4e2d\u6587问题(用打补丁方式解决)
前言pytest 内置 fixtures 之 cache 写入中文的时候会在文件中写入\u4e2d\u6587 这种unicode编码格式。如果想在文件中显示正常的中文,需重新Cache类的set方法来解决问题描述pytest 用例 cache 的使用参考前面这篇https://www.cnblogs.com/yoyoketang/p/15747082.html当cache设置中文的时候,写入cache文件中文显示问题原因出现这个问题的根本原因是python3 的json库留下来的一个坑,先原创 2022-02-25 08:40:39 · 1526 阅读 · 3 评论 -
pytest文档79 - 内置 fixtures 之 cache 写入和读取缓存数据
前言pytest测试用例之间的参数如何传递?如在前置操作中生成了一个数据id,在测试用例需要引用,或者用例执行完成后需要在后置操作中删除。还有很多同学经常问到的case1 生成了数据a,在case2中引用这个值。这些在用例执行过程中生成的数据可以用cache缓存来解决。内置cache fixturecache 是一个可以在测试会话之间保持状态的缓存对象。@pytest.fixturedef cache(request): """ Return a cache object tha原创 2022-01-01 08:37:42 · 641 阅读 · 2 评论 -
pytest文档78 - 钩子函数pytest_runtest_makereport获取用例执行报错内容和print内容
前言pytest在执行用例的时候,当用例报错的时候,如何获取到报错的完整内容呢?当用例有print()打印的时候,如何获取到打印的内容?钩子函数pytest_runtest_makereport测试用例如下,参数化第一个用例成功,第二个失败import pytestimport time@pytest.fixture()def login(): print("login first----------")@pytest.mark.parametrize( "user,原创 2021-11-28 08:43:53 · 1738 阅读 · 0 评论 -
pytest文档77 - parametrize 参数化跳过部分用例(pytest.param)
前言pytest 参数化的时候,希望能跳过部分测试用例,可以用 pytest.param 来实现。parametrize 参数化示例parametrize 参数化import pytest@pytest.mark.parametrize('input1, input2, expected', [ ["a", "b", "ab"], ["1", "2", "12"], [2, 3, 5], [1, 3, 4], ])def test_foo(input原创 2021-10-23 12:58:01 · 905 阅读 · 0 评论 -
pytest文档76 - 命令行中神奇的-o参数使用
前言pytest 命令行中 -o 参数的作用是覆盖pytest.ini配置文件中的参数,那就意味着在ini中的参数,也可以在命令行中使用了。-o 参数pytest -h 可以查看到-o参数的使用-o OVERRIDE_INI, --override-ini=OVERRIDE_INI override ini option with "option=value" style, e.g. `-o xfail_strict=True -o cache_dir=cache`.其作用是覆盖ini配置原创 2021-08-13 10:14:08 · 425 阅读 · 0 评论 -
pytest文档75 - 生成 junit-xml 测试报告
前言pytest 生成junit-xml 测试报告,那么生成的xml报告有什么用呢?可以集合一些持续集成工具(如jenkins…等)方便查看报告。junit-xml 测试报告命令行参数有2个跟 junit-xml 报告相关的参数 --junit-xml=path create junit-xml style report file at given path. --junit-prefix=str prepend prefix to classnames in junit-xm原创 2021-08-13 10:13:36 · 2068 阅读 · 0 评论 -
pytest文档74-参数化parametrize加marks标记(pytest.param)
前言pytest 使用 parametrize 参数化的时候,有多组测试数据,需要对其中的一些测试数据加标记跳过,可以用pytest.param实现。pytest.param先看下 pytest.param 源码,可以传三个参数param values :按顺序传参数集值的变量argskeyword marks : marks关键字参数,要应用于此参数集的单个标记或标记列表。keyword str id: id字符串关键字参数,测试用例的id属性def param(*values, **k原创 2021-07-04 08:07:35 · 681 阅读 · 0 评论 -
pytest文档73-pytest+yaml实现接口自动化框架之用例参数关联
前言使用 yaml 文件写测试用例的时候,如何在 yaml 文件的测试用例里面实现参数关联? 这是很多做自动化测试的小伙伴经常思考的一个问题。接着前面的pytest+yaml 文件实现接口自动化框架,本篇使用环境变量的方式,让测试用例参数关联。实现场景:上个接口返回的接口提取变量,在写个接口中引用变量场景案例我现在有一个登陆接口A,登陆成功后返回一个token值。有一个获取用户信息的接口B,但是接口B必须要先登录后传登录的token才能访问A接口登录接口文档基本信息访问地址:http://1原创 2021-07-03 09:30:49 · 4112 阅读 · 1 评论 -
pytest文档72- 使用 template 替换 yaml 文件的变量
前言在接口自动化测试的时候,yaml 文件一般放测试的数据或当配置文件使用,yaml 文件存放静态的数据是没问题的,python的数据类型基本上都是支持的。有时候我们想在 yaml 文件中引用变量来读取 python 代码的设置值。template 使用template 是字符串模板,用于替换字符串中的变量,是 string 的一个类引用变量有 2 种格式$variable 使用 $变量名 引用变量${variable} 使用 ${变量名} 大括号包起来第一种 $variablef原创 2021-07-03 09:30:18 · 1472 阅读 · 1 评论 -
pytest文档71-pytest+yaml实现接口自动化框架
前言httprunner 用 yaml 文件实现接口自动化框架很好用,最近在看 pytest 框架,于是参考 httprunner的用例格式,写了一个差不多的 pytest 版的简易框架项目结构设计项目结构完全符合 pytest 的项目结构,pytest 是查找 test_.py 文件,我这里是查找 test_.yml 文件,唯一不同的就是这个地方以前写test_*.py 的测试用例,现在完全不用写了,全部写yaml 文件就行,项目结构参考只需在 conftest.py 即可实现,代码量超级少原创 2021-07-03 09:29:45 · 1046 阅读 · 5 评论 -
pytest文档70-Hook钩子函数完整API总结
前言pytest 的钩子函数有很多,通过钩子函数的学习可以了解到pytest在执行用例的每个阶段做什么事情,也方便后续对pytest二次开发学习。详细文档可以查看pytest官方文档https://docs.pytest.org/en/latest/reference.html#hooks钩子函数总结第一部分:setuptools引导挂钩要求足够早注册的插件(内部和setuptools插件),可以使用的钩子pytest_load_initial_conftests(early_config,p原创 2021-07-03 09:29:14 · 1060 阅读 · 0 评论 -
pytest文档69-Hook函数之参数化生成测试用例pytest_generate_tests
前言pytest 实现参数化有三种方式pytest.fixture() 使用 fixture 传 params 参数实现参数化@ pytest.mark.parametrize 允许在测试函数或类中定义多组参数,在用例中实现参数化pytest_generate_tests 允许定义自定义参数化方案或扩展。pytest_generate_testspytest_generate_tests 在测试用例参数化收集前调用此钩子函数,根据测试配置或定义测试函数的类或模块中指定的参数值生成测试用例,原创 2021-07-03 09:28:44 · 2012 阅读 · 1 评论 -
pytest文档68-pytest-lazy-fixture 插件解决 pytest.mark.parametrize 中使用 fixture 问题
前言测试用例参数化的时候,使用 pytest.mark.parametrize 参数化传测试数据,如果我们想引用前面 不同fixture 返回的数据当测试用例的入参,前面一篇用fixture 参数化 prams 来间接解决这个问题。接下来用 pytest-lazy-fixture 插件可以直接在测试用例中参数化时 pytest.mark.parametrize 中使用 fixturepytest-lazy-fixture 插件pytest-lazy-fixture 插件是为了解决测试用例中用 @py原创 2021-07-03 09:28:14 · 862 阅读 · 1 评论 -
pytest文档67-pytest.mark.parametrize 中使用 fixture
前言测试用例参数化的时候,使用 pytest.mark.parametrize 参数化传测试数据,如果我们想引用前面不同fixture返回的数据当测试用例的入参。可以用fixture 参数化 prams 来间接解决这个问题使用案例我们需要在测试用例里面参数化,参数化的数据来源于前面不同fixture的返回值,示例import pytest@pytest.fixturedef a(): return 'a'@pytest.fixturedef b(): return原创 2021-07-03 09:27:43 · 804 阅读 · 0 评论 -
pytest文档66-工厂化的 fixtures
前言在一个测试用例中需要多次调用同一个fixture的时候,工厂化的 fixture 的模式对于一个 fixture 在单一的测试中需要被多次调用非常有用。之前写fixture是直接return一个数据,在测试用例中可以直接使用,现在我们需要返回一个生成数据的函数,这样就能在用例中多次调用了。Factories as fixtures“Factories as fixtures”模式可以帮助在一次测试中多次需要一个fixture的结果的情况下。fixture不是直接返回数据,而是返回一个生成数据的函数原创 2021-07-03 09:27:12 · 307 阅读 · 2 评论 -
pytest文档65-内置 request 读取项目的根目录 rootdir
前言写自动化测试项目的时候,经常要用到配置文件,比如读取数据库相关的配置,希望单独放到 config 配置文件,方便维护。pytest 的内置 fixture 可以获取到配置相关的信息,request.config.rootdir 用于获取项目的跟目录。config 配置文件再项目下新建一个 config 文件,相关配置信息用 yaml 文件维护数据在conftest.py 下写读取配置文件的 fixture, 这里我设置为 autouse=True 主要是为了查看打印读取到的目录import原创 2021-07-03 09:26:42 · 959 阅读 · 0 评论 -
pytest文档64-内置 pytestconfig 动态添加和获取 pytest.ini 配置参数
前言前面讲 pytestconfig 的时候,可以获取到 pytest.ini 里面的配置参数。我们在写项目自动化用例的时候,有一些配置参数希望能加到配置里面,如configid, productid,以及测试环境的base_url地址,和账号相关信息。addini的源码阅读addini有四个参数:name, help, type=None, default=None def addini(self, name, help, type=None, default=None):原创 2021-07-03 09:26:11 · 1181 阅读 · 6 评论 -
pytest文档63-内置fixture之pytestconfig
前言前面讲 request 是pytest的一个内置 fixture ,作用是获取测试的上下文,可以通过request.config 获取配置对象。pytestconfig 的作用跟 request.config 是一样的,都是获取配置对象pytestconfig 源码分析pytestconfig 是一个内置fixture,用于获取配置对象 pytestconfig 源码pytestconfig 有2个常用的方法.getoption() 获取命令行参数.getini() 获取ini配置原创 2021-07-02 08:23:17 · 448 阅读 · 1 评论 -
pytest文档62-内置fixture之request
前言request 是 pytest 的内置 fixture , “为请求对象提供对请求测试上下文的访问权,并且在fixture被间接参数化的情况下具有可选的“param”属性。”这是官方文档对request的描述,可参考的文档不多。FixtureRequestFixtureRequest 是来自 fixture 或者 测试用例的请求,它有访问测试上下文的权限, FixtureRequest源代码。class FixtureRequest[源代码](https://docs.pytest.org/原创 2021-07-02 08:22:46 · 453 阅读 · 2 评论 -
pytest文档61-fixture之name参数使用别名
前言本篇讲 fixture 里面的 name 参数如何使用,使用别名后代码更容易理解。fixture使用案例定义一个fixture打开浏览器,测试用例需用到这个fixture的前置操作from selenium import webdriverimport pytestimport time# 作者-上海悠悠 QQ交流群:717225969# blog地址 https://www.cnblogs.com/yoyoketang/@pytest.fixture(scope="module"原创 2021-07-02 07:40:50 · 345 阅读 · 0 评论 -
pytest文档60-pytest.main()的使用
前言pytest 运行用例的时候,一般用命令行去执行,有些小伙伴不太习惯命令行运行用例,可能是之前深受 unittest 框架的影响,习惯在项目的根目录下写一个 run_all.py 的文件。运行的时候,使用 python 运行 run_all.py 来执行测试用例。pytest.main()先看看 pytest.main() 的源码, main 函数的内容args 传一个list对象,list 里面是多个命令行的参数plugins 传一个list对象,list 里面是初原创 2021-07-02 07:40:20 · 703 阅读 · 2 评论 -
pytest文档59-运行未提交git的用例(pytest-picked)
前言我们每天写完自动化用例后都会提交到 git 仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交 git 仓库的用例。pytest-picked 插件可以实现只运行未提交到git仓库的代码。pytest-picked使用命令行安装pip install pytest-picked可使用参数picked: --picked=[{only,first}] Run the tests related原创 2021-07-02 07:39:08 · 174 阅读 · 1 评论 -
pytest文档58-随机执行测试用例(pytest-random-order)
前言通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果。pytest默认运行用例的顺序是按模块和用例命名的 ASCII 编码顺序执行的,这就意味着每次运行用例的顺序都是一样的。app 测试里面有个 monkey 测试,随机在页面点点点,不按常理的点点点能找到更多的不稳定性 bug。那么我们在写pytest用例的时候,既然每个用例都是相互独立的,那就可以打乱用例的顺序随机执行,用到 pytest 的插件 pytest-random原创 2021-07-02 07:38:13 · 490 阅读 · 1 评论 -
pytest文档57-计算单元测试代码覆盖率(pytest-cov)
前言我们在做测试的时候,经常遇到领导的灵魂拷问:你的测试用例覆盖率是多少,达到100%了么?你如何保证你的测试质量?测试用例的覆盖率如何统计呢,如何知道开发的代码,我们都测到了,不会存在漏测的情况。pytest-cov先命令行安装 pytest-cov 2.10.1版本pip install pytest-cov==2.10.1环境要求:1.python3.6.6 版本备注:其它版本没试过python3.6.0会遇到以下问题INTERNALERROR>raise Coverag原创 2021-07-02 07:37:42 · 1529 阅读 · 1 评论 -
pytest文档56-插件打包上传到 pypi 库
前言pytest 的插件完成之后,可以上传到 github,方便其他小伙伴通过 pip 源码安装。如果我们想通过 pip install packages 这种方式安装的话,需上传到 pypi 仓库pypi仓库pip,全称是:python install packages,它是一个通用的 Python 包管理工具,是easy_install的替代品, 主要是用于安装 PyPI 上的软件包。PyPI,全称是:Python Package Index,它是Python官方的第三方库的仓库,所有人都可以下原创 2021-07-02 07:37:12 · 318 阅读 · 1 评论 -
pytest文档55-plugins插件开发
前言前面一篇已经学会了使用hook函数改变pytest运行的结果,代码写在conftest.py文件,实际上就是本地的插件了。当有一天你公司的小伙伴觉得你写的还不错,或者更多的小伙伴想要你这个功能,于是你就想着放到github上,写成一个插件,方便小伙伴使用pip去安装。插件开发先新建一个工程,工程名称就是插件名称,一般以pytest-开头命名,目录结构如下setup.py 在安装python的相关模块和库时,我们一般使用pip install 模块名或者python setup.py in原创 2021-07-02 07:36:41 · 468 阅读 · 1 评论 -
pytest文档54-Hooks函数terminal打印测试结果(pytest_report_teststatus)
前言使用命令行执行pytest用例的时候,会在 terminal 终端打印整个用例的测试结果:.代表通过的用例F代表失败的用例E代表异常的用例如果我们不喜欢这种报告结果,可以通过 pytest_report_teststatus 钩子函数改变测试报告的内容,接下来试试吧.改成√,把F改成x,这样更直观。pytest_report_teststatuspytest_report_teststatus(report, config): 返回各个测试阶段的result, 可以用when属性来区分原创 2021-07-02 07:36:11 · 717 阅读 · 0 评论 -
pytest文档53-命令行实时输出错误信息(pytest-instafail)
前言pytest 运行全部用例的时候,在控制台会先显示用例的运行结果(.或F), 用例全部运行完成后最后把报错信息全部一起抛出到控制台。这样我们每次都需要等用例运行结束,才知道为什么报错,不方便实时查看报错信息。pytest-instafail 插件可以在运行用例的时候,需实时查看用例报错内容,这样方便跟踪问题。–instafail执行全部用例,报错内容等用例运行完成才显示出来>pytest============================= test session starts原创 2021-07-01 12:41:36 · 506 阅读 · 1 评论 -
pytest文档52-命令行参数--setup-show查看fixture的执行过程
前言使用命令行运行 pytest 用例的时候,看不到 fixture 的执行过程.如果我们想知道fixture的执行过程和先后顺序,可以加上 --setup-show 命令行参数,帮助查看 fixture 的执行过程.–setup-show案例参考test_s.py# test_s.pyimport pytest# 作者-上海悠悠 QQ交流群:717225969# blog地址 https://www.cnblogs.com/yoyoketang/@pytest.fixture()d原创 2021-07-01 12:41:04 · 319 阅读 · 0 评论 -
pytest文档51-内置fixture之cache使用
前言pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例。方便我们在运行用例的时候加上–lf 和 --ff 参数,快速运行上一次失败的用例。–lf, --last-failed 只重新运行上次运行失败的用例(或如果没有失败的话会全部跑)–ff, --failed-first 运行所有测试,但首先运行上次运行失败的测试(这可能会重新测试,从而导致重复的fixture setup/teardown)–lf 和 --ff 相关介绍查看之原创 2021-07-01 12:40:34 · 244 阅读 · 0 评论 -
pytest文档50-命令行参数--durations统计用例运行时间
前言写完一个项目的自动化用例之后,发现有些用例运行较慢,影响整体的用例运行速度,于是领导说找出运行慢的那几个用例优化下。--durations 参数可以统计出每个用例运行的时间,对用例的时间做个排序。–durations=Npytest -h 查看命令行参数,关于 --durations=N 参数的使用方式>pytest -hreporting: --durations=N show N slowest setup/test durations (N=0 for al原创 2021-07-01 12:38:55 · 813 阅读 · 0 评论