【发布时间】:2021-04-30 20:06:10
【问题描述】:
我正在使用带有页面对象模型的 python、selenium 和 pytest 框架运行测试。
到目前为止,我将 logger 方法从 BaseClass 移到了 conftest.py,因为如果我想记录一些东西,我必须在每个测试用例中创建一个 log 对象。
可重现的测试用例如下:
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!')
我将 logger 方法抽象到 conftest.py 中,但是当我运行测试时,我在日志中获得了文件名作为 setup 而不是测试用例名称。根据其他建议(感谢 SO 社区),我将文件名作为 arg 传递给 logger() 方法,但现在它只打印第一个测试用例名称的每个日志。
# 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!
我的 conftest.py 设置如下:
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()
我实际上想获得正在执行的测试的名称。如下:
2021-01-27 01:57:02,594:信息:test_my_page.py::TestClass::test_case1:测试日志! 2021-01-27 01:57:32,292:INFO:test_my_page.py::TestClass::test_case2:第二个日志!
如何在不将方法移回 BaseClass 的情况下让 logger 方法动态打印测试用例的名称? 我即将编写大量测试用例,并试图找到一种更好的方法,因为在每个测试用例中重复创建一个记录器对象。
我的 BaseClass 如下:
import pytest
@pytest.mark.usefixtures('setup')
class BaseClass:
pass
【问题讨论】:
-
@MrBeanBremen 感谢您提出类似的问题,但这并不能解决我在所有日志中出现相同测试名称的问题。据我了解,conftest.py > setup() 在测试开始时只运行一次,动态获取测试用例名称一直是一个挑战。
-
对,您的
setup具有类范围,因此您不会从请求中获得名称 - 我错过了,抱歉。但是也有一个使用环境变量的答案(也如下面的答案所示),所以它可能仍然对您有所帮助。 -
@MrBeanBremen 我尝试使用下面提到的 Pytest 环境变量,但仍然有这个问题。我看到您建议的另一个问题的可能解决方案,从 dir 中提取所有名称: test_names = [n for n in dir(self) if n.startswith('test_')] 但是,我认为这不是最好的解决方案到此为止。
标签: python python-3.x selenium logging pytest