NUnit атрибуты - PullRequest
       14

NUnit атрибуты

6 голосов
/ 15 июня 2011

Я использую NUnit и применяю в некоторых моих тестах атрибут категории:

[Category("FastTest")]

Это тесты, которые должны выполняться очень быстро, менее 10 секунд.поэтому я также украшаю их

[Timeout(10000)]

А теперь вопрос:

Как я могу это делать каждый раз, когда я украшаю метод с помощью [Category («FastTest»)] за кулисами оно будет автоматически украшено [Timeout (1000)] ?

Ответы [ 5 ]

3 голосов
/ 15 июня 2011

Создайте живой шаблон Resharper, который выделяет оба атрибута, например, при написании «catfast».Или купите PostSharp и пусть AOP-постшарт украшает все методы, отмеченные указанной категорией.

2 голосов
/ 15 июня 2011

Не думаю, что это очень хорошая идея.

  1. Атрибут категории, используемый для группировки тестов, а не для установки ожиданий тестов.
  2. Как другой разработчик узнает, что тесты из группы "FastTest" должны пройти в течение 10 секунд? Почему не 2 секунды? Или, может быть, 100 миллисекунд?
  3. Вы будете придерживаться фиксированного времени ожидания для всех тестов в категории. Как установить один тест на 2 секунды, другой на 10 секунд?
  4. Вы не сэкономите много времени, делая это.

Конечно, вы можете сделать это. АОП. Отражение. Но самый простой способ - сгруппировать все быстрые тесты в одном тестовом устройстве и украсить его атрибутом [Timeout].

0 голосов
/ 15 июня 2011

Visual Studio позволяет создавать пользовательских фрагментов кода , которые аналогичны шаблонам Resharper, о которых упоминает Мариус, но ничего не делают.

0 голосов
/ 15 июня 2011

Я понимаю, что вы имеете в виду / нужно, но я не думаю, что это возможно. Ожидаете ли вы, что среда IDE добавит другой атрибут, когда вы добавите один или nUnit, чтобы узнать, что такое категория, и применить определенные дополнительные атрибуты для тестов определенных категорий?

Звучит как хорошая идея, но в этом случае звучит скорее как конфигурация nUnit, а не как цепочка чисто атрибутов c #, о которой я не знаю, существует ли она.

0 голосов
/ 15 июня 2011

Создайте пользовательский атрибут FastTest, который наследуется от TimeoutAttribute. Этот атрибут затем будет влиять на свое собственное соглашение по именованию категорий. Примерно так должно работать

public class FastTestAttribyte :TimeoutAttribute
{
    protected string categoryName;

    public FastTestAttribyte (int timeout):base(timeout)
   {
       categoryName = "FastTest";
   }

    public string Name { get return categoryName; }
}

Редактировать

Это будет работать, если вы декомпилируете атрибут, вот что он делает

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple=true, Inherited=true)]
public class CategoryAttribute : Attribute
{
    // Fields
    protected string categoryName;

    // Methods
    protected CategoryAttribute()
    {
        this.categoryName = base.GetType().Name;
        if (this.categoryName.EndsWith("Attribute"))
        {
            this.categoryName = this.categoryName.Substring(0, this.categoryName.Length - 9);
        }
    }

    public CategoryAttribute(string name)
    {
        this.categoryName = name.Trim();
    }

    // Properties
    public string Name
    {
        get
        {
            return this.categoryName;
        }
    }
}

Я думаю, что Nunit будет использовать отражение для свойства Name атрибута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...