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

30 дней Python 👨💻 – 20-й день – отладка и тестирование

Разработчики не пишут идеальный код и поэтому приложения, которые мы пытаемся построить, подвержены различным видам … Теги с Python, Challenge.

30-дневный питон (30 частей серии)

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

Отладка

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

Python поставляется с инструментами, необходимыми для отладки кода из коробки со своими встроенными функциями. Чем более наивный и простой способ отладка кода часто использует Печать заявление, которое я склонен часто использовать.

main.py

def is_prime(num):
  if num > 1:
    for i in range(2,num):
        if (num % i) == 0:
            return False
    else:
        return True

  else:
    return False

result = is_prime('2')
print(result) # TypeError

Вышеуказанный блок кода дает ошибку типа. Теперь простой способ проверить, что не так, мы можем разместить Печать Заявление, чтобы узнать, что происходит внутри функции.

main.py

def is_prime(num):
    print(num) # 2 (Here using a print might confuse us!)
    if num > 1:
        for i in range(2, num):
            if (num % i) == 0:
                return False
        else:
            return True

    else:
        return False

result = is_prime('2')
print(result)

Используя Печать Заявление для проверки входного значения может быть немного запутанным, так как он может выглядеть как номер. Эта функция – очень простой пример, который не может использовать, требуется такой критический анализ Но полезно понять способы отладки проблем в целом.

Чтобы хорошо использовать отладку, Python поставляется со встроенным модулем поплы . Это обеспечивает много полезных методов отладки, таких как set_trace ()

main.py

import pdb

def is_prime(num):
    pdb.set_trace()
    if num > 1:
        for i in range(2, num):
            if (num % i) == 0:
                return False
        else:
            return True

    else:
        return False

result = is_prime('2')
print(result)

При запуске программы переводчик делает паузу программы в месте, где set_trace () называется. Теперь в консоли отладки мы можем ввести любую переменную, значение которой мы хотим проверить в этой точке выполнения, такими как Num в этом случае. Это немедленно показать значение «2», которое является строкой. Следовательно, мы можем устранить это.

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

main.py

def is_prime(num):
    breakpoint() # places a breakpoint
    if num > 1:
        for i in range(2, num):
            if (num % i) == 0:
                return False
        else:
            return True

    else:
        return False

result = is_prime('2')
print(result)

Теперь в консоли PDB имеется много команд отладки. Просто печатать Помогите Предоставляет список доступных команд. Я хотел бы предоставить список из них здесь для справки.

p Распечатайте значение выражения.
поп Довольно печатайте значение выражения.
n Продолжайте выполнение, пока не будет достигнута следующая строка в текущей функции, не возвращается.
s Выполните текущую строку и останавливайтесь с первого возможного случая (либо в функции, которая называется, либо в текущей функции).
c Продолжайте выполнение и останавливаться только тогда, когда столкнутся точка останова.
указывать Продолжайте выполнение до тех пор, пока не будет достигнута строка с числом выше текущего. С аргументом номера строки продолжайте выполнение до тех пор, пока не будет достигнута строка с числом, ни равным.
l Список исходный код для текущего файла. Без аргументов перечислите 11 строк по текущей линии или продолжите предыдущий список.
линять Перечислите весь исходный код для текущей функции или кадра.
b Без аргументов, перечислите все перерывы. Благодаря аргументу номера строки установите точку останова в этой строке в текущем файле.
w Распечатайте трассировку стека, с самым последним кадром внизу. Стрелка указывает текущий кадр, который определяет контекст большинства команд.
u Переместите текущее количество кадров (по умолчанию) Уровни вверх в трассировке стека (на более старый кадр).
d Переместите текущее количество кадров (по умолчанию) уровни вниз в трассировке стека (до более нового кадра).
h См. Список доступных команд.
h Показать помощь для команды или темы.
h поплы Показать полную документацию PDB.
q Выйдите из отладчика и выйдите.

Ресурсы отладки

Установка тестирования

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

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

Python снова предоставляет из коробки поддержки для тестирования подразделения с помощью встроенного модуля Неизвестный Он также называется тестовым бегуном, который может несколько тесты все сразу для всего проекта.

Давайте попробуем проверить вышеизложенное IS_PRIME Функция, написав несколько простых тестов. Для этого нам нужно создать тестовый файл, который в этом случае будет Test.py.

test.py

import unittest
import main

class TestPrime(unittest.TestCase):
  def test_valid_type(self):
    test_input = 13
    test_result = main.is_prime(test_input)
    expected_result = True
    self.assertEqual(test_result, expected_result)

if(__name__ == '__main__'):
  unittest.main()

Установка тестов записывается как класс Python, и каждый сценарий тестового случая записывается как отдельный метод в классе. Класс должен продлить модульный тест. Testcase сорт. Также в конце есть чек для обеспечения того, чтобы тесты единиц инициируются только в том случае, если он работает от основного модуля.

Тестовый файл может быть запущен с помощью Python3 Test.py или Python3 Test.py на основе вашей настройки Python. Вышеуказанный тест должен пройти, так как сценарий теста соответствует критериям функций.

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

test.py

import unittest
import main

class TestPrime(unittest.TestCase):
    def test_valid_type(self):
        test_input = 13
        test_result = main.is_prime(test_input)
        expected_result = True
        self.assertEqual(test_result, expected_result)

    def test_invalid_input(self):
        test_input = 'hello'
        test_result = main.is_prime(test_input)
        expected_result = False
        self.assertEqual(test_result, expected_result)

if (__name__ == '__main__'):
    unittest.main()

В этом случае второй тест терпит неудачу, поскольку мы не обрабатываем о возможности типа DyjeRor в функции. Таким образом, функция может быть изменена соответственно.

main.py

def is_prime(num):
    if (not isinstance(num, int)):
        return False
    if num > 1:
        for i in range(2, num):
            if (num % i) == 0:
                return False
            else:
                return True

    else:
        return False

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

test.py

import unittest
import main

class TestPrime(unittest.TestCase):
    def test_valid_type(self):
        test_input = 13
        test_result = main.is_prime(test_input)
        expected_result = True
        self.assertEqual(test_result, expected_result)

    def test_invalid_input(self):
        test_input = 'hello'
        test_result = main.is_prime(test_input)
        expected_result = False
        self.assertEqual(test_result, expected_result)

    def test_none_input(self):
        test_input= None
        test_result = main.is_prime(test_input)
        expected_result = False
        self.assertEqual(test_result, expected_result)

    def test_negative_input(self):
        test_input= -13
        test_result = main.is_prime(test_input)
        expected_result = False
        self.assertEqual(test_result, expected_result)

if (__name__ == '__main__'):
    unittest.main()

Если мы хотим инициализировать некоторые переменные или настроить некоторую настройку перед запуском тестов, его можно записать в Настройка метод. Точно так же любой вид очистки после каждого теста можно сделать в Обзор метод. Настройка Метод в основном используется чаще, чем Обзор метод.

import unittest
import main

class TestPrime(unittest.TestCase):
    def setUp(self):
        print('This will run before each test')

    def test_valid_type(self):
        test_input = 13
        test_result = main.is_prime(test_input)
        expected_result = True
        self.assertEqual(test_result, expected_result)

    def test_invalid_input(self):
        test_input = 'hello'
        test_result = main.is_prime(test_input)
        expected_result = False
        self.assertEqual(test_result, expected_result)

    def test_none_input(self):
        test_input = None
        test_result = main.is_prime(test_input)
        expected_result = False
        self.assertEqual(test_result, expected_result)

    def test_negative_input(self):
        test_input = -13
        test_result = main.is_prime(test_input)
        expected_result = False
        self.assertEqual(test_result, expected_result)

    def tearDown(self):
        print('this will run after each test')

if (__name__ == '__main__'):
    unittest.main()

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

Вот несколько отличных ресурсов, чтобы понять и исследовать больше на единицу тестирования в Python.

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

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

Иметь отличный!

30-дневный питон (30 частей серии)

Оригинал: “https://dev.to/arindamdawn/30-days-of-python-day-19-debugging-and-testing-4274”