← Back to team overview

nunit-core team mailing list archive

[Bug 590970] Re: static TestFixtureSetUp/TestFixtureTearDown methods in base classes are not run

 

Well, the documentation for TestFixtureSetUp indicates that:

"TestFixtureSetUp methods may be either static or instance methods"

and also:

"The TestFixtureSetUp attribute is inherited from any base class.
Therefore, if a base class has defined a SetFixtureSetUp method, that
method will be called after each test method in the derived class."

(although the last sentence I've quoted from the documentation has a
typo, and seems to be copy/pasted incorrectly from the documentation for
TearDown.)

The problem comes in when both are combined, as in my example.

If you go back to my original example, but change the
TestBaseTestFixtureSetUp & TearDown methods to be non-static, you can
see that they do get inherited by the derived test and executed, without
any tests in the base, which is indeed what the documentation says is
supposed to happen:

TestBase TestFixtureSetUp
TestDerived TestFixtureSetUp
***** TestDerived.TestMethod
TestMethod
TestDerived TestFixtureTearDown
TestBase TestFixtureTearDown


As additional context, in JUnit, @BeforeClass methods must always be static, and the equivalent code works as expected there:

public class TestBase {
	@BeforeClass
	public static void testBaseBeforeClass() {
		System.out.println("TestBase");
	}
}

public class TestDerived extends TestBase {
	@BeforeClass
	public static void testDerivedBeforeClass() {
		System.out.println("TestDerived");
	}

	@Test
	public void testMethod() throws Exception {
		System.out.println("testMethod");
	}
}

Running testMethod() prints:

TestBase
TestDerived
testMethod

as expected.

-- 
static TestFixtureSetUp/TestFixtureTearDown methods in base classes are not run
https://bugs.launchpad.net/bugs/590970
You received this bug notification because you are a member of NUnit
Developers, which is subscribed to NUnit V2.

Status in NUnit V2 Test Framework: New

Bug description:
NUnit 2.5.5.  Even though TestFixtureSetUp/TestFixtureTearDown methods can be static, if they are defined them in a base class, they won't be executed.  From looking at the code, it seems like the problem is that the reflection code to find fixture setup/teardown methods does not search base classes.

To reproduce:

using System;
using NUnit.Framework;

public class TestBase
{
	[TestFixtureSetUp]
	public static void TestBaseTestFixtureSetUp()
	{
		Console.Out.WriteLine("TestBase TestFixtureSetUp");
	}
	
	[TestFixtureTearDown]
	public static void TestBaseTestFixtureTearDown()
	{
		Console.Out.WriteLine("TestBase TestFixtureTearDown");
	}
}

public class TestDerived : TestBase
{
	[TestFixtureSetUp]
	public static void TestFixtureSetUp()
	{
		Console.Out.WriteLine("TestDerived TestFixtureSetUp");
	}
	
	[TestFixtureTearDown]
	public static void TestFixtureTearDown()
	{
		Console.Out.WriteLine("TestDerived TestFixtureTearDown");
	}
	
	[Test]
	public void TestMethod()
	{
		Console.Out.WriteLine("TestMethod");
	}
}

When you run this test, it only prints messages for the TestDerived class, not for TestBase.





Follow ups

References