我正在使用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,而不是测试用例名。根据其他建议(感谢社区),我将文件名作为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!
My 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 : 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!
如何让logger方法在不将方法移回基类的情况下动态打印测试用例的名称? 我将要编写很多测试用例,并试图找到一种更好的方法,因为在每个测试用例中创建一个logger对象是重复的
我的基类如下:
import pytest
@pytest.mark.usefixtures('setup')
class BaseClass:
pass
以下是我的解决方案:
文件
temp_test.py
:使用类名将使pytest无法识别测试用例,因此我将其重命名为TestClass
。您的函数名仍然是test_case1
。阅读有关pytest naming convention的更多信息我添加了另一个测试文件
z_test.py
:文件:
conftest.py
在
conftest.py
中,我修改了一些:logger
函数现在将具有name
参数。您的测试设置将提供此名称李>os.environ.get('PYTEST_CURRENT_TEST').split(' ')[0]
将提供安装程序的全名,在这种情况下,输出将为2021-01-27 14:00:23,436 : INFO : temp_test.py::TestClass::test_case1 : testing log!
full_name = request.module.__name__
将只提供函数名:test_case1
full_name = request.node.name
将仅提供类名:TestClass
李>我认为最好使用
PYTEST_CURRENT_TEST
env var,并使用它进行字符串操作更新您对未生成其他测试名称的评论:
setup()
需要在函数范围内,因为对于每个测试,您都希望将测试放入函数中。如果您像以前一样使用它作为class
,它将只在第一个测试函数开始时调用设置程序一次。在我的示例中,它将只输出test_case2
两次李>open('LogFile.log', 'w+')
应该是open('LogFile.log', 'a')
。模式a
将追加文本,模式w
将删除所有内容,因此只保存上一个测试用例的日志李>logFile.truncate()
还将删除除最后一个测试用例日志之外的所有内容李>我有:
玩弄这些台词,你会得到你需要的
另一个提示:在运行测试时,您需要创建一个单独的报告文件夹,其中包含日志文件,并用日期、小时、分钟等随机命名。使用像
LogFile.log
这样的通用名称会导致文本追加,也许LogFile_2021_01_28_152101.log
更好,由您选择相关问题 更多 >
编程相关推荐