allure-framework / allure-framework/allure-python

Integration with python/pytest logging functionality

Aperta
#209 4 commenti 11 reazioni 0 assegnatari Vedi su GitHub
theme:core type:enhancement
Lingua principale
Python
Stelle
814
Fork
260
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

#### I'm submitting a ...
- [x] feature request

#### What is the current behavior?
logger calls from python logging module are not shown on the report.

#### What is the expected behavior?
they be shown on the report

#### What is the motivation / use case for changing the behavior?
the report should contain as much info as possible. Log calls are very relevant information.

#### Please tell us about your environment:

- Allure version: 2.6.0
- Test framework: pytest@3.4
- Allure adaptor: allure-pytest@2.3.2b1

#### Other information

I actually have a simple working workaround for this, by defining a custom logging handler for Allure (you can use it on conftest.py or as a plugin):

```
import logging
import allure

class AllureLoggingHandler(logging.Handler):
def log(self, message):
with allure.step('Log {}'.format(message)):
pass

def emit(self, record):
self.log("({}) {}".format(record.levelname, record.getMessage()))

class AllureCatchLogs:
def __init__(self):
self.rootlogger = logging.getLogger()
self.allurehandler = AllureLoggingHandler()
def __enter__(self):
if self.allurehandler not in self.rootlogger.handlers:
self.rootlogger.addHandler(self.allurehandler)
def __exit__(self, exc_type, exc_value, traceback):
self.rootlogger.removeHandler(self.allurehandler)

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_setup():
with AllureCatchLogs():
yield

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_call():
with AllureCatchLogs():
yield

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_teardown():
with AllureCatchLogs():
yield
```

Then you can test with a simple test:

```
def test_print():
logging.info("Logging an info message")
logging.debug("Logging a DEBUG message")
logging.warning("Sample time is too low!")
raise Exception
```
It can be added for the test like this example or easily added also in the config section of a custom pytest plugin. Not sure if this could be merged into allure pytest plugin though.

It is still missing more complete formatting (module name). Also the handler log level is not dynamically adjusted as done in the pytest logging plugin, but it seems to work fine like this because pytest sets both the handler and the logger to the same level.

It even works with pytest logging switches. For instance, if we run this test with --log_level=INFO, the debug log record won't appear:

![image](https://user-images.githubusercontent.com/20566367/36359007-e2fdffc8-1516-11e8-9c81-d06b704c18f3.png)

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia esaminando i punti di integrazione di pytest e gli esempi di hookwrapper di conftest.py nell’issue, quindi traccia il modo in cui gli eventi del ciclo di vita dei test diventano dati del report Allure. Usa il logging handler fornito e il test di esempio per verificare se i record di logging Python compaiono nel report rispettando gli switch del livello di log di pytest; il lavoro è completo quando l’integrazione funziona senza un handler personalizzato.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
testing
Tipo di issue
Funzionalità
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.