Как выглядит этот тест?
Тест состоит из 3 частей.
- устанавливает контекст
- выполняет действие
- утверждает, что действие сделало то, что должно было сделать
Как определить, какой тест лучше всего будет представлять функцию, которую вы хотите создать?
Тесты не основаны на функциях (если вы не говорите о высокоуровневой инфраструктуре, такой как cucumber ), они основаны на «единицах» кода. Обычно модуль - это функция, и вы напишите несколько тестов, чтобы утверждать, что все возможные варианты поведения этой функции работают правильно.
Может кто-нибудь привести пример?
Это действительно зависит от используемой вами структуры. Лично мой любимый это musta, который является расширением для ruby Test :: Unit framework
Вот пример из readme. В случае структуры BDD, подобной этой, контекстная настройка происходит в своем собственном блоке
class UserTest < Test::Unit::TestCase
context "A User instance" do
setup do
@user = User.find(:first)
end
should "return its full name" do
assert_equal 'John Doe', @user.full_name
end
context "with a profile" do
setup do
@user.profile = Profile.find(:first)
end
should "return true when sent #has_profile?" do
assert @user.has_profile?
end
end
end
end
Например, если я сделаю функцию кнопки выхода из системы для веб-приложения, будет ли тест попадать на страницу в поисках кнопки? или что?
Существует 3 основных типа тестов.
Сначала у вас есть модульные тесты (о чем обычно думают люди, когда вы говорите о тестировании TDD). Юнит тест тестирует одну единицу работы и ничего больше. Это означает, что если ваш метод обычно обращается к базе данных, вы убедитесь, что он фактически не обращается к этой базе данных в течение всего теста (используя технику, называемую «mocking»).
Далее у вас есть интеграционные тесты. Интеграционный тест обычно включает взаимодействие с инфраструктурой и представляет собой более "полный стек" тестирования. Итак, из вашего API верхнего уровня, если у вас есть метод вставки, вы пройдете полную вставку, а затем протестируете полученные данные в базе данных. Поскольку в таких тестах больше настроек, их не следует запускать с машин разработчиков (лучше автоматизировать их на сервере сборки)
Наконец, у вас есть тестирование пользовательского интерфейса. Это самое ненадежное решение, требующее среды сценариев пользовательского интерфейса, например Selenium или Waitr, для автоматизации щелчков по всему пользовательскому интерфейсу. Не сходите с ума от такого рода тестов, потому что эти тесты общеизвестно хрупки (небольшие изменения могут их сломать), и они в любом случае не будут улавливать целые классы проблем (например, стилизация).