Модульное тестирование - что не нужно тестировать - PullRequest
19 голосов
/ 22 августа 2009

Я просмотрел несколько постов по stackoverflow и множество статей о модульных тестах. Я просто пытаюсь понять, что то, что я понял, правильно.

  1. Не проверяйте ничего, что не связано с логикой. Например: если на уровне сервиса есть метод, который просто вызывает другой метод на уровне доступа к данным, не проверяйте его.

  2. Не проверять основные операции с базой данных. Если у меня есть метод в DAL, который просто вставляет объект в базу данных, скажем «public void save (Object object) {...}», и обработка объекта, полученного от уровня обслуживания, не выполняется, не проверить это.

  3. Мне не нужно проверять объекты на всех слоях. Это означает, что определенное поле в объекте должно быть не нулевым, например, emailId в User Object, и это проверено и проверено в JSP (с использованием JS), мне не нужно проверять, как ведет себя метод DAL, если он получает emailId = NULL, потому что в идеале этого не должно быть, и JS должен позаботиться об этом.

Что еще я не должен тестировать?

Ответы [ 9 ]

17 голосов
/ 23 августа 2009

Я не уверен, что могу согласиться с любым исключениями, которые вы упомянули в своем ответе.

Методы без логики

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

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

public void Save(Entity entity)
{
    this.repository.Save(entity);
}

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

Помните: простые вещи не гарантируют, что они останутся простыми.

Не тестирует операции с базой данных

Считаете ли вы несущественным, правильно ли хранятся данные в базе данных? Если вам действительно, по-настоящему, все равно, то вам не нужно проверять это - иначе вы делаете.

Если вы не тестируете работу своей базы данных, как вы узнаете, что ваш компонент доступа к данным работает?

Я не говорю, что вы должны проверить свою библиотеку ORM, но вы должны проверить, правильно ли она используется.

Не тестирование объекта во всех слоях

Я не уверен, что вы имеете в виду под этим вопросом, но если поле может быть нулевым, и это проблема, вам нужно проверить, что происходит, когда оно фактически нулевое - везде.

Гораздо предпочтительнее спроектировать API так, чтобы значения гарантированно не были нулевыми.

Заключение

Вы должны проверить все, что вы можете проверить. Без исключений. Простые вещи не остаются простыми, и вы должны быть в состоянии убедиться, что код, который когда-то работал, продолжает работать.

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

Разработка через тестирование (TDD) - лучший способ обеспечить это.

6 голосов
/ 22 августа 2009

Не проверяйте ничего, что не может дать сбой.

Но больше к вашим очкам.

  1. Все зависит от того, что вы подразумеваете под логикой. Я взял этот подход на картографическом слое. Я не тестировал весь скучный код, который копировал значения свойств из объекта A в объект B. Вставка неудачной копии, и я дублировал копию и пропустил другую. Большая проблема. Но стоил ли весь этот дополнительный тестовый код? Зависит от того, что происходит при сбое приложения. В этом случае стоило бы проверить код.

  2. Аналогично первому пункту. Так что Save - это хорошо и просто, но откуда вы знаете, что правильно сделали простые вещи. Запутать это так же плохо, как и неправильно понять немного бизнес-логики.

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

Тестирование - это балансирование. Если вы по-настоящему протестируете все это, вы можете больше ничего не делать. Но если вы не тестируете это достаточно, вы тратите все свое время на исправление ошибок. Где эта точка баланса меняется. Разные типы проектов имеют разные затраты на провал. В некоторых проектах, таких как проект с пониманием внутренних пользователей, вы можете быстро и свободно работать, но как долго? В конце концов непроверенный код ломается, нужно время, чтобы найти, и вы ничего не делаете.

Лучше всего следовать истинному TDD. Не проверяйте ради проверки. Тест как метод дизайна. Тестируйте, потому что он вытесняет слабосвязанный код. Тест, потому что выполнение кода в двух контекстах (тест и приложение) делает код лучше. Как только вы идете по пути TDD, вы не спрашиваете, что вы должны и не должны проверять. Тестирование становится частью написания кода, а не самостоятельной деятельностью.

3 голосов
/ 22 августа 2009

Простой ответ - ничего

Сложный ответ - вы не должны проверять вещи, на которые у вас нет времени. Тестирование основывается на сложном планировании необходимых и доступных тестов, расставленных по приоритетам для наиболее важных частей и рабочих процессов программной системы. Чем больше времени уходит на тестирование, тем больше тестов можно проверить.

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

См. ITSQB для более подробной информации по этой теме

1 голос
/ 17 октября 2013

Не тестируйте модуль .NET framework. Я имею в виду, что не проверяйте вещи, которые являются ответственностью Microsoft.

Например, не пытайтесь тестировать сеттеры и геттеры - если только там нет кода.

1 голос
/ 23 августа 2009

Обычно, если возможно, я бы выбрал стиль TDD. Это очень трудно достичь и требует много дисциплины, но если у вас есть, вы никогда не захотите вернуться. Кстати, TDD - это не только тестирование, но и разработка программного обеспечения (его также можно назвать Test-Driven-Design). Ваш дизайн развивается в соответствии с вашими тестами.

Марк дал довольно хороший ответ на ваши утверждения о том, что НЕ ПРОВЕРИТЬ.

Мне не нужно проверять объекты в все слои. Это означает определенное поле в объекте должно быть не нуль, скажем emailId в пользовательском объекте, и это проверено и подтверждено на JSP (используя JS), мне не нужно тестировать как ведет себя метод DAL, если он получает emailId = NULL, потому что в идеале это не должно, и это должно быть заботится JS.

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

0 голосов
/ 23 августа 2009

Я не единица - проверяю что-либо, потому что вместо этого я хочу, чтобы интеграция и / или система тестировала:

  • Обложка код
  • Быть автоматизированным
  • Используется в качестве модульных тестов и должен быть таким же полезным, как и *

Подробнее см. Следует ли тестировать внутреннюю реализацию или только публичное поведение?

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

a) Что вообще не будет проверено интеграцией и / или тестированием системы (и если нет, то почему бы и нет?)

b) Или которые по какой-либо причине должны быть проверены до интеграции / тестирования системы (возможно, из-за того, как разработка вашего проекта разделена между несколькими разработчиками параллельно)

0 голосов
/ 22 августа 2009

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

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

0 голосов
/ 22 августа 2009

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

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

Именно по этой причине вам следует использовать такой инструмент, как NCover , чтобы убедиться, что 100% кода выполняется в модульных тестах!

0 голосов
/ 22 августа 2009

Подождите, под JS вы имеете в виду JavaScript? Я полагаю, вы имеете в виду проверку на стороне клиента? Вы никогда не должны предполагать, что клиент проверяет что-либо при создании сайта. JavaScript можно отключить, страницы можно изменить или подделать и т. Д.

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