Trickiness with unittesting

Peter Otten __peter__ at web.de
Fri Jul 18 15:56:29 EDT 2008


arockstar at gmail.com wrote:

> Basically, I'm trying to implement a setUp() and TearDown() for a
> python TestSuite (as opposed to an individual test within the suite).
> 
> Sort of.
> 
> I have a few different test suites (call them SuiteA, SuiteB,...). For
> one of the test suites (SuiteA), I need to execute a bit of code (say
> startFoo()) before the first test in SuiteA runs, and once when the
> last test of SuiteA finishes (endFoo()).
> 
> Making this even trickier is that the testing framework combines the
> different suites (SuiteA, SuiteB) as well as individual tests into
> master test suite which my testrunner then runs.
> 
> Also complicating matters is the fact that the testing framework can
> run an *individual* test from any TestSuite: in that case, if I'm
> running SuiteA.test1, I'd want to call startFoo() and endFoo() as
> well.
> 
> I could use a global variable as a flag and see if it's been set
> during the setUp() method of the test cases (which would allow me to
> call startFoo() once when tests from SuiteA are run from the master
> suite), but that doesn't help me with calling endFoo() when the tests
> from SuiteA finish. Plus, it's not very elegant.
> 
> So:
> Given a master test suite comprised of a bunch of different tests from
> different suites, I need to call startFoo() before tests from SuiteA
> are run, and stopFoo() after all the tests from SuiteA have finished
> running.

Here's a glorified version of you global flag idea: 

class Nested(object):
    def __init__(self, start, end):
        self.level = 0
        self._start = start
        self._end = end

    def start(self):
        if self.level == 0:
            self._start()
        self.level += 1

    def end(self):
        assert self.level > 0
        self.level -= 1
        if self.level == 0:
            self._end()

def start_foo():
    print "start foo"

def end_foo():
    print "end foo"

foo = Nested(start_foo, end_foo) 
print "--- 1 ---"
foo.start()
print "--- 2 ---"
foo.start()
print "--- 3 ---"
foo.end()
print "--- 4 ---"
foo.end()
print "--- 5 ---"

Peter




More information about the Python-list mailing list