2010-01-21 4 views
4

Этот вопрос связан с PHPUnit, хотя он должен быть глобальным вопросом дизайна xUnit.Разделение единиц измерения

Я пишу блок испытания для класса Image.

Один из методов этого класса - setBackgroundColor().

Есть 4 различного поведения мне нужно проверить для этого метода,

  1. Попытки установить недействительный цвет фона. Будет проверено несколько недопустимых параметров.
  2. Попытка установить допустимый цвет фона с использованием короткого массива RGB, например. array(255,255,255)
  3. Попытка установить допустимый цвет фона с использованием стандартного массива RGB, например. array('red' => 255, 'green' => 255, 'blue' => 255) (это выходной формат функции GD imagecolorsforindex())
  4. Попытка установить правильный цвет фона с помощью прозрачной постоянной IMG_COLOR_TRANSPARENT

На данный момент, я все это содержится в 1 тест в моем тесте testSetBackgroundColor(), однако я получаю ощущение, что это должно быть 4 отдельных теста, так как тест проходит довольно долго и делает много.

Мой вопрос: что мне здесь делать? Я инкапсулировать ли все это в 1 тест тестового изображения случае, или я расколоть выше, в отдельных тестах, как,

  • testSetBackgroundColorErrors
  • testSetBackgroundColorShorthandRGB
  • testSetBackgroundColorRGB
  • testSetBackgroundColorTransparent

Здесь я поставил тестовое задание http://pastebin.com/f561fc1ab.

Thank

+0

+1, хороший вопрос, хорошо написано. – Grundlefleck

ответ

7

Разделить его. Абсолютно.

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

Кстати, вы writing tests first? С TDD вряд ли закончится раздутый тест.

+0

Довольно много моих мыслей, просто хотел услышать это от кого-то другого. Приветствия. –

+0

Только что увидел ваш последний вопрос. Я делаю это неправильно с этим классом, однако я буду использовать TDD с этого момента, поскольку я вижу преимущество. –

3

Мое предпочтение состоит в том, чтобы разделить тесты, как вы описываете.

  • Это делает его более очевидным, что пошло не так, когда тест не удается, и поэтому быстрее отладить
  • Вы получаете выгоду от сброса объектов в чистом исходном состоянии между условиями испытаний
  • Это делает его легче проверить, какие тесты вы включили/опущены, просто просмотрев имена методов.
+0

Из интереса вы бы разделили следующее на два отдельных теста: один для ошибок и один для проходов, или это нормально, как один из-за dataProvider? http://pastebin.com/f5365ed9d –

+0

Это нормально, как я думаю. Использование dataprovider (AFAIUI) - это аккуратный способ автоматизации вызова одного и того же теста с несколькими входами. Он выделит, какой набор входов вызвал любую проблему, так что это удовлетворяет первым двум пунктам в моем списке. Вы также можете легко увидеть тестовый набор, поэтому я бы сказал, что он охватывает и последнюю точку. – Paolo

+0

Я надеялся, что это так. Спасибо! –

0

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

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

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

0

Да, вы должны разделить их на четыре теста. Возможно, вы неохотно, потому что это дублирует код. Я прочитал статью, в которой утверждалось, что модульные тесты должны быть очень читаемый (К сожалению, у меня нет ссылки). Далее обсуждались способы сделать это, но суть заключалась в том, чтобы написать служебные функции.

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