用于多个[TestFixture]

时间:2010-08-24 15:07:01

标签: c# nunit

我正在NUnit中设置测试并遇到一个新手问题。

是否有可能在多个[TestFixture]中使用的测试?

所以 [Test] ValidateString(string bob)

可以在一系列不同的[TestFixture]中调用吗?

4 个答案:

答案 0 :(得分:5)

这听起来不像是对我的考验。测试通常是无参数的(除非您使用[TestCase] s)并且在单个夹具的上下文中运行它通常就足够了 - 它要么经过一次又要好,要么没有,这是一个破坏的测试

如果您只有一个对字符串进行某些验证的方法,您可以将其设置为某个类(例如TestHelpers)上的静态方法,并从任何测试(在多个测试装置中)调用它它


这是另一个想法:继承。您可以拥有一个包含所有测试的基础夹具,然后是从中继承的夹具,用于设置您需要的任何变量。测试将针对每个夹具运行。我不熟悉Selenium RC,但您应该能够调整下面的代码来设置各种灯具中需要的变量。

[TestFixture]
public class BaseFixtureTests
{
    protected IMyClass _myClass;

    [TestFixtureSetUp]
    public void FixtureSetup() 
    {
        _myClass = ConfigureMyClass();
    }

    protected virtual IMyClass ConfigureMyClass() 
    {
        // fixtures that inherit from this will set up _myClass here as they see fit.
    }

    [Test]
    public void MyClassTest1() 
    {
        // test something about _myClass;
    }
}

[TestFixture]
public class MySpecificFixture1 : BaseFixtureTests
{
    protected override IMyClass ConfigureMyClass()
    {
        return new MySpecificMyClassImplementation();
    }   
}

public class MySpecificMyClassImplementation : IMyClass
{
    //some implementation
}

您还可以在每个灯具中添加额外的测试,这些测试不会测试常见功能,也不需要在灯具之间重复使用。

答案 1 :(得分:2)

较新版本的NUnit支持泛型。如果您测试的内容不需要从测试代码中配置(仅创建),那么这非常适合。以下是从http://nunit.net/blogs/复制的示例:

[TestFixture(typeof(ArrayList))]
[TestFixture(typeof(List<int>))]
public class IList_Tests<TList> where TList : IList, new()
{
    private IList list;

    [SetUp]
    public void CreateList()
    {
        this.list = new TList();
    }

    [Test]
    public void CanAddToList()
    {
        list.Add(1); list.Add(2); list.Add(3);
        Assert.AreEqual(3, list.Count);
    }
}

我也使用过Anna的继承方法。对她的示例的一种可能的改进(取决于个人偏好):不要将基类标记为TestFixture,只标记子类。您标记为TestFixture的每个类都将在NUnit客户端中显示为一组测试。您可能永远不会想直接运行基类方法,因为子项提供了所有设置代码。如果从基类中删除TestFixture,则在UI中不会运行无效测试。这允许你运行所有的测试,看到所有的绿色...总是很好的感觉。

答案 2 :(得分:1)

您可以通过继承实现您想要的目标。

using NUnit.Framework;

namespace ClassLibrary1
{
[TestFixture]
public class TestFixtureBase
{
    [SetUp]
    public virtual void Setup()
    {
        // setup code here
    }

    [Test]
    public void CommonTest1()
    {
        Assert.True(true);
    }

    [Test]
    public void CommonTest2()
    {
        Assert.False(false);
    }
}

public class MyClassTests : TestFixtureBase
{
    [SetUp]
    public override void Setup()
    {
        base.Setup();

        // additional setup code
    }

    [Test]
    public void MyClassTest1()
    {
        Assert.True(true);
    }
}
}

答案 3 :(得分:0)

您可以编写一个从多个[Test]方法调用的方法。但我认为没有办法在多个[TestFixture]中包含相同的[Test]。

[TestFixture]
public class TestsOne{
    [Test] public void TryOne(){
        Helpers.ValidateString("Work?");
    }
}

[TestFixture]
public class TestsTwo{
    [Test] public void TryTwo(){
        Helpers.ValidateString("Work?");
    }
}

public static class Helpers{
    public static void ValidateString(string s){
        Assert.IsNotNull(s);
    }
}