2016-04-21 2 views
3

Ситуация: Некоторые из моих классов тестов интеграции используют общий подход к настройке сценариев в базе данных, поэтому я предоставляю абстрактный базовый класс. Он также берет на себя полную очистку данных в конце после того, как все тесты гласил:Несколько атрибутов ClassCleanup для каждого тестового класса

public abstract class IntegrationTests 
{ 
    ... 
    protected static void Cleanup() { ... } 
} 

Мои наследственные классы, необходимые для вызова метода базового для того, чтобы моя база очистки код работает:

[TestClass] 
public class FooIntegrationTests : IntegrationTests 
{ 
    ... 

    [ClassCleanup] 
    public static void FooCleanup() 
    { 
     ... 
     Cleanup(); 
    } 
} 

Выпуск: Согласно MSDN «[1] один метод в классе может быть украшен атрибутом [ClassCleanup]», поэтому я не могу украсить метод Cleanup из базового класса, и даже если бы этот метод не получил, называется.

Вопрос: Я хочу, чтобы решение, которое

  • всегда запускает Cleanup метод базового класса без реализации ничего унаследованных классов, и
  • всегда работает метод пользовательских очистки от наследуя тестовый класс, если он есть.

Мне не нравится принуждать наследующий тестовый класс к явному вызову базового класса, поскольку я должен помнить о его реализации. Я предпочел более элегантный, но простой (!) Метод. Есть идеи?

Примечание: Обеспечение одиночного элемента для моей базовой функциональности, которое должно использоваться всеми тестовыми классами, не работает, потому что параллельно я запускаю свои тесты на нескольких тестовых агентов, которые все подключены к одному экземпляру базы данных.

+0

Атрибут 'ClassCleanup' может быть назначен только статическим методам. Ключевые слова 'virtual' и' override' могут использоваться только для методов экземпляра. –

+0

А, правильно, я думал о обычной установке/разрыве. Извиняюсь. –

+0

Статический метод/класс нарушает обычные правила наследования. Так что нет, я не уверен, что вы можете здесь сделать, кроме вызова Cleanup из вашего класса наследования. –

ответ

0

Основываясь на ответах на комментарии, когда вызов ClassCleanup больше не воспроизводится.

Я делаю это все время в своей работе. Все, что вам нужно сделать, это также привязать базовый класс к тестовому классу и «провести» свои атрибуты очистки и разрыва. Если вам нужен очистка/демонтаж в производном классе, просто сделать виртуальный метод, который вы можете ovveride всякий раз, когда вы нуждаетесь в них:

[TestClass] 
public abstract class BaseIntegrationTest 
{ 
    [TestInitialize] 
    public void BeforeEach() { 
     // Stuff that should happen before each unit test 

     BaseTestInitialize(); 
    } 

    [TestCleanup] 
    public void AfterEach(){ 
     // Stuff that should happen after each unit test 

     BaseTestCleanup(); 
    } 

    public virtual void BaseTestInitialize() { } 
    public virtual void BaseTestCleanup() { } 
} 

С помощью этой конструкции, все, что вам нужно сделать в тесте интеграционного переопределить BaseTestCleanup():

[TestClass] 
public class DerivedTestClass : BaseIngetrationTest 
{ 
    public override void BaseTestCleanup() 
    { 
     // Derived cleanup 
     base.BaseTestCleanup(); 
    } 


    [TestMethod] 
    public void SomeMethod_SomeCriteria_SomeResult() 
    { 
     // Arrange 

     // Act 

     // Assert 
    } 
} 
+0

Это отличная идея, если вам нужна инициализация и/или очистка для каждого теста. К сожалению, этот подход вызывает серьезные проблемы с производительностью для тестов * интеграции *: интенсивно настраивать и очищать сценарии данных, и это десятки или сотни раз в классе слишком дорого. –

+0

Я обычно отмечаю тесты интеграции с тестовой категорией, поэтому они работают только ночью и, конечно, всякий раз, когда кто-то работает с ними. Я никогда не делаю тестов, которые вносят IO (включая диск) в мою непрерывную интеграцию. –

+0

Мы делаем то же самое: интеграционные тесты выполняются только два раза в день плюс по запросу. Тем не менее, установка данных может стоить много секунд - тестовые комплекты будут работать в течение нескольких часов, которые мы должны были обновить и удалить сценарии для каждого отдельного теста. –

Смежные вопросы