Модульное тестирование Python с помощью PyTest, застрявшее на более продвинутом тестировании

#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. Спасибо, Джонас, Это немного подтолкнуло меня в правильном направлении, но в конечном счете мне пришлось его кардинально изменить. Я исправил проблему, высмеяв весь класс с правильными переданными аргументами и просто манипулируя ответом, утверждая, что макет называется