allure-framework / allure-framework/allure-python

allure-pytest raises an exception when writing to log from a thread started inside pytest_generate_tests

未关闭
#757 2 条评论 1 个 reaction 已指派 0 人 在 GitHub 查看
bug theme:core theme:pytest
主要语言
Python
星标
814
派生
260
PR 合并指标
30 天内没有已合并 PR

描述

#### I'm submitting a ...
- [x] bug report

#### What is the current behavior?
I have a function that creates a thread which writes some information in the log. When I try to call it from `pytest_generate_tests` allure-pytest raises the following `StopIteration` exception:
```
platform linux -- Python 3.9.16, pytest-7.4.0, pluggy-1.2.0
rootdir: /mnt/c/storage/allure_bug
plugins: allure-pytest-2.13.2
collecting ... Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.9/threading.py", line 980, in _bootstrap_inner
self.run()
File "/usr/lib/python3.9/threading.py", line 917, in run
self._target(*self._args, **self._kwargs)
File "/mnt/c/storage/allure_bug/conftest.py", line 17, in _thread
log.warning('thread')
File "/usr/lib/python3.9/logging/init.py", line 1458, in warning
self._log(WARNING, msg, args, **kwargs)
File "/usr/lib/python3.9/logging/init.py", line 1589, in _log
self.handle(record)
File "/usr/lib/python3.9/logging/init.py", line 1599, in handle
self.callHandlers(record)
File "/usr/lib/python3.9/logging/init.py", line 1661, in callHandlers
hdlr.handle(record)
File "/usr/lib/python3.9/logging/init.py", line 952, in handle
self.emit(record)
File "/mnt/c/storage/allure_bug/conftest.py", line 9, in emit
with step(f'[{record.levelname}] {record.getMessage()}'):
File "/tmp/test_venv/lib/python3.9/site-packages/allure_commons/_allure.py", line 179, in enter
plugin_manager.hook.start_step(uuid=self.uuid, title=self.title, params=self.params)
File "/tmp/test_venv/lib/python3.9/site-packages/pluggy/_hooks.py", line 433, in call
return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
File "/tmp/test_venv/lib/python3.9/site-packages/pluggy/_manager.py", line 112, in _hookexec
return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
File "/tmp/test_venv/lib/python3.9/site-packages/pluggy/_callers.py", line 116, in _multicall
raise exception.with_traceback(exception.traceback)
File "/tmp/test_venv/lib/python3.9/site-packages/pluggy/_callers.py", line 80, in _multicall
res = hook_impl.function(*args)
File "/tmp/test_venv/lib/python3.9/site-packages/allure_pytest/listener.py", line 48, in start_step
self.allure_logger.start_step(None, uuid, step)
File "/tmp/test_venv/lib/python3.9/site-packages/allure_commons/reporter.py", line 128, in start_step
parent_uuid = parent_uuid if parent_uuid else self._last_executable()
File "/tmp/test_venv/lib/python3.9/site-packages/allure_commons/reporter.py", line 71, in _last_executable
for _uuid in reversed(self._items):
File "/tmp/test_venv/lib/python3.9/site-packages/allure_commons/reporter.py", line 39, in reversed
return self.thread_context.reversed()
File "/tmp/test_venv/lib/python3.9/site-packages/allure_commons/reporter.py", line 21, in thread_context
uuid, last_item = next(reversed(self._thread_context[self._init_thread].items()))
StopIteration
collected 1 item

test_bug.py test
.
```

#### If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem
1. Install requirements `pip install pytest allure-pytest`
2. Prepare the demo test suite:

conftest.py
```python
import logging
from threading import Thread

from allure import step

class AllureLoggerHandler(logging.Handler):
def emit(self, record):
with step(f'[{record.levelname}] {record.getMessage()}'):
pass

log = logging.getLogger()
allure_handler = AllureLoggerHandler()
log.addHandler(allure_handler)

def _thread():
log.warning('thread')

def pytest_generate_tests(metafunc):
log.info('generate')
thread = Thread(target=_thread)
thread.start()
thread.join(100)
```
test_bug.py
```python
def test_allure_log():
print('test')
```
3. Run test: `pytest -s --alluredir=./allure`

#### What is the expected behavior?
Test suite works without any exceptions

#### What is the motivation / use case for changing the behavior?

#### Please tell us about your environment:

- Allure version: 2.22.0
- Test framework: pytest 7.4.0
- Allure adaptor: allure-pytest 2.13.2

#### Other information

[//]: # (
. e.g. detailed explanation, stacktraces, related issues, suggestions
. how to fix, links for us to have more context, eg. Stackoverflow, Gitter etc
)

贡献指南

打开贡献指南

调研方向

使用 conftest.py 和 test_bug.py 示例重现该失败,从 pytest_generate_tests 和线程化日志处理器开始。跟踪回溯中显示的 Allure 步骤创建过程,并验证线程上下文的行为。当示例使用 pytest -s --alluredir=./allure 运行且不出现 StopIteration 异常时,即视为完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
testing
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。