обо мне
Небольшой программист в мире программирования, в настоящее время работает руководителем команды в предпринимательской команде.Стек технологий включает 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логика реализации.
Процесс тестового примера можно резюмировать из этого примера:
- Построить входные данные
- Запустите тестируемый модуль и получите результат выполнения
- Сравните с ожидаемым результатом и измените код в соответствии с результатом
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 Учебные материалы
-
docs.Python.org/3/library/U…
Unit testing framework -
настоящий Python.com/Python-test…
Getting Started With Testing in Python -
docs.python-gui.org/writing/special…
Testing Your Code