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

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

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

Ответ 1

  • Проверить родительский, тестовый ребенок; если дочерний элемент не переопределяет родительский метод, не нужно повторно протестировать его.
  • Я не уверен, что понимаю вторую. Вы можете использовать Selenium для автоматизации тестирования формы. Это то, что вы имеете в виду?
  • Тесты должны включать "счастливый путь" и все крайние случаи. Если у вас есть необязательный параметр, напишите тесты, чтобы показать правильную работу со значением, присутствующим и отсутствующим.
  • Единичные тесты, интеграционные тесты, приемочные тесты, тесты нагрузки - это разные идеи, которые могут иметь некоторое совпадение.
  • Готов поспорить, есть веские причины, но если вы делаете автоматические сборки, которые автоматически запускают тестовый пакет, почему бы вам не запустить их? Может быть, долгое время приходят на ум, но это единственная причина, о которой я могу думать. Значение показывает, что все они продолжают проходить, и что изменения, которые вы сделали, ничего не сломали.
  • Unit test для меня означает класс, который вы тестируете, который может иметь несколько методов. Я связываю их с классами, а не с формами. Forms означает UI и интеграционное тестирование для меня.

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

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

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

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

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