NUnit extension

杀马特。学长 韩版系。学妹 提交于 2019-11-29 14:27:25

I have managed to fix the issue by simply removing my extension assembly from NUnit 2.5.10\bin\net-2.0\addins folder. At the moment everything works as expected but i am not sure how. I thought that you have to have the extension/addin assembly inside the addins folder. I am running tests by opening a solution via NUnit.exe. My extension project is part of the solution i am testing. I have also raised this issue with NUnit guys and got the following explanation:

Most likely, your addin was being loaded twice. In order to make it easier to test addins, NUnit searches each test assembly for addins to be loaded, in addition to searching the addins directory. Normally, when you are confident that your addin works, you should remove it from the test assembly and install it in the addins folder. This makes it available to all tests that are run using NUnit. OTOH, if you really only want the addin to apply for a certain project, then you can leave it in the test assembly and not install it as a permanent addin. http://groups.google.com/group/nunit-discuss/browse_thread/thread/c9329129fd803cb2/47672f15e7cc05d1#47672f15e7cc05d1

Not sure this answer is strictly relevant but might be useful.

I was having a play around with the NUnit library recently to read NUnit tests in so they could easily be transfered over to our own in-house acceptance testing framework.

It turns out we probably wont stick with this but thought it might be useful to share my experiences figuring out how to use the NUnit code:

It is different in that it doesn't get run by the NUnit console or Gui Runner but just by our own console app.

public class NUnitTestReader
{
    private TestHarness _testHarness;

    public void AddTestsTo(TestHarness testHarness)
    {
        _testHarness = testHarness;
        var package = new TestPackage(Assembly.GetExecutingAssembly().Location){AutoBinPath = true};
        CoreExtensions.Host.InitializeService();
        var testSuiteBuilder = new TestSuiteBuilder();
        var suite = testSuiteBuilder.Build(package);

        AddTestsFrom(suite);
    }

    private void AddTestsFrom(Test node)
    {
        if (!node.IsSuite)
            AddTest(node);
        else
        {
            foreach (Test test in node.Tests)
                AddTestsFrom(test);
        }
    }

    private void AddTest(Test node)
    {
        _testHarness.AddTest(new WrappedNUnitTest(node, TestFilter.Empty));
    }
}

The above reads NUnit tests in from the current assembly wraps them up and then adds them to our inhouse test harness. I haven't included these classes but they're not really important to understanding how the NUnit code works.

The really useful bit of information here is the static to "InitialiseService" this took quite a bit of figuring out but is necessary to get the basic set of test readers loaded in NUnit. You need to be a bit careful when looking at the tests in NUnit aswell as it includes failing tests (which I assume dont work because of the number of statics involved) - so what looks like useful documentation is actually misleading.

Aside from that you can then run the tests by implementing EventListener. I was interested in getting a one to one mapping between our tests and NUnit tests so each test is run on it's own. To achieve this you just need to implement TestStarted and TestFinished to do logging:

    public void TestStarted(TestName testName)
    {

    }
    public void TestFinished(TestResult result)
    {
        string text;
        if (result.IsFailure) 
            text = "Failure";
        else if (result.IsError)
            text = "Error";
        else
            return;

        using (var block = CreateLogBlock(text))
        {
            LogFailureTo(block);
            block.LogString(result.Message);
        }
    }

There are a couple of problems with this approach: Inherited Test base classes from other assemblies with SetUp methods that delegate to ones in the current assembly dont get called. It also has problems with TestFixtureSetup methods which are only called in NUnit when TestSuites are Run (as opposed to running test methods on their own).

These both seem to be problems with NUnit although if you dont want to construct wrapped tests individually I think you could just put in a call to suite.Run with the appropriate parameters and this will fix the latter problem

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!