используется в нескольких [TestFixture] с - PullRequest
1 голос
/ 24 августа 2010

Я в процессе настройки тестов в NUnit и у меня есть вопрос новичка.

Возможно ли иметь Test / s, которые можно использовать в нескольких [TestFixture] s?

Так [Test] ValidateString (строка bob)

Может ли быть вызван в серии различных [TestFixture]?

Ответы [ 4 ]

5 голосов
/ 24 августа 2010

Это не похоже на испытание для меня.Тесты, как правило, не содержат параметров (если вы не используете [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
}

Вы также можете добавить дополнительные тесты в каждый прибор.которые не проверяют общую функциональность и не нуждаются в повторном использовании в приборах.

2 голосов
/ 24 августа 2010

Более новая версия 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);
    }
}

Я также использовал подход наследования Анны.Одно возможное уточнение ее примера (в зависимости от личных предпочтений): не отмечать базовый класс как TestFixture, только дочерние классы.Каждый класс, помеченный вами как TestFixture, будет отображаться как набор тестов в клиенте NUnit.Вы, вероятно, никогда не захотите запускать методы базового класса напрямую, потому что ребенок предоставляет весь код установки.Если вы удалите TestFixture из базового класса, запуск недействительных тестов не будет возможным в пользовательском интерфейсе.Это позволяет вам выполнить все тесты и увидеть все зелёное ... всегда приятное чувство.

1 голос
/ 24 августа 2010

Вы можете достичь желаемого с помощью наследования.

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);
    }
}
}
0 голосов
/ 24 августа 2010

Вы можете написать метод, который будет вызываться из нескольких методов [Test]. Но я не думаю, что есть способ включить один и тот же [Test] в несколько [TestFixture] s.

[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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...