Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python nose setup/teardown class fixture method not executed for test generators

Tags:

python

nose

In a hobby project I intend to use nose for testing, I want to put all tests for specific classes into classes since these tests share setup and other functionality. But I can't seem to get nose to execute the setup methods inside the classes.

Here is an example class that is tested:

class mwe():
    def __init__(self):
        self.example = ""
    def setExample(self, ex):
        self.example = ex

The tests work, when I don't use classes:

from nose.tools import ok_
import mwe

exampleList = []

def setUp():
    print("setup")
    exampleList.append("1")
    exampleList.append("2")
    exampleList.append("3")

def test_Example():
    print("test")
    for ex in exampleList:
        t = mwe.mwe()
        t.setExample(ex)
        yield check, t, ex

def check(e, ex):
    ok_(e.example == ex)

The output is as expected:

setup
test
...
----------------------------------------------------------------------
Ran 3 tests in 0.004s

OK

When a test class is used, the setup method is not executed and therefore no tests are executed.

from nose.tools import ok_
import mwe

class TestexampleClass(object):

    def __init__(self):
        print("__init__")
        self.exampleList = []

    def setup(self):
        print("setup class")
        self.exampleList.append("1")
        self.exampleList.append("2")
        self.exampleList.append("3")   

    def test_ExampleClass(self):
        print("test class")
        for ex in self.exampleList:
            t = mwe.mwe()
            t.setExample(ex)
            yield self.check, t, ex

    def check(self, we, ex):
        print("check class")
        ok_(we.example == ex)

I'm fairly new to python and a newbie with nose, my question is, why is setup not executed? Where is the error in my code?

__init__
test class

----------------------------------------------------------------------
Ran 0 tests in 0.002s

OK

I will be glad for any feedback.

When I use the code from this Question on SO the setup method is executed, as I would expect it.

SOLUTION: After a lot of desperation I found the following: Nose executes the the class level setup method before the execution of the yielded function, not when the test_* methods are called, as I expected and as is the case for other test_* methods. This obviously goes against the nose documentation:

Setup and teardown functions may be used with test generators. However, please note that setup and teardown attributes attached to the generator function will execute only once. To execute fixtures for each yielded test, attach the setup and teardown attributes to the function that is yielded, or yield a callable object instance with setup and teardown attributes.

Looking at the bug reports, I found the bug report on github.

A possible workaround is to use class level fixtures:

@classmethod
def setup_class(cls):
    #do stuff
    pass
like image 829
imoj Avatar asked May 27 '14 11:05

imoj


1 Answers

Your test class needs to extend TestCase and the setup method needs to be called setUp

from unittest import TestCase

class TestUtils(TestCase):
    def setUp(self):
        self.x = 1

    def test_something(self):
        self.assertEqual(1, self.x)

which outputs

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
like image 138
mbatchkarov Avatar answered Oct 12 '22 23:10

mbatchkarov