#python #unit-testing #pytest
Вопрос:
Я уже некоторое время использую PyTest для написания нескольких простых тестов (например, тех, которые вы найдете в учебных пособиях и видео на YouTube), и я подумал, что теперь пришло время начать писать реальный тест для наших скриптов на python. Сценарии намного более продвинуты, чем любые, показанные в учебниках, поэтому я немного застрял. Мне нужен не весь правильный ответ, а скорее толчок в правильном направлении, если это возможно. Вот в чем моя проблема:
У нас есть скрипт, который считывает текстовый файл .md и преобразует его в файл pdf на основе внешнего шаблона. Часть сценария находится здесь ниже (я удалил большую его часть, потому что сначала я просто хочу, чтобы у меня был 1 запущенный тест).
class DocumentationEngine:
def __init__(self, title, subtitle, series, style='TIIStyle_Digital_Aug_2020', templateFile='template.docet', tableOfContents=True, listOfFigures=False, listOfTables=False):
self.title = title
self.subtitle = subtitle
self.series = series
self.style = style
self.template = {}
self.hasTOC = tableOfContents
self.hasLOF = listOfFigures
self.hasLOT = listOfTables
self.loadTemplate(templateFile)
def loadTemplate(self, file='template.docet'):
with open(file, "r") as templatefile:
lines = templatefile.readlines()
key = "dummy"
value = ""
for line in lines:
line = line.strip()
if line.startswith('[') and line.endswith(']'):
self.template[key] = value
key = line[1:-1]
value = ""
else:
value = line 'n'
def build(self, versions=[], content='', filename='Documenter\_Autogenerated'):
document = self.template["doc"]
document = document.replace("%%style%%", self.style)
document = document.replace("%%body%%",
self.buildFirstPage()
self.buildTableOfContents()
self.buildListOfFigures()
self.buildListOfTables()
self.buildVersionTable(versions, filename)
self.buildContentPages(content=content)
self.buildLastPage()
)
return document
def buildLastPage(self):
return self.template["last_page"]
Я пытаюсь написать простой модульный тест для метода buildLastPage и застрял уже несколько дней.
Я не уверен, нужно ли мне издеваться над файлом шаблона, использовать приспособление и/или действительно ли я могу протестировать только этот метод со всеми зависимостями.
Я начал со следующего:
from doceng import DocumentationEngine
import pytest
class Test:
def test_buildLastPage(self):
build_last_page = DocumentationEngine()
assert build_last_page.template(1) == 1
что дает мне ошибку относительно 3 обязательных аргументов. При добавлении аргументов, подобных этому:
from doceng import DocumentationEngine
import pytest
class Test:
def test_buildLastPage(self, title, subtitle, series):
build_last_page = DocumentationEngine()
assert build_last_page.template(1) == 1
что дает мне ошибку, что прибор не найден.
Я добавил приспособление в conftest.py файл, подобный этому:
import pytest
from doceng import DocumentationEngine
@pytest.fixture
def title(title):
return title("test")
что приведет меня к еще одной ошибке, обнаружена рекурсивная зависимость, связанная с «названием» приспособления
Я совсем застрял, так что любой толчок в правильном направлении для новичка будет высоко оценен
Ответ №1:
Ошибка светильников связана с вашей тестовой функцией test_buildLastPage
. То, как вы его используете, требует только self
аргументации.
Тестовая функция в pytest без каких-либо декораторов всегда ожидает найти приспособления, которые имеют то же имя, что и аргументы. Вы не определили никаких приспособлений, а также не используете аргументы в своей функции. Поэтому вы можете безопасно удалить их.
Фактические точки ошибок DocumentationEngine()
. Класс ожидает 3 аргумента при инициализации объекта. Вы не приводите никаких аргументов. Проверьте свою __init__
функцию еще раз, чтобы найти правильные аргументы.
Комментарии:
1. Спасибо, Джонас, Это немного подтолкнуло меня в правильном направлении, но в конечном счете мне пришлось его кардинально изменить. Я исправил проблему, высмеяв весь класс с правильными переданными аргументами и просто манипулируя ответом, утверждая, что макет называется