Единичное тестирование: вопросы для начинающих

Я, наконец, начинаю с модульного тестирования, узнав, что я должен делать это некоторое время, но у меня есть несколько вопросов:

  • Должен или не должен я повторно тестировать родительские классы при тестировании детей, если никакие методы не были перезаписаны?
  • Концептуально, как вы тестируете представленную часть формы? Я использую PHP. ( Edit : Причина, по которой я спрашиваю об этом, заключается в том, что у меня есть класс формы высокого уровня, который генерирует форму, проверяет ее, фильтрует и генерирует любые сообщения об ошибках, беря JSON-подобный массив в качестве входных данных и делегируя их множеству меньших классов Однако я не могу проверить ошибки и т. Д., Не отправляя форму. Редактировать : похоже, это может быть ответ.)
  • Если у вас есть необязательный параметр в методе, вы должны написать тест для обоих, когда они присутствуют, а когда нет?
  • Должно ли модульное тестирование каким-либо образом сочетаться с временем выполнения кода тестирования или должно оставаться полностью отдельным?
  • Есть ли веская причина не запускать полный комплект тестов каждый раз?
  • Просто так я правильно понимаю свою терминологию, к чему относится единица в модульном тестировании? Испытуемый класс? Метод? Параметр? Что-то другое?

  • Test parent, test child; если дочерний элемент не переопределяет родительский метод, не нужно повторно протестировать его.
  • Я не уверен, что понимаю вторую. Вы можете использовать Selenium для автоматизации тестирования формы. Это то, что вы имели ввиду?
  • Тесты должны включать «счастливый путь» и все краевые случаи. Если у вас есть необязательный параметр, напишите тесты, чтобы показать правильную работу со значением, присутствующим и отсутствующим.
  • Единичные тесты, интеграционные тесты, приемочные испытания, тесты нагрузки – это разные идеи, которые могут иметь некоторое совпадение.
  • Готов поспорить, есть веские причины, но если вы делаете автоматические сборки, которые автоматически запускают тестовый пакет, почему бы вам не запустить их? Может быть, долгое время приходят на ум, но это единственная причина, о которой я могу думать. Ценность – видеть, что все они продолжают проходить, и что изменения, которые вы сделали, ничего не сломали.
  • Единичный тест для меня означает класс, который вы тестируете, который может иметь несколько методов. Я связываю их с классами, а не с формами. Формы означают UI и интеграционные тесты для меня.

(Не совсем в том же порядке, что и ваши вопросы)

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

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

  • Из Википедии: «Единица – самая маленькая проверяемая часть приложения».

Ответы на вопросы в порядке:

  • Если родительские классы уже протестированы, избегайте дублирования и просто проверяйте новые аспекты ребенка или какие-либо аспекты, которые изменил ребенок.
  • Не уверен – сделали очень мало PHP.
  • Да => проверить все аспекты метода.
  • У вас могут быть отдельные тесты, которые тестируют производительность, но они будут сосредоточены на производительности, поскольку другие могут быть сосредоточены на тестировании функциональности. Не смешивайте их в одном и том же тесте.
  • В идеале вы должны запускать их каждый раз и часто. Иногда, если время выполнения огромно, вы можете захотеть реорганизовать их на более мелкие сюиты, а затем выполнить только выполненные сюиты, когда что-то изменится, но все равно делать все периодически.

Я отвечу тем, что могу.

Должен или не должен я повторно тестировать родительские классы при тестировании детей, если никакие методы не были перезаписаны?

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

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

Да, проверьте все, что вызывает изменение в поведении.

Должно ли модульное тестирование каким-либо образом сочетаться с временем выполнения кода тестирования или должно оставаться полностью отдельным?

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

Есть ли веская причина не запускать полный комплект тестов каждый раз?

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

Просто так я правильно понимаю свою терминологию, к чему относится единица в модульном тестировании? Испытуемый класс? Метод? Параметр? Что-то другое?

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