2013-04-25 6 views
2

Я начал стажировку, где моя работа заключается в настройке модульных тестов для некоторых проектов.Можем ли мы использовать только один ClassInitialize для всех классов Unit Testing?

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

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

Возможно ли создать ClassIniatialize(), который вызывается только один раз, когда я запускаю один или все тесты?

EDIT

All I/вам нужно это использовать AssemblyInitialize() и AssemblyCleanUp() и все будет решена,;)

+1

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

+0

Не записывайте ** решено ** int заголовок вопроса. Вы можете принять лучший ответ и, следовательно, показать всем, что он решен. – phadaphunk

+0

Но я написал «лучший ответ», предложив мне необходимые мне ... Что мне делать? – Leop

ответ

2

All I/вам нужно это использовать AssemblyInitialize() и AssemblyCleanUp() и все разрешенное,;)

0

Вы можете создать базу класса и украсить метод в этом базовом классе с атрибутом ClassInitialize.

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

+0

Я не уверен, что хорошо понимаю. Я создаю простой класс C# с параметрами, которые мне нужны для всех моих тестов (в моем случае настройка базы данных и падение базы данных), и я установил весь свой тест как унаследованный от этого класса? – Leop

0

Метод ClassInitilize будет вызываться один раз для каждого тестируемого класса. Например, вы можете реализовать его только один раз в базовом тестовом классе, но он все равно будет вызываться один раз для каждого тестового класса.

+0

Hum ...Затем мне придется создавать, заполнять и удалять все мои таблицы при каждом запуске. Это займет много времени для каждого прогона. Или я мог бы поместить все мои тесты в один класс тестов. – Leop

+0

Да, это так. Однако вы можете поэкспериментировать с атрибутом [Приоритет] (http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.priorityattribute.aspx). Но это не очень хорошее решение, я полагаю. –

1

Вы можете начать сделку по факсу TestInitialize и выполнить откат по TestCleanup. Такой подход позволит вам избежать изменений данных, которые могут возникнуть за пределами отдельных тестов.

[TestInitialize()] 
    public void Initialize() 
    { 
    //Init DB Transaction 
    } 

    [TestCleanup()] 
    public void Cleanup() 
    { 
    //Rollback DB Transaction, database returns to the initial state 
    } 

Чтобы запустить тест, вам понадобится ранее заполненная тестовая база данных.

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

Проверьте также возможность использования в памяти SQLite, будет более подходящим для тестирования доступа к базе данных, в котором используется двигатель производства db.

+0

Это может серьезно повлиять на производительность теста. –

+0

@AndreiZubov: вот почему, помимо других причин, настоящая база данных не должна использоваться на модульных тестах :) –

+0

Это то, что я уже настроил для своих тестов, но init занимает слишком много времени imo. – Leop