天道酬勤,学无止境

Replacement for test case inheritance in pytest?

Background

In Python's unittest framework, it is a fairly common idiom to use inheritance on a base set of tests to apply an entire set of tests to a new problem, and occasionally to add additional tests. A trivial example would be:

from unittest import TestCase

class BaseTestCase(TestCase):
    VAR = 3

    def test_var_positive(self):
        self.assertGreaterEqual(self.VAR, 0)

class SubTestCase(BaseTestCase):
    VAR = 8

    def test_var_even(self):
        self.assertTrue(self.VAR % 2 == 0)

Which, when run, runs 3 tests:

$ python -m unittest -v
test_var_positive (test_unittest.BaseTestCase) ... ok
test_var_even (test_unittest.SubTestCase) ... ok
test_var_positive (test_unittest.SubTestCase) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.000s

This is particularly useful if you are testing a class hierarchy, where each subclass is a subtype of the parent classes, and should thus be able to pass the parent class's test suite in addition to its own.

Problem

I would like to switch over to using pytest, but I have a lot of tests that are structured this way. From what I can tell, pytest intends to replace most of the functionality of TestCase classes with fixtures, but is there a pytest idiom that allows test inheritance, and if so what is it?

I am aware that pytest can be used to run unittest-style tests, but the support is limited, and I would like to use some of the "will never be supported" features of pytest in my tests.

评论

Pytest allows you to group test cases in classes, so it naturally has support for test case inheritance.

When rewriting your unittest tests to pytest tests, remember to follow pytest's naming guidelines:

  • class names must begin with Test
  • function/method names must begin with test_

Failing to comply with this naming scheme will prevent your tests from being collected and executed.


Your tests rewritten for pytest would look like this:

class TestBase:
    VAR = 3

    def test_var_positive(self):
        assert self.VAR >= 0

class TestSub(TestBase):
    VAR = 8

    def test_var_even(self):
        assert self.VAR % 2 == 0

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在pytest中测试类的继承方法(How to test a class' inherited methods in pytest)
    问题 house.py : class House: def is_habitable(self): return True def is_on_the_ground(self): return True conftest.py : import pytest from house import House @pytest.fixture(scope='class') def house(): return House() test_house.py : class TestHouse: def test_habitability(self, house): assert house.is_habitable() def test_groundedness(self, house): assert house.is_on_the_ground() 到那时为止,一切都在测试中。 现在我添加一个子类并覆盖house.py一个方法: class House: def is_habitable(self): return True def is_on_the_ground(self): return True class TreeHouse(House): def is_on_the_ground(self): return False 我还在conftest.py为该类添加了一个新装置:
  • How to test a class' inherited methods in pytest
    house.py: class House: def is_habitable(self): return True def is_on_the_ground(self): return True conftest.py: import pytest from house import House @pytest.fixture(scope='class') def house(): return House() test_house.py: class TestHouse: def test_habitability(self, house): assert house.is_habitable() def test_groundedness(self, house): assert house.is_on_the_ground() Up to that point, everything is being tested. Now I add a subclass and override a method in house.py: class House: def is_habitable(self): return True def is_on_the_ground(self): return True class TreeHouse(House): def is_on
  • pytest:同一接口不同实现的可重用测试(pytest: Reusable tests for different implementations of the same interface)
    问题 想象一下,我在模块foo实现了一个名为Bar的实用程序(可能是一个类),并为它编写了以下测试。 test_foo.py: from foo import Bar as Implementation from pytest import mark @mark.parametrize(<args>, <test data set 1>) def test_one(<args>): <do something with Implementation and args> @mark.parametrize(<args>, <test data set 2>) def test_two(<args>): <do something else with Implementation and args> <more such tests> 现在想象一下,将来我希望编写相同接口的不同实现。 我希望这些实现能够重用为上述测试套件编写的测试:唯一需要更改的是 Implementation的导入 <test data set 1> 、 <test data set 2>等。 所以我正在寻找一种以可重用的方式编写上述测试的方法,这将允许接口的新实现的作者能够通过将实现和测试数据注入其中来使用测试,而无需修改包含测试原始规范的文件。 在 pytest 中这样做的好方法是什么? ============
  • 继承属性 getter 文档(Inherit property getter documentation)
    问题 这里提出的装饰器能够继承方法的文档字符串,但不能继承属性和获取器的文档字符串。 我试图天真地扩展它,但似乎属性的文档字符串是只读的。 有没有办法继承这些? import types def fix_docs(cls): for name, func in vars(cls).items(): if isinstance(func, (types.FunctionType, property)) and not func.__doc__: print func, 'needs doc' for parent in cls.__bases__: parfunc = getattr(parent, name, None) if parfunc and getattr(parfunc, '__doc__', None): func.__doc__ = parfunc.__doc__ break return cls class X(object): """ some doc """ angle = 10 """Not too steep.""" def please_implement(self): """ I have a very thorough documentation :return: """ raise NotImplementedError @property def
  • pytest常用功能学习笔记
    一、测试框架分类 1.unittest 做什么测试都可以,不局限于单元测试 写用例 TestCase收集用例 TestLoader.discover()生成报告 HtmlTestRunner模板 2.pytest 做什么测试都可以,不局限于单元测试 能够运行unittest用例灵活 3.其他 nosebehave --行为驱动框架 二、pytest和unittest的共同点 都是测试框架且都是通过python代码来写测试用例、收集用例、运行用例、生成报告 pytest安装:pip install pytest 三、 pytest和unittest的不同点 1.编写用例上 unittest 继承TestCase ;pytest 没有固定的模板,要么以函数形式,要么以类里方法的形式;特殊的,用例名称必须以test_开头 且如果用例在类中,类名必须以Test开头; 2.前置后置 unittest: setup/teardown setup中的变量怎么传递给测试用例:self.***=valuesetupClass/teardownClass setupClass当中得到的变量,传递给测试用例的方式:cls.×××=value pytest: 方案一:沿用unittest的风格 (不推荐在pytest中使用该模式) 用例级别:setup、teardown 类和类外的用例都可以使用
  • pytest、allure--python
    python 自动化测试框架unittest与pytest的区别: 关于python的测试框架,目前比较流行的有unittest、pytest、nosetest。今天要讲的是pytest与unittest之间的比较。 unittest是python内嵌的测试框架,原名为PyUnit。unittest提供了test cases、test suites、test fixtures、test runner相关的类,让测试更加明确、方便、可控。使用unittest编写用例,必须遵守以下规则: 1.测试文件必须先import unittest2.测试类必须继承unittest.TestCase3.测试方法必须以“test_”开头4.测试类必须要有unittest.main()方法 pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效。使用pytest编写用例,必须遵守以下规则: 1.测试文件名必须以“test_”开头(如:test_ab.py)2.测试方法必须以“test_”开头 这里很明显,编写测试用例的方法pytest就比unittest简单很多。 pytest可以执行unittest风格的测试用例,无须修改unittest用例的任何代码,有较好的兼容性。 pytest插件丰富,比如flask插件,可用于用例出错重跑
  • playwright-python + pytest 模拟登陆后进行测试
    playwright-python + pytest 模拟登陆后进行测试 playwright-python + pytest 模拟登陆后进行测试1. 初始(遇到的问题)2. 问题的解决方法1. 问题一: 模拟登陆后进行测试2. 问题二: 继承的 brower 忽略证书问题 3. 参考文档 playwright-python + pytest 模拟登陆后进行测试 1. 初始(遇到的问题) 发现很多测试用例需要登陆后才能进行操作,但是 page 和 brower 直接继承会存在一些问题,如闪退,如需要重新登陆等。 2. 问题的解决方法 1. 问题一: 模拟登陆后进行测试 先将登陆的状态存储起来。 storage = context.storage_state() os.environ["STORAGE"] = json.dumps(storage) 在去继承这个状态。 storage_state = json.loads(os.environ["STORAGE"]) def test_01_xxxxx(browser: Browser): context = browser.new_context(storage_state=storage_state, ignore_https_errors=True) page = context.new_page() 2. 问题二: 继承的
  • Python测试框架之unittest和pytest 的区别
    一、Unittest Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。 Unittest支持自动化测试,测试用例的初始化、关闭和测试用例的聚合等功能,它有一个很重要的特性:它是通过类(class)的方式,将测试用例组织在一起。 示例: 执行结果: 注:unittest有一个关联模块unittest2,但unittest2仅适用于Python 2.4-2.6。这是由于从Python 2.7开始,unittest增加一些新的特性。为了在老的版本中支持这些特性,所以提供了unittest2这个库。但对于Python 2.7及之后的版本,unittest是唯一的。本次示例中使用的为python2.7。 二、Pytest Pytest是Python的另一个第三方单元测试库。它的目的是让单元测试变得更容易,并且也能扩展到支持应用层面复杂的功能测试。 pytest的特性有: 支持用简单的assert语句实现丰富的断言,无需复杂的self.assert*函数 自动识别测试模块和测试函数 模块化夹具用以管理各类测试资源 对 unittest 完全兼容,对 nose基本兼容 支持Python3和PyPy3 丰富的插件生态
  • python unittest和pytest_Python 测试框架unittest和pytest的优劣
    一、Unittest Unittest是python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。 Unittest支持自动化测试,测试用例的初始化、关闭和测试用例的聚合等功能,它有一个很重要的特性:它是通过类(class)的方式,将测试用例组织在一起。 示例: 运行结果 注:unittest有一个关联模块unittest2,但unittest2仅适用于Python 2.4-2.6。这是由于从Python 2.7开始,unittest增加一些新的特性。为了在老的版本中支持这些特性,所以提供了unittest2这个库。但对于Python 2.7及之后的版本,unittest是唯一的。本次示例中使用的为python2.7。 二、Pytest Pytest是Python的另一个第三方单元测试库。它的目的是让单元测试变得更容易,并且也能扩展到支持应用层面复杂的功能测试。 pytest的特性有: 支持用简单的assert语句实现丰富的断言,无需复杂的self.assert*函数 自动识别测试模块和测试函数 模块化夹具用以管理各类测试资源 对 unittest 完全兼容,对 nose基本兼容 支持Python3和PyPy3 丰富的插件生态
  • python unittest和pytest_使用Python 测试框架unittest和pytest
    使用Python 测试框架unittest和pytest 发布时间:2020-10-31 00:15:19 来源:亿速云 阅读:72 作者:Leah 本篇文章给大家分享的是有关使用Python 测试框架unittest和pytest,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 一、Unittest Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。 Unittest支持自动化测试,测试用例的初始化、关闭和测试用例的聚合等功能,它有一个很重要的特性:它是通过类(class)的方式,将测试用例组织在一起。 示例: 运行结果 注:unittest有一个关联模块unittest2,但unittest2仅适用于Python 2.4-2.6。这是由于从Python 2.7开始,unittest增加一些新的特性。为了在老的版本中支持这些特性,所以提供了unittest2这个库。但对于Python 2.7及之后的版本,unittest是唯一的。本次示例中使用的为python2.7。 二、Pytest Pytest是Python的另一个第三方单元测试库
  • pytest-timeout - 测试失败而不是终止整个测试运行(pytest-timeout - fail test instead killing whole test run)
    问题 我知道在pytest-timeout我可以为每个测试用例指定超时,但是单个失败会终止整个测试运行,而不是让松弛的测试用例失败。 我是否被迫为此制定自己的解决方案,或者是否有现成的工具可以提供该解决方案? 回答1 我很久以前研究过这个问题,也得出结论,自制的解决方案会更好。 我的插件正在杀死整个 pytest 过程,但可以对其进行调整,使其仅在单个(当前)测试中失败。 这是调整后的草案: import pytest import signal class Termination(SystemExit): pass class TimeoutExit(BaseException): pass def _terminate(signum, frame): raise Termination("Runner is terminated from outside.") def _timeout(signum, frame): raise TimeoutExit("Runner timeout is reached, runner is terminating.") @pytest.hookimpl def pytest_addoption(parser): parser.addoption( '--timeout', action='store', dest='timeout'
  • 软件测试总结——常见的面试问题(三)
    自动化测试软件作用(重点): 一:jmeter: 纯java编写负载功能测试和性能测试开源工具, 支持接口自动化测试,录制、抓包、可进行压力测试(增加线程,考验服务器最大支持访问数)、弱网测试、添加请求、添加断言,查看断言、结果树,聚合报告,分析测试报告等 聚合报告参数详解: 1. Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 2. Samples:请求数——表示这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100 3. Average:平均响应时间——默认情况下是单个 Request 的平均响应时间 4. Median:中位数,也就是 50% 用户的响应时间 5. 90% Line:90% 用户的响应时间 6. Min:最小响应时间 7. Max:最大响应时间 8. Error%:错误率——错误请求数/请求总数 9. Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second) 10. KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec 二:ant: 将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,并生成测试报告并发送 三:jenkins:
  • 【pytest】(二) pytest与unittest的比较
    一、 为什么我用了pytest后就会喜欢上它pytest的框架规范更自由在使用unittest编写测试用例的时候,需要遵循先创建testclass,测试类继承unittest.TestCase的固定格式。例如:而pytest不需要,可以直接写def test_XXX()即可,写法是python原生。二、setUp与tearDown(pytest中的fixture)个人觉得fixture更灵活对应unittest下的setUp与tearDown,pytest中的fixture显然更加灵活。可以任意自定义方法函数,只要加上@pytest.fixture()这个装饰器,那么被装饰的方法就可以被使用,如图所示的,为当test_login_success执行结束后,执行退出。fixture的详细使用,会在后面单独拿出来讲。三、pytest的参数化用起来也更方便pytest可以更好的参数化,如图所示测试登录失败的场景,这里即是4条测试用例。四、pytest第三方插件非常丰富pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)等。这里就不细说了,有需要的话下次再单独说,附上地址:https://pypi.org
  • Python测试框架Pytest的常用插件测试报告
    一、pytest-html 生成 html 测试报告 要求:Python 3.6+ 安装:pip install pytest-html 文档:https://github.com/pytest-dev/pytest-html、https://www.cnblogs.com/linuxchao/p/linuxchao-pytest-report.html 使用方法:在命令行或 pytest.ini 配置文件 addopts 中添加选项 --html=测试报告路径 (1)命令行方式:pytest --html report/report.html --self-contained-html (2)pytest.ini文件:addopts = pytest --html report/report.html --self-contained-html 注:默认情况下生成的 html 报告中 css 是分开的,分享报告时将无法正确展示样式,可以使用 --self-contained-html 将 css 合并到 html 中。 二、allure-pytest 生成 Allure 测试报告 Allure 框架是一个灵活的轻量级多语言测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人从日常执行的测试中最大限度的提取有用信息。 从 dev/qa 的角度来看
  • pytest之html报告
    html格式测试报告: 插件安装 pip install pytest-html pytest可以生成多种样式的结果 1.生成junitXML 格式的测试报告:命令:–junitxml=path xml文件作用 – 可以跟外部继承 或者 做二次解析 2.生成result log 格式的测试报告:命令:–resultlog=report\log.txt 3.生成html 格式的测试报告:命令:–html=report\test_one.html(相对路径) 路径:以pytest命令行所在的目录为根目录 - 开始收集测试用例 - 获取路径的 所谓的相对路径 - 就是相对于这个目录 第一种方式: 当前目录运行: 生成html测试报告: 示例 第二种:(常用) pytest.ini文件 [pytest] markers = demo conftest.py文件 – 放前置的地方/放用例当中也可以 import pytest @pytest.fixture() def init(): print("我是函数级别前置") a = 1 # yield a b = 2 yield a, b print("我是函数别后置") @pytest.fixture(scope="class") def init1(): print("我是类级别前置") c = 3 d = 4 yield c,d print
  • 初识pytest框架及其应用原理
    目前市面上流行的测试框架有两种unittest以及pytest,接下来我们来学习下pytest,pytest与unittest的区别有什么呢,首先是pytest框架自带生成测试报告的库,我们不需要使用unittest借助第三方的包来进行生成,其次pytest上手容易,并且自带的插件功能十分强大,这是unittest所不具备的,另外就是unittest的坑其实还是比较多的,所以pytest我个人比较主推! 首先我们要使用pytest我们需要先安装下pytest,打开电脑终端cmd, pip install pytest 接下来我们直接编写代码示例: import pytest def test_b(): print('-------test_b---------') def test_a(): print('--------test_a--------') if __name__ == '__main__': pytest.main() 运行以上代码,我们可以看到结果分别打印了以上内容,并且看到打印的顺序是test_b在先的,并没有根据a-z的执行方式,并且我们并不需要以类的方式才能够继承pytest的框架,这点区别于unittest。 为了项目规范一点 我们还是尽量把方法写到类里面,pytest框架也存在类前置方法与单用例前置! import pytest class
  • Python:出于测试目的而阻止网络连接?(Python: block network connections for testing purposes?)
    问题 我正在尝试测试一个提供一些Web服务接口的程序包。 它具有一个测试套件,可以在不连接互联网的情况下测试大多数功能。 但是,仍有一些挥之不去的测试可能试图连接到互联网/下载数据,而我想阻止它们这样做有两个原因:第一,确保没有网络连接时我的测试套件能够正常工作;第二,确保测试套件能够正常工作。 其次,这样我就不会向Web服务发送过多的查询垃圾邮件。 一个明显的解决方案是拔掉计算机的电源/关闭无线,但是当我在远程计算机上运行测试时,显然不起作用。 所以,我的问题是:我可以为单个python进程阻止网络/端口访问吗? (“沙箱”,但只是阻止网络连接) (确实,pysandbox不会执行此操作) 编辑:我正在使用py.test所以我需要一个可以与py.test一起使用的解决方案,以防影响任何建议的答案。 回答1 猴子跳线socket应该做到这一点: import socket def guard(*args, **kwargs): raise Exception("I told you not to use the Internet!") socket.socket = guard 确保此操作在任何其他导入之前运行。 回答2 更新:现在有一个pytest插件,其功能与此答案相同! 您可以阅读答案,只是为了了解其工作原理,但我强烈建议您使用插件,而不是复制粘贴我的答案:-)参见此处
  • selenium+pytest自动化测试框架FAQ
    欢迎进行接口(httprunner)、UI自动化(pytest)交流,博主微信:jiaotengfei1016 文章目录 通过百度、CSDN都解决不了的问题,怎么办?问题1:pycharm中的venv、external liarbries是干啥的?问题2:时间的库待总结问题3:python执行代码的方式?问题4:列表的内容必须保存在变量中,才能被print问题5:数据类型,字符串、数字、数字类型等是啥关系问题6:Make sure that you use the correct version of 'pip' installed,pip版本不对问题7:发现导入的import是灰色的,问题8:读取excel的时候报错,问题9:库、模块、类、方法、函数之间的关系?问题10:python的命名规范?问题11:发现类竟然提示多余的括号,问题12:try except ,except有下划波浪线?问题13:为什么看源码?因为csdn一个人一个理解,你花了8小时发现你最终理解的是错的,被人误导了!!!问题14:logging模块网上攻略非常多,存在很多误导人的地方,白白浪费了很多时间?问题15:日志模块上周一直没调通,原因是:我添加了移除处理器==self.logger.removeHandler()问题16:“pytest -vs test_2.py -n 2”执行后报错:pytest
  • Playwright + Pytest UI 自动化测试实现
    文章目录 前言项目地址分层其他新功能视频录制报告 已知问题 前言 平时工作一直用的 Cypress,但是 Cypress 真的太慢了,就想看看有什么替代品。Selenium 我一直不太喜欢,正好看到微软出的 Playwright 好像蛮有意思的。虽然 Playwright 的 JS 版本 的 Star 是 Python 版本的十倍之多,不过我个人还是更喜欢 Python 和 Pytest,就还是用 Python 版的 Playwright 搭配 Pytest 来食用了。(其实是 js 不太熟悉 XD) 主流的 UI 自动化 框架对比可以参考这篇文章 [传送门] 本项目风格和我之前写的 api-test比较相似,越小越简单越好。 项目地址 Github:https://github.com/tomoyachen/playwright-test 本项目参考了虫师 & Yusuke Iwaki 的项目 分层 定位符、页面操作、业务逻辑三层:合并成了 page 类 测试用例层:test 类(基于 pytest) 数据层:yaml 文件 (config 数据 与 fixtures 数据) 结果层:HTML 报告(基于 pytest-html,感兴趣可以改成 allure),Log 日志(暂无) * 图来自 陈晓伍 的 《Python Web自动化测试设计与实现》 test 类 page
  • 自动化框架 Httprunner 3.x 入门介绍
    1. 是什么 HttpRunner 是一个简单,优雅但功能强大的 HTTP(S)测试框架。 目前 Httprunner 的最新版本是 3.0,它是使用 Python 开发的,支持 Python3.6+ 和大多数操作系统。作者李隆之前是大疆的测试开发工程师,项目起源于大疆内部的测试需求,之后转为开源项目。 它产生的背景主要是: 1.业务线多 2.高速发展和扩张:业务增长、人员增长 3.普遍具有功能回归测试、持续集成、线上监控等需求 是不是跟我们平时工作中的情况很相似? 市面上已经有很多工具,但是传统自动化测试会存在一些问题: 1.工具多 & 杂 2.学习成本高 3.团队协作难 4.维护成本高 2. 核心目标 解决问题首先要确定目标,结合背景,Httprunner 的核心目标就是业务导向,快速落地。 1.少投入 工具开发&维护学习使用成本 编写&录入测试用例测试用例管理 2.高收益 实现自动化回归性能脚本复用 兼具持续集成、线上监控辅助手工测试,自定义生成特定业务数据 设计思路 有了目标,作者是如何一步一步设计出来的呢? 要想快速实现从 0 到 1,就是充分复用好的开源工具,比如requests,pytest,pydantic,allure和locust要想避免闭门造车,拥抱开源生态是最好的选择;要想兼具自动化,性能,持续集成,线上监控,需要实现命令行CLI调用和引入并发机制