2016-03-28 6 views
1

Я работаю над большим количеством интеграционных тестов в MSTest (100+ для подсистемы), и я действительно хочу группировать связанные тесты в свои собственные тестовые классы, для удобства чтения и потому, что разные для тестовых групп требуется другая настройка конфигурации.Совместное использование сервисов в тестовых классах в MSTest

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

[TestClass] 
public class IntegrationTests 
{ 
    static ServiceA serviceA = new ServiceA(); 
    static ServiceB serviceB = new ServiceB(); 

    [ClassInitialize] 
    public static void ClassInit(TestContext context) 
    { 
    /* Gets the services up and going */ 
    } 
    [TestInitialize] 
    public void TestInit() 
    { 
    /* Gets services back into good states */ 
    } 

    /* Lots and lots of Integration tests */ 

    [ClassCleanup] 
    public static void ClassCleanup() 
    { 
    /* Tear down the services */ 
    } 
} 

Проблема с этими различными группами тестирования требует, чтобы сервисы были помещены в разные состояния перед запуском тестов.

Моя первая идея состояла в том, чтобы держать статические услуги в классе общего базового тест, а затем создать новые тестовые классы, которые наследуют от базового класса для каждой тестируемой группы, например:

[TestClass] 
public class TestClassA : IntegrationTests 
{ 
    /* tests */ 
} 

[TestClass] 
public class TestClassB : IntegrationTests 
{ 
    /* tests */ 
} 

[TestClass] 
public class TestClassC : IntegrationTests 
{ 
    /* tests */ 
} 

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

Есть ли способ иметь отдельные тестовые классы, которые все используют одни и те же услуги для тестирования интеграции в MSTest?

ответ

1

Если я правильно понимаю ваш вопрос, вы можете реализовать эти службы, используя отдельный синглтон. Что-то вроде:

public class Services 
{ 
    static ServiceA _serviceA 
    static ServiceB _serviceB 
    public static ServiceA InstanceA 
    { 
    if (_serviceA == null) 
     _serviceA = new ServiceA(); 
    return _serviceA; 
    } 
    public static ServiceB InstanceB 
    { 
    if (_serviceB == null) 
     _serviceB = new ServiceB(); 
    return _serviceB; 
    } 
} 

Тогда этот класс может использоваться всеми вашими тестовыми классами.

+0

Как обычно, мне удалось ответить на мой вопрос, прежде чем кто-то еще это сделал. Решение было очень похоже на это. Внутри моего базового класса тестов я создал статический конструктор, который обрабатывал весь код инициализации. Этот метод также будет работать. – CHendrix

0

Ответ на IProgrammer будет работать, но вот решение, которое я придумал.

Я добавил статический конструктор класса базовый тест, где все услуги раскручивается, как так:

[TestClass] 
public class IntegrationTests 
{ 
    static ServiceA serviceA = new ServiceA(); 
    static ServiceB serviceB = new ServiceB(); 

    //Static constructor gets called once during the lifetime of the appdomain. 
    static IntegrationTests() 
    { 
    /* Gets the services up and going */ 
    } 
    [TestInitialize] 
    public void TestInit() 
    { 
    /* Gets services back into good states */ 
    } 

    /* Lots and lots of Integration tests */ 
} 

очистку ресурсов после того, как все тесты побежал было немного сложнее, так как C# не имеет статических деструкторов.

Однако this answer provided довольно чистый и умный обходной путь.

Вот «статический» код деструктора.

private static readonly Destructor Finalise = new Destructor(); 
private sealed class Destructor 
{ 
    ~Destructor() 
    { 
    /* Service cleanup code here */ 
    } 
} 
Смежные вопросы