Добавление своих полей в отчет Pytest
- пятница, 21 февраля 2020 г. в 00:27:03
import pytest
import base64
# глобальные переменные
log = { 'a':'none', 'b':'none', 'sum':'none' }
log_html = 'none'
log_img = 'none'
log_img_url = 'none'
# Функция переназначения глобальных переменных
def set_global_var(a='none',b='none',sum_='none',html='none',img='none',img_url='none'):
global log, log_html, log_img, log_img_url
log = { 'a': a, 'b': b, 'sum': sum_ }
log_html = html
log_img = img
log_img_url = img_url
# Фикстура, которая автоматически, перед каждым тестом будет сбрасывать значения глобальных переменных
@pytest.fixture(scope="function", autouse=True)
def default_global_var():
set_global_var()
def test_default():
'''Тест с параметрами по умолчанию'''
assert True
def test_1():
'''Первый тест'''
# Расчет суммы
a, b = 2, 2
sum_ = a + b
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_ )
# Проверка
assert sum_ == 4
def test_2():
'''Второй тест'''
# Расчет суммы
a, b = 3, 3
sum_ = a + b
# Добавляем html блок
html = '''
<p>
<table border="3" width="100%">
<tbody>
<tr>
<td bgcolor="#D3D3D3"><font color="black"><strong>a</strong></font></td>
<td bgcolor="#D3D3D3"><font color="black"><strong>b</strong></font></td>
<td bgcolor="#D3D3D3"><font color="black"><strong>sum</strong></font></td>
</tr>
<tr>
<td><font color="black">{0}</font></td>
<td><font color="black">{1}</font></td>
<td><font color="black">{2}</font></td>
</tr>
</tbody>
</table>
</p>
'''.format( a, b, sum_ )
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_, html = html )
# Проверка
assert sum_ == 6
def test_3():
'''Третий тест'''
# Расчет суммы
a, b = 4, 4
sum_ = a + b
# Добавляем картинку в формате base64
image = open('test-1.jpg', 'rb')
image_read = image.read()
img = base64.encodebytes( image_read ).decode("utf-8")
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_, img = img )
# Проверка
assert sum_ == 8
def test_4():
'''Четвертый тест'''
# Расчет суммы
a, b = 5, 5
sum_ = a + b
# Добавляем картинку по url
img_url = 'test-2.jpg'
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_, img_url = img_url )
# Проверка
assert sum_ == 10
def test_5():
'''Пятый тест'''
# Расчет суммы
a, b = 5, 1
sum_ = a + b
# Добавляем html блок
html = '<h1>Произвольный HTML-блок</h1>'
# Добавляем картинку в формате base64
image = open('test-1.jpg', 'rb')
image_read = image.read()
img = base64.encodebytes( image_read ).decode("utf-8")
# Добавляем картинку по url
img_url = 'test-2.jpg'
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_, html = html, img = img, img_url = img_url )
# Проверка
print ('Дополнительная информация о выполнении теста...')
assert sum_ == 6
# Запускаем серию тестов
@pytest.mark.parametrize("test_a, test_b, test_sum", [(1,2,3), (2,3,5), (4,5,8)])
def test_6(test_a, test_b, test_sum):
'''Серия шестого теста'''
# Расчет суммы
a, b = test_a, test_b
sum_ = a + b
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_ )
# Проверка
assert sum_ == test_sum
import pytest
from py.xml import html
# Создание дополнительных столбцов
def pytest_html_results_table_header(cells):
cells.insert(1, html.th('description')) # Заголовок 1-го столбца
cells.insert(2, html.th('a')) # Заголовок 2-го столбца
cells.insert(3, html.th('b')) # Заголовок 3-го столбца
cells.insert(4, html.th('sum')) # Заголовок 4-го столбца
cells.pop()
def pytest_html_results_table_row(report, cells):
cells.insert(1, html.td( report.description )) # Содержимое 1-го столбца для конкретного теста
cells.insert(2, html.td( report.a )) # Содержимое 2-го столбца для конкретного теста
cells.insert(3, html.td( report.b )) # Содержимое 3-го столбца для конкретного теста
cells.insert(4, html.td( report.sum )) # Содержимое 4-го столбца для конкретного теста
cells.pop()
# hook для перехвата и модификации данных результатов тестов
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
pytest_html = item.config.pluginmanager.getplugin('html')
outcome = yield
report = outcome.get_result()
# Добавление значений в таблицу - значения берем из атрибута __doc__ функции и глобальных переменных
report.description = str( item.function.__doc__ )
report.a = str( item.module.log['a'] )
report.b = str( item.module.log['b'] )
report.sum = str( item.module.log['sum'] )
# Добавление html и image блоков в результат - значения берем из глобальных переменных
extra = getattr(report, 'extra', [])
if report.when == 'call':
# вставляем html-блок
if item.module.log_html != 'none':
extra.append(pytest_html.extras.html( item.module.log_html ))
# вставляем img-блок (картинка будет встроена в отчет)
if item.module.log_img != 'none':
extra.append(pytest_html.extras.image( item.module.log_img, mime_type='image/jpg', extension='jpg' ))
# вставляем img-блок с url-ссылкой
if item.module.log_img_url != 'none':
extra.append(pytest_html.extras.image( item.module.log_img_url ))
report.extra = extra
# Создание дополнительных столбцов
def pytest_html_results_table_header(cells):
cells.insert(1, html.th('description')) # Заголовок 1-го столбца
cells.insert(2, html.th('a')) # Заголовок 2-го столбца
cells.insert(3, html.th('b')) # Заголовок 3-го столбца
cells.insert(4, html.th('sum')) # Заголовок 4-го столбца
cells.pop()
def pytest_html_results_table_row(report, cells):
cells.insert(1, html.td( report.description )) # Содержимое 1-го столбца для конкретного теста
cells.insert(2, html.td( report.a )) # Содержимое 2-го столбца для конкретного теста
cells.insert(3, html.td( report.b )) # Содержимое 3-го столбца для конкретного теста
cells.insert(4, html.td( report.sum )) # Содержимое 4-го столбца для конкретного теста
cells.pop()
# hook для перехвата и модификации данных результатов тестов
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
pytest_html = item.config.pluginmanager.getplugin('html')
outcome = yield
report = outcome.get_result()
# Добавление значений в таблицу - значения берем из атрибута __doc__ функции и глобальных переменных
report.description = str( item.function.__doc__ )
report.a = str( item.module.log['a'] )
report.b = str( item.module.log['b'] )
report.sum = str( item.module.log['sum'] )
# Добавление html и image блоков в результат - значения берем из глобальных переменных
extra = getattr(report, 'extra', [])
if report.when == 'call':
# вставляем html-блок
if item.module.log_html != 'none':
extra.append(pytest_html.extras.html( item.module.log_html ))
# вставляем img-блок (картинка будет встроена в отчет)
if item.module.log_img != 'none':
extra.append(pytest_html.extras.image( item.module.log_img, mime_type='image/jpg', extension='jpg' ))
# вставляем img-блок с url-ссылкой
if item.module.log_img_url != 'none':
extra.append(pytest_html.extras.image( item.module.log_img_url ))
report.extra = extra
# глобальные переменные
log = { 'a':'none', 'b':'none', 'sum':'none' }
log_html = 'none'
log_img = 'none'
log_img_url = 'none'
# Функция переназначения глобальных переменных
def set_global_var(a='none',b='none',sum_='none',html='none',img='none',img_url='none'):
global log, log_html, log_img, log_img_url
log = { 'a': a, 'b': b, 'sum': sum_ }
log_html = html
log_img = img
log_img_url = img_url
@pytest.fixture(scope="function", autouse=True)
def default_global_var():
set_global_var()
pytest test.py -v --html=report.html --self-contained-html
def test_default():
'''Тест с параметрами по умолчанию'''
assert True
def test_1():
'''Первый тест'''
# Расчет суммы
a, b = 2, 2
sum_ = a + b
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_ )
# Проверка
assert sum_ == 4
def test_2():
'''Второй тест'''
# Расчет суммы
a, b = 3, 3
sum_ = a + b
# Добавляем html блок
html = '''
<p>
<table border="3" width="100%">
<tbody>
<tr>
<td bgcolor="#D3D3D3"><font color="black"><strong>a</strong></font></td>
<td bgcolor="#D3D3D3"><font color="black"><strong>b</strong></font></td>
<td bgcolor="#D3D3D3"><font color="black"><strong>sum</strong></font></td>
</tr>
<tr>
<td><font color="black">{0}</font></td>
<td><font color="black">{1}</font></td>
<td><font color="black">{2}</font></td>
</tr>
</tbody>
</table>
</p>
'''.format( a, b, sum_ )
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_, html = html )
# Проверка
assert sum_ == 6
def test_3():
'''Третий тест'''
# Расчет суммы
a, b = 4, 4
sum_ = a + b
# Добавляем картинку в формате base64
image = open('test-1.jpg', 'rb')
image_read = image.read()
img = base64.encodebytes( image_read ).decode("utf-8")
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_, img = img )
# Проверка
assert sum_ == 8
def test_4():
'''Четвертый тест'''
# Расчет суммы
a, b = 5, 5
sum_ = a + b
# Добавляем картинку по url
img_url = 'test-2.jpg'
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_, img_url = img_url )
# Проверка
assert sum_ == 10
def test_5():
'''Пятый тест'''
# Расчет суммы
a, b = 5, 1
sum_ = a + b
# Добавляем html блок
html = '<h1>Произвольный HTML-блок</h1>'
# Добавляем картинку в формате base64
image = open('test-1.jpg', 'rb')
image_read = image.read()
img = base64.encodebytes( image_read ).decode("utf-8")
# Добавляем картинку по url
img_url = 'test-2.jpg'
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_, html = html, img = img, img_url = img_url )
# Проверка
print ('Дополнительная информация о выполнении теста...')
assert sum_ == 6
@pytest.mark.parametrize("test_a, test_b, test_sum", [(1,2,3), (2,3,5), (4,5,8)])
def test_6(test_a, test_b, test_sum):
'''Серия шестого теста'''
# Расчет суммы
a, b = test_a, test_b
sum_ = a + b
# Присваивание значений глобальным переменным
set_global_var( a = a, b = b, sum_ = sum_ )
# Проверка
assert sum_ == test_sum