Этот вопрос является более или менее агностическим языком программирования. Однако, поскольку я в основном в Java в эти дни, где я буду рисовать свои примеры. Я также думаю о случае ООП, поэтому, если вы хотите протестировать метод, вам нужен экземпляр этого класса методов.
Основное правило для модульных тестов заключается в том, что они должны быть автономными, и это может быть достигнуто путем изоляции класса из его зависимостей. Существует несколько способов сделать это, и это зависит от того, вводите ли вы свои зависимости с помощью IoC (в мире Java мы имеем Spring, EJB3 и другие фреймворки/платформы, которые предоставляют возможности впрыска) и/или если вы издеваетесь над объектами (для Java у вас JMock и EasyMock), чтобы отделить проверяемый класс от его зависимостей.
Если нам нужно проверить группы методов в разных классах * и убедиться, что они хорошо интегрированы, напишите тесты интеграции. И вот мой вопрос!
- Как минимум в веб-приложениях, состояние часто сохраняется в базе данных. Мы могли бы использовать те же инструменты, что и для модульных тестов для обеспечения независимости от базы данных. Но по моему скромному мнению, я думаю, что бывают случаи, когда не использовать базу данных для тестов интеграции слишком много насмехается (но не стесняйтесь не соглашаться, а не использовать базу данных вообще, когда-либо, также является верным ответом, поскольку это делает вопрос неуместным).
- Когда вы используете базу данных для тестов интеграции, как вы заполняете эту базу данных данными? Я вижу два подхода:
- Сохраните содержимое базы данных для теста интеграции и загрузите его перед началом теста. Если он хранится как дамп SQL, вам будет интересно узнать файл базы данных, XML или что-то еще.
- Создайте необходимые структуры базы данных по вызовам API. Эти вызовы, вероятно, разделены на несколько методов в вашем тестовом коде, и каждый из этих методов может завершиться неудачей. Это можно рассматривать как ваш тест интеграции, имеющий зависимости от других тестов.
Как вы убедитесь, что данные базы данных, необходимые для тестирования, существуют, когда вам это нужно? И почему вы выбрали метод, который вы выберете?
Пожалуйста, предоставьте ответ с мотивацией, так как это в мотивации интересная часть. Помните, что просто сказал: "Это лучшая практика!" это не настоящая мотивация, она просто повторяет то, что вы читали или слышали от кого-то. В этом случае, пожалуйста, объясните, почему это наилучшая практика.
* Я включаю один метод, вызывающий другие методы в (тех же или других) экземплярах одного и того же класса в моем определении unit test, хотя это может быть технически неверным. Не стесняйтесь исправлять меня, но пусть это будет проблемой.