Nano Hash - криптовалюты, майнинг, программирование

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

Я работаю над существующим проектом Java EE с различными модулями maven, разработанными в Eclipse, объединенными вместе и развернутыми на JBoss с использованием Java 1.6. У меня есть возможность подготовить любой фреймворк и задокументировать, как юнит-тестирование должно быть реализовано в проекте.

Можете дать совет по...

  • JUnit — это то, с чего я ожидаю начать, это все еще де-факто выбор для Java-разработчика?
  • Любые издевательские фреймворки, которые стоит установить в качестве стандарта? ДжейМок?
  • Любые правила, которые должны быть установлены — покрытие кода или обеспечение того, чтобы это были модульные, а не интеграционные тесты.
  • Какие-нибудь инструменты для создания причудливых результатов для менеджеров проектов?

Что-нибудь еще? Заранее спасибо.


  • EasyMock — самый известный фреймворк для насмешек (посмотрите на результаты поиска в Google: P). имя не такое крутое, как у jMock, но оно лучше. Однако Mockito позволяет вам пропустить один шаг при создании макетов (вам не нужно повторно воспроизводить (макет) после его настройки). 24.07.2010

Ответы:


1

Какие-нибудь инструменты для создания причудливых результатов для менеджеров проектов?

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

  • они не дают реальной картины состояния и прогресса проекта, и

  • они могут дать совершенно ложную картину производительности отдельных членов команды.

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

Любые правила, которые должны быть установлены — покрытие кода или обеспечение того, чтобы это были модульные, а не интеграционные тесты.

  • Покрытие кода более важно для тех частей кода, которые могут быть хрупкими или содержать ошибки. Не устанавливайте контрольный уровень охвата.

  • Модульные тесты по сравнению с интеграционными тестами зависят от характера и сложности системы, которую вы создаете.

  • Добавление большого количества модульных тестов постфактум, вероятно, является пустой тратой времени. Это следует делать только для класса, идентифицированного как проблемный/требующий обслуживания.

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

22.07.2010

2

Что касается фреймворка модульного тестирования, то в основном их две: jUnit и TestNG. Оба имеют свои преимущества, и оба одинаково эффективны. Основным преимуществом jUnit является (на мой взгляд) включение по умолчанию плагина Eclipse, позволяющего легко вызывать тесты.

Что касается насмешливой структуры, я не считаю их обязательной частью вашего подхода к тестированию. Конечно, они полезны, но они решают конкретную задачу: тестирование поведения (в отличие от тестирования интерфейса, что позволяет jUnit. С помощью фиктивных фреймворков вы можете проверить, как конкретный класс реализует конкретный интерфейс. Будете ли вы? Вам это нужно? Очевидно. Вам это понадобится в первую очередь? Я не знаю.

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

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

22.07.2010
  • На самом деле это не цель насмешливого фреймворка. Истинная цель состоит в том, чтобы иметь возможность тестировать ClassA, который использует InterfaceB, и имитировать B, чтобы проверить, как ведет себя A, когда B делает то или иное, чтобы полностью изолировать тест A от любых реализаций B (иначе вы бы тестировали оба на одновременно, и тогда это не модульный тест). 22.07.2010

  • 3

    Это сложный вопрос, поэтому несколько заметок о нашей практике в $work:

    • JUnit действительно по-прежнему является стандартом. Большая часть документации и литературы относится к JUnit.
    • Mockito кажется новой звездой насмешек Java, хотя мы все еще используем JMock и думаем, что он подходит для наших нужд.
    • Мы используем подключаемый модуль Eclipse EclEmma для проверки нашего тестового покрытия, и он нам нравится.
    22.07.2010

    4

    Если вы еще этого не сделали, прочитайте Эффективная работа с устаревшей версией Код от Майкла Фезерса.

    22.07.2010

    5

    Я модифицировал модульные тесты для проекта C++, и это неприятно.

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

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

    Не ожидайте быстрого исправления — потребовалось 3 недели (6 часов в день, 5 дней в неделю), чтобы получить 20% покрытие, но код тратит 80% времени в этом коде, поэтому я думаю, что это было потраченное время с пользой и раскрыто. довольно много ошибок.

    22.07.2010

    6

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

    22.07.2010
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..