【问题标题】:Class vs Instance attribute in unit test单元测试中的类与实例属性
【发布时间】:2022-01-19 18:46:36
【问题描述】:

在对一个类进行单元测试时,

class Product:

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

设置类属性 (#1) 而不是实例属性 (#2) 的基本原理是什么?类与静态与实例属性之间的区别对我来说很清楚(并且在许多其他 SO 帖子中都有说明),但是对于每种属性的优缺点或用例,并不是很明显。

(1)

import unittest

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

(2)

import unittest

class TestProduct(unittest.TestCase):

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

【问题讨论】:

  • 没有set_up 方法作为unittest 框架的一部分。但是,实例方法setUp 将在每个测试方法之前调用,而类方法setUpClass 在定义类之后但在任何测试之前将被调用一次方法运行。如果Product 是不可变的,则可能无关紧要,但如果它可变的,则一个测试对类属性所做的更改将对同一运行中的后续测试可见。跨度>
  • "如果 Product 是不可变的,这可能无关紧要,但如果它是可变的,则一个测试对类属性所做的更改将对同一运行中的后续测试可见。" 这个评论对我的学习很有帮助!

标签: python unit-testing oop


【解决方案1】:

考虑这个例子:

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 在调用 test_one 之前看到由 setUp 创建的新空列表,而不是test_two已修改。

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

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

【讨论】:

    【解决方案2】:

    顺便说一句,类和实例初始化方法的正确名称是:

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

    setUp 的不同之处在于将为TestProduct 中的每个测试方法调用。它旨在重置可以通过某些测试更改的对象的值。另一方面,setUpClassTestProduct 中的任何测试之前只被调用一次。它旨在用于在任何测试中都不会更改的对象的昂贵初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多