Рубрики
Без рубрики

Тестирование и тестовое развитие – почему?

Иногда линии могут быть размыты. Иногда мы можем удивиться, почему даже тестировать вообще? Это пустая трата времени? Помечено Python, TDD, издевательства.

Я частью группы здесь, в Нашвилле, называемом Пенни Университетом. По сути, это пользовательская группа «Open-Door», которая связывает людей, желающих учиться людям, желающим учить. Обычно через обед, кофе или завтрак. Я предложил встретиться с несколькими людями, желающими узнать больше о развитии тестирования, ранее, и он быстро стал горячей темой. Меня попросили организовать еще одно круглого столовую дискуссию о TDD, и именно так он пошел. Это не было обзором синтаксиса кода низкого уровня, но общая дискуссия с участием великолепных тем, таких как:

  • (Иногда) невидимые преимущества
  • Типичные рабочие процессы
  • Полезные практики
  • Когда вы не должны проверить
  • И как думать сквозь проблемы в TDD.

(Иногда) невидимые преимущества

Кто-то новое для тестирования, будь то менеджер проекта, сами или коллегой, он иногда может чувствовать себя как пустая трата времени. «Почему я не могу просто написать код сейчас и сделать с ним!? «Вы можете спросить. Это не необычное настроение, чтобы встретиться. Конечно, если ваш босс говорит, что не пишите тесты, то вам придется делать то, что он/она в конечном итоге хочет и движется вместе. (Хотя я могу получить это в письменной форме) Наличие тестирования вашей кодовой базы, по крайней мере, несколько, указывает на то, что вы не только подумали о своем коде, он немного глубже, чем это. Если вы строите библиотеку, другие люди используют, наличие хорошего тестового покрытия может дать им больше уверенности в вашей библиотеке. Если это чисто внутреннее приложение/библиотека/что угодно, то наличие хорошего тестового покрытия дает вам уверенность в рефакторинге позже. Вы разрываетесь и янки функции, как вы, пожалуйста, переписывайте их полностью или просто удалите их и, если у вас есть достойное покрытие, будьте довольно уверены, что ничто не взорвется в производстве, если все тесты все еще проходят.

Типичные рабочие процессы

Вы всегда пишете тесты раньше? Что такое типичная ошибка исправления или запрос на функцию выглядит? Очевидно, что мы все будем любить, чтобы следовать по красному, зеленому, рефакторирующему принципу. Значение, может показаться, что только RockStar Devs способен сначала написать неудачную тест, а затем писать код, который делает этот тестовый пропуск, затем рефакторинг, чтобы сделать код элегантный . Ну, я не Rockstar Dev И я думаю, что больше всего согласится, что все, что мы можем дать, это наше лучшее.

Что мы можем сделать, если не пытаться сделать лучше? Если это достаточно простого, конечно, я буду следовать принципам TDD и сначала напишу тест. Обычно это может происходить с небольшими исправлениями ошибок. Если это особенность, с другой стороны, мне кажется невозможным, но я сделаю что-то, чтобы компенсировать это. То, что я обычно делаю, это начать кодировать на том, что я пытаюсь реализовать и писать тестовые заполнители по пути. Это очень просто делать, просто функция и сдача. Может быть, строка док, чтобы рассказать мне немного больше. Я зафиксирую это, но я не буду представить этот PR, пока эти тесты не будут больше плоть. (Если вы боитесь, что вы забудете о них, у них целенаправленно не удалось) Это не чисто TDD Но оно осознано функционирующей конструкции для размещения тестирования. Чаще всего, чем не ведет к передовым опытам. Не всегда, конечно. Иногда тестирование – это больше искусства, чем наука. Например, если я пишу калькулятор кончика, я мог бы сосредоточиться на реализации функциональности сначала и написать быстрый тестовый скелет, который выглядит так:

class TipCalcTestCase(TestCase):
    # setup funcs
    ...

    def test_tip_calculates_correct(self):
        """ Test that get_tip_amount() should take a total and a percent 
        then return the amount needed to tip.
        """
        pass

Полезные практики

Агрегатный тест должен проверить единицу. Это звучит избыточным, но я в основном говорю, что тест на единицу должен тестировать одно и одну вещь только. Если у меня есть функция, которая длинная и громоздкая, это, вероятно, будет тестировать кошмар. Принимая эту функцию и извлечение меньших, более читаемых функций, я могу легко проверить каждую строку. Имея в виду TDD при написании кода, таким образом, может помочь вам написать Cleaner Code. Конечно, наши тесты, получающие преимущество, это только побочный эффект к истинному значению, легкость чтения и ремонта кода. Извлечение одной длинной функции на более мелкие, более управляемые функции, предотвратит много ментального трения, когда вы пересмотрите этот код спустя.

Издеваться

Есть времена, когда тестирование просто избыточное или ненужное. Например, я не советую тестировать 3-й партийные библиотеки. Вы можете проверить, как вы называете их, и даже проверьте, что они Получить Вызывается, но тестирование внутренних лиц из 3-го библиотек партии следует обрабатывать авторами этих библиотек. Дать глупое примеру (и полностью подумано о-на месте), скажем, я пишу приложение, которое помогает кассирам. У меня может быть код, который выглядит ниже. В этом случае продукты Gooceries – очень хорошая 3-я партийная библиотека, которая имеет метод, который при приведенном элементе (бананы, куки, и т. Д.) Возвращает цену. Проблема в том, что я не обеспокоен продуктами, выполняю свою работу. Я верую, что автор продуктов сделал то, что ему нужно сделать для меня. Я хочу проверить get_subtotal () , но я также хочу этот тест, чтобы бежать полностью в автономном режиме. Насмешкование (в основном просто говорят функцию/класс, что делать вручную) помогает мне добраться до того, что мне нужно сделать, что тестирование get_subtotal () Отказ

import groceries  # 3rd party lib

def get_subtotal(items):
    subtotal = 0
    for item in items:
        # groceries.get() makes an API call
        item = groceries.get(item)
        subtotal += item.price

     return subtotal

И тесты …

import unittest
import mock

import get_subtotal

class SubtotalTestCase(unittest.TestCase):
    # Setup testcase class.. 
    ...

    @mock.patch('get_subtotal', return_value=7)
    def test_get_subtotal(self):
        items = ['banana', 'hot dog buns']
        # Since get_subtotal is mocked, it will only return 7 and do nothing else.
        result = get_subtotal(items)
        self.assertEqual(result, 14)

Эти глупые примеры на 100% непроверены (ха!) В реальной жизни, просто основные концепции. В целом, у нас был взрыв, и все чувствовали, что забрали то, что они не знали раньше. Если мы получим еще одно обсуждение на TDD, он определенно будет записан через Google Hangouts. Обратите внимание, если у вас есть какие-либо вопросы, мысли, проблемы, похвалы, обвинения и т. Д.

Несколько ссылок, которые ссылались во время нашего разговора:

Читать дальше Пользователи на моем личном блоге @ http://anthonyfox.io/

Подробнее о Университете Пенни

Название «Университет Пенни» – это ссылка на ранние кариеты в Оксфордской Англии. Эти кофейцы провели важное объединение с европейским веком просвещения. По цене пенни, ученых и паулов одинаково получит вход в кофейню, наслаждаться бесконечным запасом кофе, и что более важно наслаждаться обучением через разговоры со своими сверстниками. Таким образом, эти кофейцы пришли называть «университеты Пенни».

Наша новая группа, Университет Пенни, служит современной взять на себя эту старую традицию, соединяя тех, кто желает учиться с теми, кто готов поделиться тем, что они знают. Это, безусловно, может быть в кофейне, но и в любом месте, в том числе просто быстрое сообщение Google.

Там нет наставников или предшественников, лидеров или последователей. Мы все сверстники, и мы здесь, чтобы учиться, и учить.

Хотите узнать больше? Нажмите здесь

Оригинал: “https://dev.to/wtfox/testing-and-test-driven-development—why”