Повторный запуск упавшего теста в unittest, python, selenium

Всем привет. Хотел узнать такой вопрос, у меня есть тесты которые более менее нормально ранаются, однако иногда не понятно почему падают. Какие то глюки с таймаутом. Как бы запустить упавший тест повторно?
Я юзаю HTMLTestRunner:

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(MyForms))
    dateTimeStamp = time.strftime('%Y%m%d_%H_%M_%S')
    buf = file("../TestReport" + "_" + dateTimeStamp + ".html", 'wb')
    runner = HTMLTestRunner.HTMLTestRunner(
         stream = buf,
         title = 'PDFFiller tests', # Title of report
         description = 'Test results' # Description of report
         )
    runner.run(suite)

Может лучше выяснить причину глюков с таймаутом и проставить, где надо, Expected conditions и ожидать необходимое кол-во времени?

1 лайк

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

Хм… Может быть, что-нить типа:

do
{
  boolean result = true;
  try
  {

    <Test operations there>
  }
  catch (TimeoutException e)
  {
    result = false;
  }
}
while (!(result))

Склепал на коленке, так что работоспособность без допиливания не гарантируется :smile:
А вообще, если wait не работае(ю)т - может быть, дело в jQuery / Ajax calls на странице? Если да - погуглите selenium ajax wait - быстро найдёте скрипты, которые необходимо инжектить для того, чтобы правильно определять финиш отработки ajax запросов.

@mkurganskiy когда вы уже научитесь вставлять хорошо и красиво код, чтобы он отображался нормально? Вам стоит еще раз перечитать Ответы на вопросы - automated-testing.info

100% согласен, такого рода обходы только прикрывают проблему, а не решают ее. Лучше уж постараться и выявить причину проблемы и устранить ее, нежели делать “затычки”, которые еще тоже могут боком вылезти.

У данной библиотеке нет такой возможности. Надо хакать код, что тоже не есть очень хорошо.

В общем, есть несколько способов как это можно сделать:

  1. В режиме runtime проверять упал ли тест и проганять его
  2. Сохранять список упавших тестов и динамически формировать с них новый тест сьют и прогонять еще раз
  3. Использовать другие фреймворки, которые уже реализовали такую функциональность, например pytest-cache · PyPI GitHub - pytest-dev/pytest-rerunfailures: a pytest plugin that re-runs failed tests up to -n times to eliminate flakey failures

Но дам наводку без реализации по поводу первого пункта:

http://tungwaiyip.info/software/HTMLTestRunner_0_8_2/HTMLTestRunner.py

Вам нужно подправить метод run(self, test) и делать проверку после того, упал ли тест или нет. Если да, то перезапускать еще раз.

    def run(self, test):
        "Run the given test case or test suite."
        result = _TestResult(self.verbosity)
        test(result)
        self.stopTime = datetime.datetime.now()
        self.generateReport(test, result)
        print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)
        return result