I am running tests using python, selenium and pytest framework with page object models.
As of now, I moved my logger method from BaseClass to conftest.py because, if I wanted to log something, I had to create a log object in each test case.
Reproducible Test case as follows:
from baseclass import BaseClass
class TestClass(BaseClass):
def test_case1(self):
self.log.info('testing log!')
def test_case2(self):
self.log.info('second log!')
I abstracted logger method into conftest.py, but when I ran the test, I got the file name in logs as setup instead of test case name. Based on other suggestions(thank you SO community), I passed the name of the file as an arg to logger() method but now it prints every log with the first test case's name only.
# Using logger(): name = inspect.stack()[0][3]
> 2021-01-27 05:42:42,377 : INFO : setup : testing log!
# Using logger(full_name), where full_name = os.environ.get('PYTEST_CURRENT_TEST').split(' ')[0]
# Similar results when using full_name = request.node.__name__ or request.module.__name__
> 2021-01-28 02:12:39,877 : INFO : test_my_page.py::TestClass::test_case1 : testing log!
> 2021-01-28 02:12:39,877 : INFO : test_my_page.py::TestClass::test_case1 : second log!
My conftest.py is setup as follows:
import pytest
from selenium import webdriver
import inspect
import logging
def logger():
log_item = logging.getLogger(name)
with open('LogFile.log', 'w+') as logFile:
logFile.seek(0)
logFile.truncate()
file_handler = logging.FileHandler("LogFile.log")
log_format = logging.Formatter("%(asctime)s : %(levelname)s : %(name)s : %(message)s")
file_handler.setFormatter(log_format)
log_item.addHandler(file_handler)
log_item.setLevel(logging.DEBUG)
return log_item
@pytest.fixture(scope='class')
def setup(request):
driver = webdriver.Chrome(executable_path=TestData.CHROME)
full_name = os.environ.get('PYTEST_CURRENT_TEST').split(' ')[0]
request.cls.log = logger(full_name)
request.cls.driver = driver
yield
driver.close()
I actually want to get the name of the tests being performed. Like below:
2021-01-27 01:57:02,594 : INFO : test_my_page.py::TestClass::test_case1 : testing log! 2021-01-27 01:57:32,292 : INFO : test_my_page.py::TestClass::test_case2 : second log!
How can I get the logger method to print the name of the test cases dynamically without moving the method back to BaseClass? I am about to write a lot of test cases, and trying to find a better way as it's repetitive to create a logger object in each test case.
My BaseClass is as below:
import pytest
@pytest.mark.usefixtures('setup')
class BaseClass:
pass