ты пишешь модульные тесты

Python

обо мне
Небольшой программист в мире программирования, в настоящее время работает руководителем команды в предпринимательской команде.Стек технологий включает Android, Python, Java и Go, который также является основным стеком технологий нашей команды. Контакт: hylinux1024@gmail.com

Может быть, вы слышалиTest Driven Development, но не уверены, следуете ли вы этому правилу? На самом деле, когда я пишу код, я редко сначала пишу модульные тесты, а затем пишу логику бизнес-функций. Я также здесь сегодня, чтобы узнать, какPythonПишите модульные тесты.

0x00 unittest

PythonсерединаunittestФреймворки модульного тестирования и другие языки, такие какJUnitпохож. Он поддерживает автоматизацию тестирования, совместное использование конфигурации и тестирование кода завершения работы.

Предположим, в каталоге моего проекта естьmysumБлок используется для вычисления суммы отдельных чисел в списке. есть еще одинtest_mysum.pyФайл для написания модульных тестов.

myproject/
│
├── mysum/
│   └── __init__.py
└── unittests
    └── test_mysum.py

Открытымmysumв модуле__init__.pyдокумент.

Добавьте следующий метод

def sum(args):
    total = 0
    for arg in args:
        total += arg
    return total

Открытымtest_mysum.py, писать модульные тесты

import unittest

from mysum import sum

class TestSum(unittest.TestCase):
    def test_list_int(self):
        """
        测试一个整数列表的和
        """
        data = [1, 2, 3]
        result = sum(data)
        self.assertEqual(result, 6)


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

Сначала импортируйте модуль, который мы хотим протестировать.mysumКласс тестового примера по наследствуunittest.TestCaseреализовать, испытательный методtest_list_intдаtestначало. В этом методе определен список целых чисел, и выполнениеsumметода, а затем оцените, является ли результат выполнения ожидаемым.

последний звонокunittest.main()выполнить этот тестовый пример

Ran 1 test in 0.001s

OK

Если вы добавите другой метод

def test_list_sum(self):
    data = [1, 3, 4]

    result = sum(data)
    self.assertEqual(result, 6)

После выполнения вы увидите сообщение, подобное следующему

6 != 8

Expected :8
Actual   :6

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

Процесс тестового примера можно резюмировать из этого примера:

  1. Построить входные данные
  2. Запустите тестируемый модуль и получите результат выполнения
  3. Сравните с ожидаемым результатом и измените код в соответствии с результатом

0x01 setup/tearDown

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

import unittest

class TestBasic(unittest.TestCase):
    def setUp(self):
        # 加载测试数据
        self.app = App(database='fixtures/test_basic.json')

    def test_customer_count(self):
        self.assertEqual(len(self.app.customers), 100)

    def test_existence_of_customer(self):
        customer = self.app.get_customer(id=10)
        self.assertEqual(customer.name, "Org XYZ")
        self.assertEqual(customer.address, "10 Red Road, Reading")
    
    def tearDown(self):
        self.app.releaseDB()

при каждом выполнении тестаsetupа такжеtearDownбудет выполнен один раз.

0x02 pytest

pytestЭто сторонняя среда тестирования, вам не нужно наследовать класс, чтобы использовать ее, она может использовать нативнуюassertЗаявления используются для подтверждения результатов испытаний.

Его использование также очень просто

сначала черезpipУстановить

➜ pip install pytest

Мы пишем отдельныйtestsСоздайте файл тестового примера в папкеtest_pytest.py. Примечание: здесьpytestдокументы должны быть идентичны вышеуказаннымunittestsФайлы должны быть дифференцированы, иначе появитсяModuleNotFoundError. Я уже ступил на яму здесь.

я использую здесьpytestФайловая структура модульного теста

tests
│
└── test_func.py

test_func.pyСодержание

# 导入我们要测试的模块
from mysum import sum


def test_answer():
    data = [1, 2, 3]

    assert sum(data) == 5

метод испытаний сtestначало

Затем выполните его в командной строке

➜ python -m pytest tests/test_func.py 

Примечание: используйте здесьpython -m pytest, если вы используете напрямуюpytestподскажетModuleNotFoundError: No module named 'mysum'

Результат выполнения следующий

tests/test_func.py F                                                                                                                                                                          [100%]

======================================================= FAILURES ==============================================
_______________________________________________________ test_answer ___________________________________________

    def test_answer():
        data = [1, 2, 3]
    
>       assert sum(data) == 5
E       assert 6 == 5
E        +  where 6 = sum([1, 2, 3])

tests/test_func.py:11: AssertionError
=======================================================1 failed in 0.03 seconds =======================================================

Поскольку 6!=5, этот модульный тест подсказывает, где ошибка.

0x03 Суммировать

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

0x04 Учебные материалы