Как должны быть задокументированы модульные тесты? [закрыто

StackOverflow https://stackoverflow.com/questions/1726622

Вопрос

Я пытаюсь улучшить количество и качество тестов в моих проектах Python. Одним из трудностей, с которыми я столкнулся, по мере увеличения количества тестов, это знание того, что делает каждый тест и как он должен помочь определить проблемы. Я знаю, что часть отслеживания тестов - это лучшие имена модульных тестов (которые были адресованы в другом месте), но я также заинтересован в понимании того, как документация и модульные тестирование сочетаются вместе.

Как можно задокументировать модульные тесты, чтобы улучшить их полезность, когда эти тесты выйдут из строя в будущем? В частности, что делает хороший модульный тест Docstring?

Я бы признателен как описательные ответы, так и примеры модульных тестов с отличной документацией. Хотя я работаю исключительно с Python, я открыт для практик с других языков.

Это было полезно?

Решение

Я больше всего документирую на своих модульных тестах исключительно именем метода:

testInitializeSetsUpChessBoardCorrectly()
testSuccessfulPromotionAddsCorrectPiece()

Для почти 100% моих тестовых случаев это четко объясняет, что проверяет модульный тест, и это все, что я использую. Тем не менее, в нескольких из более сложных тестовых случаев я добавлю несколько комментариев на протяжении всего метода, чтобы объяснить, что делают несколько строк.

Раньше я видел инструмент (я полагаю, что это было для Руби), который генерировал бы файлы документации, анализируя имена всех тестовых случаев в проекте, но я не помню имя. Если у вас были тестовые примеры для класса шахматной королевы:

testCanMoveStraightUpWhenNotBlocked()
testCanMoveStraightLeftWhenNotBlocked()

Инструмент генерирует HTML DOC с содержанием что -то вроде этого:

Queen requirements:
 - can move straight up when not blocked.
 - can move straight left when not blocked.

Другие советы

Возможно, проблема не в том, как лучше написать тестирование Docstrings, а как написать тесты сами? Рефакторирование тестов таким образом, что они самостоятельно документируют, могут иметь большое значение, и ваш Docstring не станет устаревшим при изменении кода.

Есть несколько вещей, которые вы можете сделать, чтобы прояснить тесты:

  • Чистые и описательные имена методов испытаний (уже упомянутые)
  • Тестовый корпус должен быть ясным и кратким (самостоятельно документирование)
  • Абстрактно прочь сложную настройку/разрыв и т. Д. В методах
  • более?

Например, если у вас есть тест, как это:

def test_widget_run_returns_0():
    widget = Widget(param1, param2, "another param")
    widget.set_option(true)
    widget.set_temp_dir("/tmp/widget_tmp")
    widget.destination_ip = "10.10.10.99"

    return_value = widget.run()

    assert return_value == 0
    assert widget.response == "My expected response"
    assert widget.errors == None

Вы можете заменить операторы установки на вызов метода:

def test_widget_run_returns_0():
    widget = create_basic_widget()
    return_value = widget.run()
    assert return_value == 0
    assert_basic_widget(widget)

def create_basic_widget():
    widget = Widget(param1, param2, "another param")
    widget.set_option(true)
    widget.set_temp_dir("/tmp/widget_tmp")
    widget.destination_ip = "10.10.10.99"
    return widget

def assert_basic_widget():
    assert widget.response == "My expected response"
    assert widget.errors == None

Обратите внимание, что ваш метод испытаний в настоящее время состоит из ряда вызовов методов с именами, раскрывающими намерения, своего рода DSL, специфичный для ваших тестов. Такой тест все еще нуждается в документации?

Еще одна вещь, которую следует отметить, это то, что ваш метод испытаний находится в основном на одном уровне абстракции. Кто -то, читающий метод испытания, увидит, что алгоритм есть:

  • Создание виджет
  • Вызовет бег на виджет
  • Утверждение кода сделал то, что мы ожидаем

Их понимание метода испытаний не оживлено деталями настройки виджета, что является одним из уровней абстракции ниже, чем метод испытания.

Первая версия метода тестирования следует за Встроенная настройка шаблон. Вторая версия следует Метод создания а также Делегированная установка узоры.

Как правило, я против комментариев, за исключением случаев, когда они объясняют «почему» кода. Чтение дяди Боб Мартин Чистый код убедил меня в этом. Есть глава о комментариях, и есть глава о тестировании. Я рекомендую это.

Для получения дополнительной информации о лучших практиках автоматического тестирования, проверьте XUNIT Patterns.

Название метода испытаний должно точно описать, что вы тестируете. Документация должна сказать, что делает тест неудачным.

Вы должны использовать комбинацию описательных имен методов и комментариев в строке DOC. Хорошим способом сделать это является включение базовой процедуры и этапов проверки в строке DOC. Затем, если вы запускаете эти тесты из какой -то рамки тестирования, которая автоматизирует запуск тестов и собирает результаты, вы можете получить фреймворк -журнал содержимое строки DOC для каждого метода испытаний вместе с его Stdout+Stderr.

Вот основной пример:

class SimpelTestCase(unittest.TestCase):
    def testSomething(self):
        """ Procedure:
            1. Print something
            2. Print something else
            ---------
            Verification:
            3. Verify no errors occurred
        """
        print "something"
        print "something else"

Наличие процедуры с тестом значительно облегчает выяснение того, что делает тест. И если вы включите DocString с тестовым выводом, он выяснит, что пошло не так, когда проходили результаты позже намного проще. Предыдущее место, на котором я работал, сделало что -то подобное, и это сработало очень хорошо, когда произошли сбои. Мы автоматически запускали модульные тесты на каждой проверке, используя CruiseControl.

Когда тест не пройдет (что должно быть до того, как он пройдет), вы должны увидеть сообщение об ошибке и иметь возможность рассказать, что случилось. Это происходит только в том случае, если вы планируете это таким образом.

Это полностью вопрос именования тестового класса, метода испытаний и сообщения Assert. Когда тест терпит неудачу, и вы не можете сказать, что происходит из этих трех подсказок, а затем переименовать некоторые вещи или разбить некоторые занятия.

Этого не произойдет, если имя приспособления является classxtests, а имя теста - testmethodx, а сообщение об ошибке «ожидается True, возвращается false». Это признак неаккуратного теста.

Большую часть времени вам не нужно читать тест или какие -либо комментарии, чтобы узнать, что произошло.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top