Как сделать интеграционное тестирование для проекта WCF? - PullRequest
5 голосов
/ 09 февраля 2011

Я разрабатывал проект WCF, который будет предоставлять веб-сервисы (на основе HTTP), которые будут использоваться клиентами, внешними по отношению к компании. Я планирую использовать TFS 2010 для непрерывной интеграции.

Я хочу проводить непрерывную интеграцию и интеграционное тестирование.

мой вопрос:

-Проведение интеграционных тестов означает, что мне нужно создать тестовую среду, которая имитирует производственную среду? -И это означает, что мне просто нужно начать вызывать мои WCF, базу данных и другие объекты из моего инструмента модульного тестирования, не полагаясь на ложные показания? например:

[TestClass]
public class ServiceIntegrationTest
{
    private static ServiceHost serviceHost;

    [ClassInitialize]
    public static void MyClassInitialize(TestContext testContext)
    {
        serviceHost = new ServiceHost(typeof(Service1), new [] { new Uri("http://127.0.0.1:8001/") });
        serviceHost.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "Service1");
        serviceHost.Open();
    } 

-Я действительно не понимаю, как это осуществить. - Есть ли какое-нибудь учебное пособие для реальных проектов .NET (WCF) о том, как это осуществить?

1 Ответ

2 голосов
/ 09 февраля 2011

Я не эксперт в том, как правильно разбивать юнит-тестирование с помощью макетов и всего остального, но я могу поделиться своим опытом проведения интеграционного тестирования с WCF / базой данных базы данных.

По сути, мы использовали singleton для обработки всего кода запуска. Другими словами, метод MyClassInitialize будет вызывать статический метод, который будет гарантировать, что хосты / база данных службы запущены и работают. Таким образом, нам не нужно было настраивать / разбирать бэкэнд для каждого набора юнит-тестов.

[ClassInitialize]
public static void MyClassInitialize(TestContext testContext)
{
    GlobalBackend.EnsureStarted();
} 

Я не знаю ни одного примера в Интернете, вам, вероятно, придется поискать еще немного.

Что касается степени детализации ваших тестов, вы говорили об интеграционных тестах. Это звучит так, как будто вы, вероятно, хотите проверить свои сервисные вызовы, привязанные к реальной базе данных. Скажем, у вас есть некоторые функции CRUD, встроенные в ваши службы, один модульный тест (интеграционный тест в этом контексте) может создать виджет (или любой другой), а затем выполнить вызов loadWidget, чтобы убедиться, что виджет создан правильно.

Сколько тестов нужно выполнить в одном модульном тесте (в зависимости от того, проводите ли вы интеграционное тестирование или более детальное модульное тестирование) - предмет, который может заполнить многие книги.

РЕДАКТИРОВАТЬ: Вам также может потребоваться выполнить очистку / отключение базы данных / служб:

Страница MSDN в Атрибут AssemblyCleanup .

[AssemblyCleanup()]
public static void AssemblyCleanup()
{
   GlobalBackend.ShutDown();
}

Конечно, это может привести к вводу всего кода запуска:

[AssemblyInitialize()]
public static void AssemblyInit(TestContext context)
{
      GlobalBackend.EnsureStarted();
}

Так что теперь я помню более ясно - мы закончили тем, что сделали это в конце (меньше кода)

...