python - Pytest 可以只实例化一个类对象来测试它的所有方法吗?
问题描述
我认为这应该是一个非常常见的场景,例如,如果你有一个类和一些方法。如果您想为它们编写单元测试,例如 test_method_1、test_method_2、... test_method_n,我不想为这些测试函数中的每一个实例化类对象,这可能是多余的或效率低下的。但是,我阅读了 Pytest 的文档,在我看来,例如使用夹具装饰,虽然它似乎只编写了一次类实例化,但实际上每次传递给新的测试函数时都会调用这个实例化。有没有办法不这样做,而是我只创建一次类对象,所有测试都在这个对象内完成?
解决方案
Fixtures 可以有不同的作用域,或者换句话说,每个使用它的函数调用一次,或者使用它的每个测试模块调用一次,或者使用它的每个测试会话调用一次。请参阅https://docs.pytest.org/en/latest/fixture.html#scope-sharing-a-fixture-instance-across-tests-in-a-class-module-or-session
如果您使用默认范围(函数),此示例脚本将失败,如果您使用其他范围,则通过。
import pytest
SCOPE="function"
#SCOPE="session"
class Shared(object):
counter = 0
def __init__(self):
self.instance_id = Shared.counter
Shared.counter += 1
@pytest.fixture(scope=SCOPE)
def shared_instance():
instance = Shared()
yield instance
def test_one(shared_instance):
assert shared_instance.instance_id == 0
def test_two(shared_instance):
assert shared_instance.instance_id == 0
推荐阅读
- javascript - 传单地图重新加载 onclick
- c++ - 为什么这段代码会导致无限循环?
- java - JUnit 4.13 中已弃用的 ExpectedException.none() 的替代品
- swift - SwiftUI 延迟一段时间后如何显示新视图
- reactjs - 删除具有高度的行项目之间的额外空格(React JS/Material-UI)
- flutter - Flutter SlideTransition 与 AnimatedList
- java - 如何更改路径以使其不被硬编码
- vue.js - 使用 Vuetify Vuejs 刷新页面后如何保持在同一选项卡上
- css - 嵌套的弹性盒和位置:顶部和底部的粘性?
- javascript - 使用 React useState 如何访问从 fetch API 返回的数组的键值