Написание кода, проверяемого модулем? - PullRequest
37 голосов
/ 17 июня 2009

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

Ответы [ 19 ]

4 голосов
/ 17 июня 2009

Маленькие, очень сплоченные методы. Я изучаю это трудным путем. Представьте, что у вас есть публичный метод, который обрабатывает аутентификацию. Может быть, вы сделали TDD, но если метод большой, отладку будет сложно. Вместо этого, если этот метод #authenticate делает вещи более псевдокодовым способом, вызывая другие небольшие методы (возможно, защищенные), когда обнаруживается ошибка, легко написать новые тесты для этих небольших методов и найти неисправный.

4 голосов
/ 17 июня 2009

Самый простой способ - не проверять свой код, если вы не проверяете его с помощью тестов.

Я не большой поклонник написания тестов первым. Но я убежден в том, что код должен проверяться в с помощью тестов. Даже час или около того, вместе . Я думаю, что порядок, в котором они написаны, менее важен, если они входят вместе.

3 голосов
/ 17 июня 2009

Я использую Test-Driven Development, когда это возможно, поэтому у меня нет любого кода, который не может быть протестирован модулем. Он не существовал бы, если бы сначала не существовал модульный тест.

3 голосов
/ 17 июня 2009
1.Using a framework/pattern like MVC to separate your UI from you
business logic will help a lot. 
2. Use dependency injection so you can create mock test objects.
3. Use interfaces.
2 голосов
/ 18 июня 2009

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

1 голос
/ 17 июня 2009

Нет статики - вы не можете смоделировать статику.

Также в Google есть инструмент, который будет измерять тестируемость вашего кода ...

1 голос
/ 17 июня 2009

Я постоянно пытаюсь найти процесс, в котором модульное тестирование не является рутинным занятием и чем-то, что я на самом деле ХОЧУ делать. По моему опыту, довольно важным фактором являются ваши инструменты. Я много работаю над ActionScript, и, к сожалению, инструменты несколько ограничены, например, нет интеграции IDE и нет более продвинутых структур для насмешек (но хорошие вещи не за горами, так что здесь никаких претензий!). Раньше я занимался разработкой на основе тестов с более зрелыми средами тестирования, и это был определенно более приятный опыт, но он все еще казался чем-то вроде рутины.

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

Теперь, однако, я начинаю с написания интерфейсов, почти независимо от того, что я собираюсь делать. Сначала я, конечно, пытаюсь определить проблему и найти решение. Затем я начинаю писать интерфейсы, чтобы получить некое абстрактное представление о коде и коммуникации. В этот момент я обычно осознаю, что на самом деле я не нашел правильного решения проблемы из-за того, что не до конца понял проблему. Поэтому я возвращаюсь, пересматриваю решение и пересматриваю свои интерфейсы. Когда я чувствую, что интерфейсы отражают мое решение, я фактически начинаю с написания реализации, а не тестов. Когда у меня что-то реализовано (черновой вариант реализован, обычно детские шаги), я начинаю его тестировать. Я продолжаю возвращаться между тестированием и внедрением, делая несколько шагов вперед за раз. Поскольку у меня есть интерфейсы для всего, вставлять макеты невероятно легко.

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

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

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

1 голос
/ 17 июня 2009

Чтобы подготовить код для тестирования:

  • Документируйте свои предположения и исключения.
  • Избегайте больших сложных классов, которые выполняют больше чем одно - помните принцип единственной ответственности .
  • Когда это возможно, используйте интерфейсы, чтобы отделить взаимодействия и позволить вводить фиктивные объекты.
  • По возможности, делайте публичный метод виртуальным, чтобы позволить имитируемым объектам эмулировать их.
  • По возможности, используйте композицию, а не наследование в своих проектах - это также способствует (и поддерживает) инкапсуляцию поведения в интерфейсах.
  • По возможности, используйте библиотеки внедрения зависимостей (или практики DI) для предоставления экземплярам своих внешних зависимостей.

Чтобы получить максимальную отдачу от ваших модульных тестов, учтите следующее:

  • Обучите себя и свою команду разработчиков возможностям инфраструктуры модульного тестирования, библиотекам-макетам и инструментам тестирования, которые вы намереваетесь использовать. Понимание того, что они могут и не могут сделать, будет крайне важно, когда вы начнете писать свои тесты.
  • Планируйте свои тесты до того, как начнете их писать. Определите крайние случаи, ограничения, предварительные условия, постусловия и исключения, которые вы хотите включить в свои тесты.
  • Исправьте сломанные тесты как можно ближе к тому моменту, когда вы их обнаружите. Тесты помогут вам обнаружить дефекты и потенциальные проблемы в вашем коде. Если ваши тесты не пройдены, вы открываете дверь для того, чтобы исправить некоторые вещи позже.
  • Если вы следите за процессом проверки кода в вашей команде, проверяйте также и ваши модульные тесты. Модульные тесты являются такой же частью вашей системы, как и любой другой код - обзоры помогают выявлять слабые места в тестах так же, как и системный код.
0 голосов
/ 21 июня 2009

Вам не обязательно «делать свой код более дружественным для модульного тестирования».

Вместо этого можно использовать насмешливый инструментарий для устранения проблем с тестируемостью. Одним из таких инструментов является JMockit .

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