Python 如何在单元测试中保持相同的类实例?

Python 如何在单元测试中保持相同的类实例?,python,Python,我正在为我的类编写一些单元测试,我注意到每个测试都会重置类 import unittest from module import ClassA class TestA(unittest.TestCase): def setUp(self): self.a = ClassA() def firstTest(self): # Test method and assign instance variables to self.a def s

我正在为我的类编写一些单元测试,我注意到每个测试都会重置类

import unittest
from module import ClassA

class TestA(unittest.TestCase):
    def setUp(self):
        self.a = ClassA()

    def firstTest(self):
        # Test method and assign instance variables to self.a

    def secondTest(self):
        # Test method with assumption that self.a still have those variables
        # Fails because instance variables are reset

unittest
是否为每个单独的测试运行
setUp()
?如果是这样的话,我如何更新并在所有测试中使用相同的类实例?

欢迎来到测试世界!,这需要一段时间来适应,但据我所知,这帮我节省了好几次时间

这里有几个问题(最后的答案在底部)

  • 默认情况下,测试方法需要加上“Test_u3;”前缀,这可以更改(请参阅该选项的详细信息)

  • 要回答您的问题,请使用前缀“setUpClass”

  • 这里有一个例子

    class TestA(unittest.TestCase):
        def setUp(self):
            self.a = OrderedDict()
            print("function 'setUp' was called !")
    
        @classmethod
        def setUpClass(cls):
            cls.b = OrderedDict()
            print("function 'setUpClass' was called !")
    
        def test_firstTest(self):
            # Test method and assign instance variables to self.a
            self.assertEqual(1, 1)
    
        def test_secondTest(self):
            # Test method with assumption that self.a still have those variables
            # Fails because instance variables are reset
            self.assertEqual(1, 1)
    

    单元测试不一定测试单个函数或方法;您可以有多个单元测试来测试同一函数的不同方面。例如,函数

    def some_func(x):
        if x % 2 == 0:
            return "even"
        else:
            return "odd"
    
    应该至少有两个测试:一个测试检查它是否为偶数值返回
    “偶数”
    ,另一个测试检查它是否为奇数值返回
    “奇数”
    。如果参数不支持
    %
    ,第三个测试可能会检查它是否引发了适当的异常

    fixture是可以运行测试的环境,由
    TestCase
    表示。
    TestCase
    中定义的每个测试都使用相同的夹具,在运行每个测试之前都是新创建的

    import unittest
    from module import ClassA
    
    class TestA(unittest.TestCase):
        def setUp(self):
            self.a = ClassA()
    
        def firstTest(self):
            # Test method and assign instance variables to self.a
    
        def secondTest(self):
            # Test method with assumption that self.a still have those variables
            # Fails because instance variables are reset
    
    现在,在您的例子中,如果
    secondTest
    确实依赖于
    firstTest
    的结果,那么这意味着
    secondTest
    依赖于一个独立的夹具,而不是
    firstTest
    。这需要一个单独的
    TestCase
    ,以确保为
    secondTest
    正确运行创建适当的条件

    比如说,

    # Tests that simply require an instance of ClassA
    class TestA(unittest.TestCase):
        def setUp(self):
            self.a = ClassA()
    
        def firstTest(self):
            # Test method and assign instance variables to self.a
    
    
    # Tests that require a particular configuration of an instance of ClassA
    class TestB(unites.TestCase):
        def setUp(self):
            self.a = ClassA()
            self.a.x = 6  # For example
    
        def secondTest(self):
            # Test something that requires self.a.x be set to 6 first
    

    一个好的测试运行者不会按顺序执行每个测试;它将随机化它们的顺序(不考虑它们在测试夹具中的分组),这样就没有一个测试可以依赖于在另一个测试之前或之后执行。

    单元测试应该是独立的。如果
    secondTest
    依赖于先运行
    firstTest
    ,那么这不是两个测试。这是一个大的测试,要么放在一个方法中,要么修改以删除依赖关系。是的,我也同意@user2357112。单元测试不应该是依赖的。如果测试依赖于集成、功能或端到端测试用例。有时需要单独的设置,例如SQL或读取非常大的文档,请尝试setUpClass()¨(需要用@classmethod修饰,请参见)我明白了。我认为单元测试意味着我只测试每个函数或方法的功能。因此,最好使用自己的实例变量独立编写每个测试,并且只测试这些变量?这并不能将实例变量从
    test\u firstTest
    保存到
    test\u secondTest
    ,甚至不能保证
    test\u firstTest
    实际首先运行,或者根本不跑步。感谢您详细阐述夹具的概念。我开始进行测试,认为我可以编写一个类来测试另一个类。你的回答告诉我我需要做什么。