Как разработка через тестирование (TDD) применяется в реальных проектах
Как разработка через тестирование (TDD) применяется в реальных проектах

краткое содержание

Разработка через тестирование (Тестирование Driven Разработка (сокращенно TDD) — это практика, которая стимулирует разработку путем написания тестов. Хотя многие разработчики заинтересованы в TDD Я понимаю теорию, но в реальных проектах, особенно в условиях экстренного цикла разработки, часто бывает сложно придерживаться этой модели разработки. В этой статье мы подробно обсудим на конкретных примерах. Процесс подачи заявки на TDD, показывающее, как начать с написания тестов, чтобы реализовать. Весь процесс разработки функцийиз. Через презентации кейсов и обсуждения Преимущества ТДД бросает вызов и предоставляет работоспособный изпример коди с картинками.

введение

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

Что такое ТДД

TDD — это модель разработки, в которой написание тестов ставится перед разработкой функций. Его основная философия:

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

Ключом к TDD является непрерывное выполнение итерационного цикла «красный-зеленый свет-рефакторинг».

Процесс подачи заявки на TDD

Написание тестов, которые терпят неудачу

Предположим, мы разрабатываем простое приложение-калькулятор с целью реализации функций сложения. Согласно концепции TDD, нам сначала нужно написать тест, проверяющий правильность функции сложения.

тестовый код

Язык кода:python
кодКоличество запусков:0
копировать
# test_calculator.py
import unittest
from calculator import Calculator

class TestCalculator(unittest.TestCase):
    def test_add(self):
        calc = Calculator()
        result = calc.add(2, 3)
        self.assertEqual(result, 5)

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

Этот тестовый код описывает Calculator сорт add Метод принимает два параметра и возвращает их сумму. На данный момент мы еще не достигли Calculator class, поэтому этот тест не пройден.

Реализация кода

Далее пишем Реализацию кода, чтобы тест прошел. Наша цель — сначала выполнить самую базовую функцию — реализовать сложение.

функциональный код

Язык кода:python
кодКоличество запусков:0
копировать
# calculator.py
class Calculator:
    def add(self, a, b):
        return a + b

Написав эту минимальную реализацию, мы добились успешного прохождения теста.

Рефакторинг кода

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

Преимущества ТДД

Обеспечить функциональную корректность

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

Улучшить качество дизайна кода

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

Автоматизированное тестирование

вместе Проект повторяется, и тестовое покрытие увеличивается, чтобы каждый модуль в проекте мог пройти Автоматизированное тестирование Проверять,уменьшать Проблемы, пропущенные во время регрессионного тестированияизриск。

Проблемы TDD в проектах

Плотный цикл разработки

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

Затраты на сопровождение испытаний

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

Кривая обучения TDD

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

пример кода

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

  1. calculator.py:осознал Calculator добрый,Содержит базовыеиз Четыре арифметических операции(добавлять、уменьшать、брать、удалять).
  2. test_calculator.py:использовать unittest Модуль написан для Calculator сортировать модульное тестирование.

Мы представим эти два файла один за другим.

Документ 1

В файле определяется класс Calculator, который содержит четыре основных метода математических операций. Функция каждого метода очень проста, но воплощает основные идеи объектно-ориентированного программирования.

Язык кода:python
кодКоличество запусков:0
копировать
# calculator.py
class Calculator:
    def add(self, a, b):
        return a + b

    def subtract(self, a, b):
        return a - b

    def multiply(self, a, b):
        return a * b

    def divide(self, a, b):
        if b == 0:
            raise ValueError("Cannot divide by zero")
        return a / b
  1. add(self, a, b):принимает два параметра a и b,ивозвращатьсяониизи。undefinedПример:add(2, 3) возвращаться 5
  2. subtract(self, a, b):принимает два параметра a и b,ивозвращатьсяонииз Разница(a - b)。undefinedПример:subtract(10, 5) возвращаться 5
  3. multiply(self, a, b):принимает два параметра a и b,ивозвращатьсяониизбратьпродукт(a * b)。undefinedПример:multiply(3, 5) возвращаться 15
  4. divide(self, a, b):принимает два параметра a и b,возвращатьсяониизбизнес(a / b)。
    • Уведомление:если параметр b для 0,Этот метод выкинет ValueError аномальный,Подсказка не может делить на ноль。undefinedПример:divide(10, 2) возвращаться 5。undefinedесли b == 0,броситаномальный:ValueError: Cannot divide by zero

Документ 2

Этот файл использует Python из unittest модуль для написания Calculator сортировать модульное тестирование. Каждый тестовый пример нацелен Calculator различные методы проверки правильности их функций.

Язык кода:python
кодКоличество запусков:0
копировать
import unittest
from calculator import Calculator
  • unittest:Это Python Платформа модульного тестирования в стандартной библиотеке. Обеспечивает Автоматизированное тестирование、Функция подтверждения、Настройте среду тестирования и другие функции.
  • from calculator import Calculator:от calculator.py импортировать в файл Calculator добрый.
Язык кода:python
кодКоличество запусков:0
копировать
# test_calculator.py
import unittest
from calculator import Calculator

class TestCalculator(unittest.TestCase):
    def setUp(self):
        self.calc = Calculator()

    def test_add(self):
        result = self.calc.add(2, 3)
        self.assertEqual(result, 5)

    def test_subtract(self):
        result = self.calc.subtract(10, 5)
        self.assertEqual(result, 5)

    def test_multiply(self):
        result = self.calc.multiply(3, 5)
        self.assertEqual(result, 15)

    def test_divide(self):
        result = self.calc.divide(10, 2)
        self.assertEqual(result, 5)

    def test_divide_by_zero(self):
        with self.assertRaises(ValueError):
            self.calc.divide(10, 0)

основная функция

Язык кода:python
кодКоличество запусков:0
копировать
if __name__ == '__main__':
    unittest.main()
  • unittest.main():Этофункция входа,Он автоматически запустит все test_ Начните с методов тестирования и сообщите о результатах испытаний.

Ссылка на контроль качества

Вопрос 1. Приносит ли TDD дополнительные затраты времени?

A1: Хотя TDD На ранних стадиях разработки могут возникнуть определенные временные затраты, но заранее написав тестовые примеры, вы сможете эффективно избежать последующих затрат на ремонт. Когда код был изменен, уже было из Автоматизированное тестирование может быстро проверить, возникают ли проблемы регрессии, что в конечном итоге может сэкономить много времени на отладку.

Вопрос 2. Подходит ли TDD для всех проектов?

A2: TDD Он больше подходит для проектов с понятной бизнес-логикой и четкими требованиями. Для исследовательских проектов или проектов с часто меняющимися требованиями преимущества ТДД может быть сложно воплотить в полной мере, и разработчикам необходимо использовать его гибко в соответствии с реальными условиями.

Вопрос 3. Как улучшить свои навыки написания тестовых примеров?

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

Подвести итог

TDD для разработчиков обеспечивают стандартизированный и автоматизированный процесс разработки. По «Написание тестов — Реализовать» функцию—Рефакторинг «кода», способного обеспечить высокое качество и надежность кодирования. TDD Существуют некоторые проблемы в практических приложениях, особенно когда они сталкиваются с давлением цикла разработки, но благодаря разумному планированию времени и использованию инструментов TDD Это может значительно повысить эффективность и качество разработки проектов.

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

Ссылки

  1. Kent Beck, Test Driven Development: By Example
  2. Robert C. Martin, Clean Code: A Handbook of Agile Software Craftsmanship
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose