Случайные тестовые сбои при отправке кода в Jenkins

Я спрашивал об этом и раньше, но не удовлетворен ответом.

Что я использую:

  • Работаем над сайтом Django/python.
  • Разработка сделана на Python Virtual Envs локально.
  • используя GIT в качестве моего SCM
  • отдельные виртуальные серверы, развернутые для разработчиков и производственных филиалов для GIT
  • Использование Jenkins CI для непрерывной интеграции. Отдельный виртуальный сервер развернут для Jenkins

За работой:

  • У меня есть модульные тесты, тесты дыма и интеграционные тесты для веб-сайта. Jenkins был настроен таким образом, чтобы всякий раз, когда код передавался из моей локальной ветки git в ветку Developer and Production в git repo, в Jenkins запускалась сборка.

Выпуск:

  • Мои тесты проходят локально, когда я делаю "тест python manage.py"
  • Случайные тесты (в основном модульные тесты) терпят неудачу в Jenkins, когда код передается в другие ветви (Developer и Production).
  • После сбоя теста, если я выполняю сборку вручную, нажимая кнопку "Build Now" в Jenkins, тесты обычно проходят, и сборка проходит успешно.
  • Иногда, когда в код не вносятся никакие изменения, а код по-прежнему передается в эти ветви, тесты в Jenkins случайным образом не выполняются.

Некоторые распространенные ошибки:

  • Ошибка подтверждения: 302!= 200
  • Ошибка типа: объект 'NoneType' не может быть подписан
  • IndexError: список индексов вне диапазона
  • Ошибка Assertion: datetime.datetime(2012, 12, 5, 0, 0, 27, 218397)!= Datetime.datetime (2012, 12, 5, 0, 0, 27, 239884)
  • AssertionError: Ответ перенаправлен на "x", ожидаемый "y"

Устранение неполадок до даты:

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

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

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

2 ответа

Это действительно сложный вопрос.

Возможно, есть некоторые распространенные подводные камни, с которыми сталкиваются разработчики django, но я не знаю.

Кроме того, это обычная отладка:

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

  2. Получите больше информации. Утверждения могут быть сделаны для печати пользовательских сообщений, когда они терпят неудачу. Вывести значения соответствующих переменных. Добавьте отладочные распечатки в ваш код и тесты. Посмотрите, где вещи не так, как они должны быть. Google, как использовать отладчик Python.

Сохраняйте открытость. Ошибка может быть где угодно: в оборудовании, программной среде, вашем коде или в тестовом коде. Но если вы не бог, Линус Торвальдс или Брайан Керниган, это первая безопасная гипотеза, что ошибка возникает где-то между вашей клавиатурой и спинкой вашего кресла. (И все три вышеупомянутых хакера тоже сделали ошибки)

Для проблемы - AssertionError: datetime.datetime(2012, 12, 5, 0, 0, 27, 218397)!= Datetime.datetime(2012, 12, 5, 0, 0, 27, 239884)

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

пример:

from freezegun import freeze_time
import datetime
import unittest


@freeze_time("2012-01-14")

def test():

assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
Другие вопросы по тегам