Зачем вам запускать модульные тесты на CI-сервере?
Конечно, к тому времени, когда что-то будет передано мастеру, разработчик уже запустил все модульные тесты и исправил все ошибки, которые могли произойти с их новым кодом. Не в этом ли смысл юнит-тестов? В противном случае они только что совершили испорченный код.
master
должен всегда быть в здравом уме, и предпочтительно автоматически развертываться при каждом слиянии с промежуточной средой для внутреннего контроля качества и тестирования.Ответы:
Или нет. Может быть много причин, почему это может произойти:
Но реальная цель - запустить тесты на машине, которая не является машиной разработчика. Тот, который настроен по-другому.
Это помогает выявить проблемы, когда тесты и / или код зависят от чего-то определенного для блока разработчика (конфигурация, данные, часовой пояс, локаль и т. Д.).
Другие веские причины для сборки CI для запуска тестов:
источник
Как разработчик, который не запускает все интеграционные и модульные тесты, прежде чем принять на себя обязательство контролировать исходный код, я предложу здесь свою защиту.
Я должен был бы построить, проверить и проверить, что приложение работает правильно на:
Добавьте в Fortran (с компиляторами как Intel, так и GNU) Python (и его различные версии в зависимости от ОС) и компоненты сценариев bash / bat, и, я думаю, вы можете видеть, что все идет по спирали
Так что мне понадобится шестнадцать машин, чтобы проводить несколько тестов пару раз в день. Это было бы почти полный рабочий день, просто чтобы управлять инфраструктурой для этого. Я думаю, что почти любой согласится, что это неразумно, особенно если умножить это на количество людей в проекте. Поэтому мы позволяем нашим CI-серверам делать свою работу.
Модульные тесты не мешают вам совершать испорченный код, они сообщают вам, если знают, что вы что-то испортили. Люди могут сказать, что «модульные тесты должны быть быстрыми», и продолжать рассказывать о принципах, шаблонах и методологиях проектирования, но в действительности иногда просто лучше позволить компьютерам, которые мы разработали для повторяющихся монотонных задач, выполнять их и участвовать в них, только если они скажи нам, что они что-то нашли.
источник
Помимо превосходного Одеда ответ:
Однажды я работал в фирме, у которой было много ошибок при развертывании из-за процесса слияния и развертывания. Это было вызвано странной пропиетической структурой, которая усложнила тестирование и КИ. Было не очень приятно, что код, который отлично работал при разработке, не попал прямо в производство.
источник
Вы бы так подумали, но разработчики - люди, и они иногда забывают.
Кроме того, разработчики часто не могут получить последний код. Их последние тесты могут работать нормально, тогда на момент регистрации кто-то другой совершает решающее изменение.
Ваши тесты могут также полагаться на локальный (непроверенный) ресурс. То, что ваши локальные юнит-тесты не подберут.
Если вы думаете, что все вышеперечисленное является причудливым, существует уровень выше CI (по крайней мере, на TFS), называемый Gated, где сборки с неудачными тестами отложены и не привязаны к базе кода.
источник
Я обычно настраиваю свой CI для запуска на каждом коммите. Ветви не объединяются в мастер, пока ветка не будет проверена. Если вы полагаетесь на выполнение тестов на master, то это открывает окно для сбоя сборки.
Выполнение тестов на CI-машине связано с воспроизводимыми результатами. Поскольку сервер CI имеет известную чистую среду, извлеченную из вашей VCS, вы знаете, что результаты теста верны. При локальном запуске вы могли бы забыть зафиксировать некоторый код, необходимый для их прохождения, или иметь незафиксированный код, который заставляет их проходить в случае сбоя.
Это также может сэкономить время разработчиков, запустив различные наборы параллельно, особенно если некоторые из них являются медленными, многоминутными тестами, которые вряд ли будут выполняться локально после каждого изменения.
На моей текущей работе наше производственное развертывание контролируется CI, проходящим все тесты. Сценарии развертывания будут препятствовать развертыванию, если они не проходят. Это делает невозможным случайно забыть запустить их.
CI, являющаяся частью рабочего процесса, также снимает с разработчиков нагрузку. Как разработчик, вы обычно запускаете линтер, статический анализатор, модульный тест, покрытие кода и интеграционный тест для каждого отдельного изменения? CI может, полностью автоматически и без необходимости думать об этом, снижая утомляемость при принятии решений.
источник
К тому времени, когда что-то будет освоено, разработчик должен уже запустить все модульные тесты ... но что, если они этого не сделали? Если вы не запустите модульные тесты на CI-сервере, вы не узнаете, пока кто-нибудь другой не извлечет изменения на своей машине и не обнаружит, что тесты только что сработали на них.
Кроме того, разработчик, возможно, допустил ошибку и сослался на локальный ресурс, специфичный для их компьютера. Когда они регистрируют код и CI не удается выполнить, проблема немедленно идентифицируется и может быть исправлена.
источник
Предполагая (вопреки другим ответам), что разработчики достаточно дисциплинированы и выполняют модульные тесты перед фиксацией, может быть несколько причин:
источник
Можно представить себе случаи, когда изменение A не нарушает тест, а изменение B не нарушает тест, но A и B вместе делают. Если A и B сделаны разными разработчиками, только CI-сервер обнаружит новую ошибку. А и В могут даже быть двумя частями одного и того же более длинного предложения.
Представьте себе поезд, которым управляют два локомотива A и B. Может быть, одного более чем достаточно, и это исправление для применения. Однако если применить два «исправления», удалив оба, поезд не будет двигаться.
Кроме того, не все разработчики запускают все модульные тесты, в то время как большинство хороших разработчиков делают.
источник
Давайте зададим эквивалентный вопрос:
Есть несколько причин для выполнения CI, но основной смысл CI - получить представление о состоянии кода с течением времени. Основное преимущество (из нескольких), которое это дает, заключается в том, что мы можем узнать, когда сборка сломалась, выяснить, что сломало ее, а затем исправить.
Если код никогда не нарушается, почему мы вообще используем CI? Чтобы доставить сборки для тестирования, ночных сборок будет достаточно.
источник