Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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


(Michael Kurganskiy) #1

Всем привет. Хотел узнать такой вопрос, у меня есть тесты которые более менее нормально ранаются, однако иногда не понятно почему падают. Какие то глюки с таймаутом. Как бы запустить упавший тест повторно?
Я юзаю 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)

(Yuriy Rumyantsev) #2

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


(Michael Kurganskiy) #3

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


(Дмитрий Мирошник) #4

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

do
{
  boolean result = true;
  try
  {

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

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


(Mykhailo Poliarush) #5

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

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

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

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

  1. В режиме runtime проверять упал ли тест и проганять его
  2. Сохранять список упавших тестов и динамически формировать с них новый тест сьют и прогонять еще раз
  3. Использовать другие фреймворки, которые уже реализовали такую функциональность, например https://pypi.python.org/pypi/pytest-cache https://github.com/klrmn/pytest-rerunfailures

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

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