__init__ for unittest.TestCase

问题:__init__ for unittest.TestCase

我想在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

I’d like to add a couple of things to what the unittest.TestCase class does upon being initialized but I can’t figure out how to do it.

Right now I’m doing this:

#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

I’d like all the stubs to be generated only once for this entire set of tests. I can’t use setUpClass() because I’m working on Python 2.4 (I haven’t been able to get that working on python 2.7 either).

What am I doing wrong here?

I get this error:

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

…and other errors when I move all of the stub code into __init__ when I run it with the command python -m unittest -v test.


回答 0

试试这个:

class TestingClass(unittest.TestCase):

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

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

Try this:

class TestingClass(unittest.TestCase):

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

You are overriding the TestCase‘s __init__, so you might want to let the base class handle the arguments for you.


回答 1

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

unittest.TestCase

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

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

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

Just wanted to add some clarifications about overriding the init function of

unittest.TestCase

The function will be called before each method in your test class. Please note that if you want to add some expensive computations that should be performed once before running all test methods please use the SetUpClass classmethod

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

This function will be called once before all test methods of the class. See setUp for a method that is called before each test method.


回答 2

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

import unittest2 

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

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

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

Install unittest2 and use that package’s unittest.

import unittest2 

and then use the setupModule / tearDownModule or setupClass / tearDown class for special initialization logic

More info: http://www.voidspace.org.uk/python/articles/unittest2.shtml

Also most likely your are creating an integration test more than an unittest. Choose a good name for the Tests to differentiate them or put in a different container module.