2010-12-15 6 views
6

мне просто нужно модульного тестирования некоторые методы, как это:Линии для тестирования модулей?

public void start() 
{ 
    myThread.Start(); 
} 

public void stop() 
{ 
    myThread.Abort(); 
} 

Как я могу это сделать? Я могу вызвать метод start и проверить IsAlive == true, но затем поток продолжает работать в фоновом режиме и вызывает свой собственный метод. Еще один способ - начать звонить, а затем немедленно прекратить работу, но это не изящная причина, так как я тестирую две вещи. Это так просто, но arghh!

ответ

0

Почему вам нужно модульное тестирование этих методов? Что вы пытаетесь проверить? Разве другие тесты нарушатся, если вещь, которую вы пытаетесь проверить, неверна? (IE покрыт другими тестами?)

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

2

Это хорошая идея, чтобы вещи, зависящие от времени, были синхронными для целей тестирования. (Действительно, это хорошая идея, чтобы локализовать синхронизационные взаимодействия даже при использовании без тестирования.)

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

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

1

Я согласен с BnWasteland в том, что для данного примера кода можно проверить только то, что System.Threading.Thread.Start и System.Threading.Thread.Abort работают правильно. Поэтому было бы разумно предположить, что они и сосредоточены на собственном коде приложения. Затем у вас есть два домена:

1) Код фактической задачи, выполняемой внутри потока. Это можно протестировать в обычном модульном тесте.

2) Убедитесь, что многопоточная инфраструктура работает должным образом.

(2) больше относится к категории тестирования интеграции, но никто не запрещает использовать для этого Структуру Unit-tesitng. И в этом случае хорошо сделать Start/Stop и даже делать это несколько раз с некоторыми рандомизированными рабочими нагрузками, чтобы убедиться, что система ведет себя и выполняет свою работу. Это, очевидно, входит в «более длительный» тестовый костюм, который вам не нужно будет выполнять при каждой регистрации.

6

Фокус в том, чтобы отделить асинхронное поведение от вашей логики. Обратите внимание, что ваша фактическая логика является синхронной и что асинхронная часть - это просто некоторое время ожидания между ними.

Книга xUnit Test Patterns описывает это хорошо. Это даже образец - Humble Object. Это объясняется там лучше, чем я могу.

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