【pytest】为什么不能使用__init__

示例代码分析

以下是一个简单的示例,演示了在 pytest 中使用 __init__ 方法导致的问题:

class TestClass:def __init__(self):self.x = 10def test_add(self):self.x += 5assert self.x == 15def test_main():pytest.main()

在这个示例中,TestClass 类定义了一个 __init__ 方法,用于初始化类实例的 x 属性。在 test_add 测试方法中,x 属性的值被增加了 5,并断言其值等于 15。

然而,如果使用 pytest 运行该代码,则会抛出以下错误:

TypeError: cannot call __init__ on class TestClass; __init__ methods are not supported for test classes

原因分析

该错误的原因是 pytest 无法正确识别 TestClass 类。因为当 pytest 实例化 TestClass 类时,__init__ 方法会被自动调用,这会导致 x 属性的值被初始化为 10。然而,在 pytest 中,测试类的实例化是由框架自动完成的,用户通常不需要在 __init__ 方法中进行额外的初始化操作。

此外,__init__ 方法可能会掩盖测试类的实际测试逻辑。在该示例中,test_add 测试方法的目的是测试 x 属性是否被正确增加,但由于 __init__ 方法的存在,导致 x 属性的值在测试开始之前就已经被初始化为 10,这使得测试结果变得不可靠。

改进方案

为了避免上述问题,可以将 __init__ 方法中的初始化操作移到 setUp() 方法中,并使用 fixture 函数来提供测试所需的 x 属性值:

import pytest@pytest.fixture
def x_fixture():return 10class TestClass:def setUp(self, x):self.x = xdef test_add(self, x_fixture):self.x += 5assert self.x == 15def test_main():pytest.main()

在改进后的代码中,x_fixture 函数用于提供 x 属性的初始值,并将其作为参数传递给 setUp() 方法和 test_add 测试方法。这样可以确保 x 属性的值在每个测试用例之前都被正确初始化,并且不会影响测试类的实际测试逻辑。

总结

在 pytest 中不能使用 __init__ 方法的原因主要有以下几点:

1. pytest 的测试收集机制

pytest 采用的是自动发现机制来收集测试用例。它会递归遍历测试目录,并收集所有以 test 结尾的文件和目录中的测试函数和测试类。当遇到测试类时,pytest 会自动实例化该类并调用其所有以 test 结尾的方法作为测试用例。

2. init 方法的特殊性

__init__ 方法是 Python 中类的特殊方法,用于初始化类实例。当创建类实例时,__init__ 方法会被自动调用。在 pytest 中,如果测试类中定义了 __init__ 方法,那么当 pytest 实例化该类时,__init__ 方法会被调用。

3. pytest 与 init 方法的冲突

__init__ 方法通常用于初始化类实例的状态,例如分配成员变量的值等。然而,在 pytest 中,测试类的实例化是由 pytest 框架自动完成的,用户通常不需要在 __init__ 方法中进行额外的初始化操作。此外,如果测试类中定义了 __init__ 方法,那么可能会导致以下问题:

  • __init__ 方法可能会掩盖测试类的实际测试逻辑。
  • __init__ 方法可能会引入额外的副作用,影响测试结果的准确性。
  • __init__ 方法可能会导致测试类难以被 pytest 正确识别。

4. 避免使用 init 方法的替代方案

为了避免上述问题,建议在 pytest 中不要使用 __init__ 方法。如果需要在测试类中进行初始化操作,可以使用以下替代方案:

  • 使用 setUp() 和 tearDown() 方法setUp() 方法会在每个测试用例之前运行,用于初始化测试环境;tearDown() 方法会在每个测试用例之后运行,用于清理测试环境。
  • 使用类属性:可以使用类属性来存储测试类共享的状态。
  • 使用 fixture 函数:可以使用 fixture 函数来提供测试所需的资源和环境。

总而言之,在 pytest 中不能使用 __init__ 方法主要是因为它与 pytest 的测试收集机制和测试类实例化过程存在冲突。为了避免出现问题,建议使用其他方法来替代 __init__ 方法进行初始化操作。

在 pytest 中,建议不要使用 __init__ 方法来初始化测试类。如果需要进行初始化操作,可以使用 setUp() 方法、类属性或 fixture 函数等替代方案。这样可以避免出现问题,并使测试代码更加清晰易懂。

如果你能看到最后,说明你认真看了,这篇文章是一道很常见的面试题,栽倒的人应该不是少数,记下来哈哈哈哈~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPA影刀 | 变量的使用

1.什么是变量 2.变量的作用 作用1:方便后续流程调用 这里在后续流程“点击元素”中,就可以选中这个变量 作用2:区分相同属性的变量 如果要打开两个网页,总不能都叫web_page吧。 所以这里一个叫百度web_page,一个叫…

flask项目结构与蓝图【心得】

flask 项目没有标准的项目结构,合理组织,确保能跑,可配置,可拓展、模型可被发现就行。 一般可以分为两种 按模型(业务)划分 按功能划分,就是api、models、config、db、service等 按模型&…

C++期末复习总结(2)

目录 1.运算符重载 2.四种运算符重载 (1)关系运算符的重载 (2) 左移运算符的重载 (3)下标运算符的重载 (4)赋值运算符的重载 3.继承的方式 4.继承的对象模型 5.基类的构造 6…

易飞销货单出货时审核库存检查

公司接到一客户因品种多而数量少,单一出货计划行比较多,而只上了生产ERP易飞,审核时经常会出现倒催货,提前做销售单,行数有时超30行以上,审核跳窗报错时也不方便查找,特写一外挂程序&#xff0c…

How to: Build a Custom End-User Skin Selector

This section explains how to populate a ComboBoxEdit control with DevExpress skin items. 本节介绍如何使用DevExpress皮肤项填充ComboBoxEdit控件。 To populate a combo box editor, iterate through the SkinManager.Skins collection, which returns all currently a…

字母异位词分组(charyw)

字母异位词分组 题目描述 给定一个字符串数组&#xff0c;将字母异位词组合在一起。字母异位词指字母相同&#xff0c;但排列不同的字符串。 输入格式 第一行正整数n&#xff0c;表示有n个字符串(1<n<1000) 第二行n个字符串&#xff0c;空格隔开 输出格式 多组字母…

Linux基础指令网络管理002

Linux网络管理涉及配置、监控和维护网络接口、路由、防火墙规则、网络服务等&#xff0c;本章主要讲述如何查看网络接口以及管理网络连接。 操作系统&#xff1a; CentOS Stream 9 操作步骤&#xff1a; 查看网络接口及ip信息 指令ipconfig ,如果不能使用该命令先下载 yum …

Qt程序发布工具windeployqt.exe所带来的坑

一、使用Qt自带的发布工具&#xff1a;windeployqt.exe来自动查找运行时库文件&#xff0c;是个好办法。但是该工具有坑&#xff01;并且坑很深&#xff01;我在发布程序时就遇到了一个大坑&#xff01;我使用该工具进行程序发布&#xff0c;自动查找运行时库文件&#xff0c;看…

【c语言】自定义类型----结构体

结构体是c语言的一种自定义类型&#xff0c;自定义类型对于开发者及其重要的类型&#xff0c;它可以随意由开发者进行谱写功能&#xff0c;而今天的结构体可以用来表示一种变量的单个或多种具体属性&#xff0c;再编写代码时有着不可替代的作用&#xff01;&#xff01;&#x…

一个简单的消息队列

目录 原理 实现代码 示例 原理 消息队列是一个先进先出栈&#xff0c;每次都处理第一项&#xff0c;处理完了过后会删除这个消息&#xff0c;这是一个简单的消息队列图&#xff1a; 实现代码 首先消息队列需要一个队列&#xff0c;我们用Python里的列表&#xff1a; self.…

常见的api: BigInteger

一.获取一个大的随机整数 1.代码: BigInteger bd1 new BigInteger(4, new Random());System.out.println(bd1); 2.打印的结果:2 3.注释获取的是0-16之间的随机整数 二.获取一个指定的大的数 1.代码&#xff1a; BigInteger bd2 new BigInteger("100");System.o…

mybatis离谱bug乱转类型

字符串传入的参数被转成了int&#xff1a; Param("online") String online<if test"online 0">and (heart_time is null or heart_time <![CDATA[ < ]]> UNIX_TIMESTAMP(SUBDATE(now(),INTERVAL 8 MINUTE)) )</if><if test"…

人工智能--教育领域的运用

文章目录 &#x1f40b;引言 &#x1f40b;个性化学习 &#x1f988;体现&#xff1a; &#x1f988;技术解析&#xff1a; &#x1f40b;智能辅导与虚拟助手 &#x1f988;体现&#xff1a; &#x1f988;技术解析&#xff1a; &#x1f40b;自动评分与评估 &#x1f…

【react】useEffect 快速上手

useEffect 快速上手 useEffect(setup, dependencies?) 可以接收两个参数&#xff0c;分别是回调函数与依赖数组. useEffect 用什么姿势来调用&#xff0c;本质上取决于你想用它来达成什么样的效果。下面我们来简单介绍 useEffect 的调用规则。 每一次渲染后都执行的副作用&a…

国内拉取国外镜像方法

参考&#xff1a; https://mp.weixin.qq.com/s/-bDrC63J52oSEcIfGcQ7pw 1. github创建仓库 images-sysncer 2. 在此仓库中创建目录 .github/workflows 3. 在此目录中创建文件 sync-image-example.ymlvim sync-image-example.yml name: Sync Image to Aliyun Exampleon:pus…

植物大战僵尸杂交版最新2.0.88手机+电脑+苹果+修改器

在这个充满奇妙的平行宇宙中&#xff0c;植物和僵尸竟然能够和谐共存&#xff01;是的&#xff0c;你没听错&#xff01;一次意外的实验&#xff0c;让这两个看似对立的生物种类发生了基因杂交&#xff0c;创造出了全新的生物种类——它们既能够进行光合作用&#xff0c;也具备…

从零手写实现 nginx-11-文件处理逻辑与 range 范围查询合并

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

C语言中memset()以及memcpy()函数使用方法

memset( ) 在函数memset&#xff08;void *A&#xff0c;int B&#xff0c;int C&#xff09;&#xff1b;语句中&#xff0c;程序完成了将A指针指向的内容开始往后的C个字节内容置为B。 例如下列函数&#xff0c;最终结果是&#xff1a;cps数组内容为&#xff1a;2222222222…

2024年【R2移动式压力容器充装】考试技巧及R2移动式压力容器充装复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装考试技巧参考答案及R2移动式压力容器充装考试试题解析是安全生产模拟考试一点通题库老师及R2移动式压力容器充装操作证已考过的学员汇总&#xff0c;相对有效帮助R2移动式压力容器充装复审考试学…

Linux 35.5 + JetPack v5.1.3@RACER编译安装

Linux 35.5 JetPack v5.1.3RACER编译安装 1. 源由2. 编译&安装Step 1&#xff1a;依赖库安装Step 2&#xff1a;LKH-3安装Step 3&#xff1a;建立工程Step 4&#xff1a;编译工程Step 5&#xff1a;安装工程 3. 问题汇总3.1 组件ros-noetic-multi-map-server问题3.2 swarm…