Python - 单元测试方法在不同类中的正确方法是什么?

问题描述:

我写了一个名为Consumer.py的模块,其中包含一个类(Consumer)。该类使用配置文件进行初始化,该文件包含用于计算的不同参数以及用于记录的loq队列的名称。Python - 单元测试方法在不同类中的正确方法是什么?

我想为这个类编写单元测试,所以我用名为TestConsumerMethods(unittest.TestCase)的类创建了一个名为test_Consumer.py的脚本。

现在,我所做的是创建一个名为cons的Consumer类的新对象,然后使用它来调用类方法进行测试。例如,Consumer有一个简单的方法来检查给定目录中是否存在文件。我做的测试看起来像这样

import Consumer 
from Consumer import Consumer 

cons = Consumer('mockconfig.config', 'logque1') 

class TestConsumerMethods(unittest.TestCase): 

    def test_fileExists(self): 
     self.assertEqual(cons.file_exists('./dir/', 'thisDoesntExist.config), False) 
     self. assertEqual(cons.file_exists('./dir/', thisDoesExist.config), True) 

这是测试我的班级的正确方法吗?我的意思是,理想情况下,我想只使用类方法,而不必实例化类,因为要“隔离”代码,对吧?

我不知道如果这就是你要搜索的内容,但你可以在你的文件这样的末尾添加你的测试:

#!/usr/bin/python 

... 

class TestConsumerMethods(...): 
    ... 

if __name__ == "__main__": 
    # add your tests here. 

这种方式,通过执行包含类文件定义,您执行您在if声明中输入的测试。

这种方式只有在您直接执行文件本身时才会执行测试,但如果您从中导入类,则不会执行测试。

+1

这个问题是,那么这就是你可以运行测试的唯一方法。你不能用unittest发现它们,或者在CI设置中很容易地运行它们 – SpoonMeiser

+0

@SpoonMeiser确实如此,但是如果你需要一种简单的方法来实现一些测试(例如没有单元测试知识),这可能是一个好方法, 。 但是,这仍然是实施测试的简单而快捷的方式,它有一定的局限性。 我认为这取决于你需要什么,这是一种方式。 – vmonteco

不要让一个全局对象进行测试,因为它打开了一个状态可能会被一个测试设置并影响另一个状态的可能性。

每个测试应该单独运行并且完全独立于其他测试。

取而代之的是,无论是在您的测试创建对象,或者它会自动为每个测试创建,将其置于设置方法:

import Consumer 
from Consumer import Consumer 


class TestConsumerMethods(unittest.TestCase): 
    def setUp(self): 
     self.cons = Consumer('mockconfig.config', 'logque1') 

    def test_fileExists(self): 
     self.assertEqual(self.cons.file_exists('./dir/', 'thisDoesntExist.config), False) 
     self. assertEqual(self.cons.file_exists('./dir/', thisDoesExist.config), True) 

至于你是否真的需要在所有实例类,这取决于班级的实施情况。我想通常你会希望实例化一个类来测试它的方法。

+0

这很有道理,谢谢!是否有必要删除tearDown()中的对象? – Zazz

+0

@Zazz通常,没有。 TestConsumerMethods将为每个测试实例化,每次构建一个新的Consumer。旧消费者只会像其他任何超出范围的垃圾一样收集垃圾。如果你需要明确释放一些资源或其他资源,你只需要在'tearDown'中执行一些操作。 – SpoonMeiser