XML-файл пуст, когда утверждения размещаются в другом потоке, чем main в pytest

#python #xml #multithreading #pytest

#python #xml #многопоточность #pytest

Вопрос:

XML-файл не обновляется, когда утверждение завершается ошибкой в потоке.

  • Версия Pytest — 5.2.1
  • Среда- Ubuntu 18.04

Привет, я написал скрипт, который проверяет, является ли утверждение истинным каждые 10 секунд и завершается ошибкой через минуту (намеренно). Сценарий выглядит следующим образом :

 import datetime
import time
from threading import Thread, Condition
DURATION = 1 # 1 minute
START_TIME = 0

class Monitoring(Thread):
    def __init__(self):
        super(Monitoring, self).__init__()

    def run(self):
        global DURATION
        while True:
            if (datetime.datetime.now() - START_TIME).seconds <= DURATION*60:
                assert 1 2 == 3, "No"
                time.sleep(10)
            else:
                assert 1 3 == 5, "oh no"
                break

def test_thread():
    global START_TIME
    START_TIME = datetime.datetime.now()
    Monitoring().start()
  

Сохраните этот скрипт под именем test_for_thread.py .
Также выполните этот скрипт следующим образом

 python3  -m pytest --junit-xml=error_report.xml test_for_thread.py
  

Вот что я получаю

 - generated xml file: /home/deepanshu/notebooks/error_report.xml -
============================== 1 passed in 0.01s ===============================
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/home/deepanshu/anaconda3/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/home/deepanshu/foglamp_workspace/csv_plugins/notebooks/test_for_thread.py", line 18, in run
    assert 1 3 == 5, "oh no"
AssertionError: oh no
assert (1   3) == 5
  

Я хотел error_report.xml должна должна быть информация о сбое. Файл создан, но в нем ничего нет. Я подозреваю, что pytest завершается, но поток продолжает выполняться. Есть ли какой-либо способ убедиться, что информация об ошибке отражена в файле xml, или, возможно, заставить pytest не завершать работу.

Приветствуется любая помощь. Заранее спасибо.

Комментарии:

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

2. Хорошо, спасибо @MrBeanBremen . Я использовал join, я смог получить ошибку в xml-файле, но тест показал, что пройден. Вариант использования фактически не поддерживается. Для ссылки на кого-то другого я также создал проблему на github .