Визуальные студийные юнит-тесты и клиент-серверные программы - PullRequest
3 голосов
/ 31 мая 2011

У меня есть решение, которое является клиент-сервер. Клиент и сервер - это проекты в одном решении.

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

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

Ответы [ 6 ]

4 голосов
/ 31 мая 2011

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

Когда мне это нужно, я проектирую сервер как нечто, что я могу раскрутить из нескольких классов в любом месте (чем проще, тем лучше); затем вы можете запустить сервер в нескольких классах из набора тестов (и завершить работу). Серверное «приложение» - это просто тонкая оболочка вокруг того же набора классов.

Конечно, это зависит от того, что ты делаешь.

3 голосов
/ 31 мая 2011

Лучший подход к этому - на самом деле написать РЕАЛЬНЫЕ модульные тесты.То, что вы выполняете сейчас, считается интеграционным тестом.

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

2 голосов
/ 31 мая 2011

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

Запуск / остановка TestRun

В MSTest вы можете выполнить общую настройкуинициализация перед выполнением любого теста с использованием AssemblyInitializeAttribute .Обратите внимание, что методы должны быть статическими.

[TestClass]
public class AssemblyTestHarness
{
    [AssemblyInitialize]
    public static void InitializeAssembly(TestContext context)
    {
        // start process here
    }

    [AssemblyCleanup]
    public static void CleanupAssembly(TestContext context)
    {
        // clean-up process here
    }
}

Запуск / остановка тестового устройства

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

[TestClass]
public class MyTestFixture
{
    [ClassInitialize]
    public static void InitializeFixture(TestContext context)
    {
        // start process here
    }

    [ClassCleanup]
    public static void CleanupFixture(TestContext context)
    {
        // clean-up process here
    }
}
1 голос
/ 31 мая 2011

нет. это не модульное тестирование. Вы не должны тестировать клиент-сервер с помощью модульных тестов. Чтобы сделать это, вам нужно проверить, что сервер возвращает в ваших модульных тестах. Это способ «модульного тестирования» кода вашего клиент-сервера.

1 голос
/ 31 мая 2011

Нет необходимости запускать сервер.На самом деле, вероятно, лучше НЕ запускать его (в конечном итоге вы будете тестировать сеть и ваше приложение).

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

0 голосов
/ 31 мая 2011

Вы должны просто заглушить сервер, используя изолированную инфраструктуру, такую ​​как Moq / RhinoMock или что вы когда-нибудь предпочитаете. Модульное тестирование не должно зависеть от запуска / запуска чего-либо: вероятно, вы протестируете клиент с реальным серверным компонентом в вашей интеграцииТест.

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