首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >单元测试中的类与实例属性

单元测试中的类与实例属性
EN

Stack Overflow用户
提问于 2022-01-19 18:46:36
回答 2查看 149关注 0票数 -1

在单元测试中,

代码语言:javascript
代码运行次数:0
运行
复制
class Product:

    def __init__(self, name, price):
        self.name = name
        self.price = price

设置类属性(#1)而不是实例属性(#2)的理由是什么?在我看来,类与静态和实例属性之间的区别是很明显的(在许多其他的SO帖子中也有说明),但是对于每个类的优缺点和用例还不是很清楚。

(1)

代码语言:javascript
代码运行次数:0
运行
复制
import unittest

class TestProduct(unittest.TestCase):
    
    @classmethod
    def setUp(cls):
        cls.product = Product("book", 30)

(2)

代码语言:javascript
代码运行次数:0
运行
复制
import unittest

class TestProduct(unittest.TestCase):

    def setUp(self):
        self.product = Product("book", 30)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-19 18:58:50

考虑一下这个例子:

代码语言:javascript
代码运行次数:0
运行
复制
class TestProduct(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.list_a = []
    
    def setUp(self):
        self.list_b = []

    def test_one(self):
        self.assertFalse(self.list_b)
        self.list_a.append(1)

    def test_two(self):
        self.assertFalse(self.list_a)
        self.list_b.append(1)

如果test_twotest_one之前运行,它就会成功,因为类属性list_a仍然是空的。但是,如果它在test_one之后运行,它将失败,因为test_one向共享类属性追加了一个值。

另一方面,test_one总是会通过,因为即使test_two先运行,test_one也会看到setUp在调用test_one之前创建的一个新的空列表,而不是test_two修改的列表。

在调用每个实例方法之前调用setUp。在定义类之后,但在调用任何测试之前,只调用一次setUpClass

在您的示例中,如果Product实例是不可变的,或者没有测试方法修改实例,那么使用什么并不重要,因为无论是在setUp还是setUpClass中定义,每个测试都会看到相同的值。但是,当共享Product实例可行时,setUpClass比在每次测试之前重新创建相同的可变值更有效。

票数 1
EN

Stack Overflow用户

发布于 2022-01-19 18:55:04

另外,类和实例初始化方法的正确名称是:

代码语言:javascript
代码运行次数:0
运行
复制
class TestProduct(unittest.TestCase):
    
    @classmethod
    def setUpClass(cls):
        cls.product = Product("book", 30)

    def setUp(self):
        self.product = Product("book", 30)

对于setUp中的每个测试方法,将调用该TestProduct的不同之处。它的目的是重置可以通过某些测试更改的对象的值。另一方面,setUpClass只在TestProduct中的任何测试之前被调用一次。它用于对在任何测试中从未更改的对象进行代价高昂的初始化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70776156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档