__init__ for unittest.TestCase


122

我想在unittest.TestCase类初始化后添加一些内容,但是我不知道该怎么做。

现在我正在这样做:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

我希望针对整个测试集只生成一次所有存根。我无法使用,setUpClass()因为我正在使用Python 2.4(我也无法在python 2.7上使用该功能)。

我在这里做错了什么?

我收到此错误:

 `TypeError: __init__() takes 1 argument (2 given)` 

__init__当我使用命令运行所有存根代码时,...以及其他错误python -m unittest -v test


@Neeraj我想我的问题早于那一个?
2014年

@Abhijeet这个问题是在2013年提出的,您链接到的一个问题是在2016年提出的,答案和论述较少,也许您应该将另一个问题标记为重复?答案是与Python 3相关的,这个问题是关于Python 2的
。– ffledgling

对不起,我不好。
阿披耶特(Abhijeet)

Answers:


166

试试这个:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

您正在覆盖TestCase__init__,因此您可能希望让基类为您处理参数。


+1我会在调用任何对象方法之前初始化基类。
Joachim Isaksson

这对我不起作用。gen_stub中的内容未执行。实际上看起来根本没有调用gen_stub ...我可以知道,因为应该存在的self.tempdir无法被该类的其他方法访问。我得到一个AttributeError的:“TestingClass”对象有没有属性“TEMPDIR”
ffledgling

22
您不应该这样称呼它,setUp而不是覆盖它__init__吗?
karthikr

2
@karthikr我想为所有测试生成一次存根,而不是每次都为每个测试重新创建存根。一些测试甚至不会使用某些存根。我会使用setUpClass,但是我不认为python 2.4支持它。
2013年

2
您也可以在这种情况下更加明确(我认为这有助于提高可读性)并使用:unittest.TestCase.__init__(self,*args,**kwargs)代替super(TestingClass, self).__init__(*args, **kwargs)
Onyooo

22

只是想添加一些关于重写init函数的说明

unittest.TestCase

该函数将在测试类中的每个方法之前调用。请注意,如果您想添加一些昂贵的计算,然后再运行所有测试方法,则应执行一次,请使用SetUpClass类方法

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

该函数将在该类的所有测试方法之前被调用一次。有关setUp在每个测试方法之前调用的方法,请参见。


4

安装unittest2并使用该软件包的unittest。

import unittest2 

然后使用setupModule / tearDownModule或setupClass / tearDown类进行特殊的初始化逻辑

更多信息:http : //www.voidspace.org.uk/python/articles/unittest2.shtml

同样,您很有可能正在创建集成测试而不是单元测试。为测试选择一个好的名称以区分它们,或将其放在其他容器模块中。


感谢您的文档链接。
克里斯(Chris)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.