@pytest.fixture(scope='function', autouse=True)
def author(request):
yield request.node.get_closest_marker('author').args[0]
def pytest_sessionfinish(session, exitstatus):
session.count_cases = []
authors = {}
for item in session.items:
author = item.get_closest_marker('author')
print("author", author)
if author:
author_name = author.args[0]
if author_name not in authors:
authors[author_name] = [item]
else:
authors[author_name].append(item)
#作者的测试用例信息保存到count_casesr fixture
session.count_cases.append(authors)
print("count_cases", session.count_cases)
@pytest.fixture(scope='session',autouse=True)
def count_cases(request):
cases = request.session.count_cases
yield cases
allure.dynamic.title(f'测试用例作者统计信息')
for case in cases:
for author_name, items in case.items():
allure.dynamic.description(f'作者: {author_name}')
allure.dynamic.description(f'用例数: {len(items)}')
allure.dynamic.description(f'用例列表:')
for item in items:
allure.dynamic.description(f'- {item.nodeid}')
该部分代码是写在conftest.py文件上,在执行测试用例时报以下错误
求求各位大佬帮忙看一下是什么问题?
错误提示是告诉你,session对象没有count_cases属性;要么就是真没有,要么就是你定义count_cases属性的方式有问题,导致没成功
session.count_cases 这个没有找到
看看在哪定义的
根据您提供的错误信息,可以看到是因为 session 对象没有 count_cases 属性导致的,具体是因为 count_cases 这个 fixture 定义在了 pytest_sessionfinish 函数中,而 pytest_sessionfinish 函数是在整个测试会话结束后才会执行的。也就是说,当执行到 count_cases fixture 的时候,session 对象并没有执行完 pytest_sessionfinish 函数,所以 session 对象上没有 count_cases 属性,就会报错。
为了解决这个问题,可以将 count_cases fixture 定义在 pytest_sessionfinish 函数的外部,或者使用 pytest_sessionfinish 函数的返回值来传递统计信息,然后在 count_cases fixture 中获取这个返回值。具体的代码修改可以参考下面的示例:
@pytest.fixture(scope='function', autouse=True)
def author(request):
yield request.node.get_closest_marker('author').args[0]
@pytest.fixture(scope='session', autouse=True)
def pytest_sessionfinish(session, exitstatus):
authors = {}
for item in session.items:
author = item.get_closest_marker('author')
if author:
author_name = author.args[0]
if author_name not in authors:
authors[author_name] = [item]
else:
authors[author_name].append(item)
# 返回统计信息
return authors
@pytest.fixture(scope='session', autouse=True)
def count_cases(request):
# 获取统计信息
cases = request.getfixturevalue('pytest_sessionfinish')
allure.dynamic.title(f'测试用例作者统计信息')
for author_name, items in cases.items():
allure.dynamic.description(f'作者: {author_name}')
allure.dynamic.description(f'用例数: {len(items)}')
allure.dynamic.description(f'用例列表:')
for item in items:
allure.dynamic.description(f'- {item.nodeid}')
# 直接返回统计信息
return cases
在上述代码中,pytest_sessionfinish 函数返回的是作者的测试用例信息,这个信息会在 count_cases fixture 中被获取并打印出来。同时,这个信息也可以在其他地方被使用。