Подтвердить что ты не робот

Как я действительно unit test код?

Я читал Joel Test 2010, и он напомнил мне о проблеме, которую я имел с модульным тестированием.

Как я действительно unit test что-то? Я не unit test функции? только полные классы? Что делать, если у меня есть 15 классов, которые составляют < 20lines. Должен ли я писать 35line unit test для каждого класса, выводя 15 * 20 строк в 15 * (20 + 35) строк (от 300 до 825, почти на 3 раза больше кода).

Если класс используется только двумя другими классами в модуле, должен ли он unit test его или будет ли тест против двух других классов достаточным? что, если они все, 30 строк кода я должен беспокоиться?

Если я пишу код для дампа данных, и мне никогда не нужно его читать, например, используется другое приложение. Другое приложение не является командной строкой, или это не способ проверить, хороши ли данные. Мне все еще нужно unit test это?

Что делать, если приложение является утилитой, а общая сумма составляет < 500 строк кода. Или используется на этой неделе и будет использоваться в будущем, но всегда нужно переконфигурировать, потому что он предназначен для быстрого пакетного процесса, и каждый проект потребует изменений, потому что выход желания не изменяется. (я пытаюсь сказать theres никоим образом не вокруг, по уважительным причинам он всегда будет изменен) сделать я unit test, и если да, то как? (может быть, нам не важно, если мы сломаем функцию, использованную в прошлом, но не в настоящем или будущем).

и др.

Я думаю, что это должно быть вики. Может быть, люди хотели бы сказать точно, что они должны unit test (или не должны)? возможно, ссылки на книги хороши. Я пробовал один, но он никогда не уточнял, что должно быть проверено на модуле, просто проблемы написания модульных тестов и решений.


Также, если классы предназначены только для того, чтобы быть только в этом проекте (по дизайну, спецификации или по любой другой причине), и класс не полезен сам по себе (скажем, он генерирует html с использованием данных, которые возвращают готовые комментарии html). Мне действительно нужно Попробуй это? скажем, проверяя, разрешают ли все публичные функции объекты с нулевым комментарием, когда мой проект никогда не использует нулевой комментарий. Это те вещи, которые заставляют меня задаться вопросом, не я ли я тестирую неправильный код. Также тонны классов выбрасываются в проект. Его пограничный выброс или не очень полезный код, который меня беспокоит.

4b9b3361

Ответ 1

Вот то, что я слышу, означает ли вы это так или нет: целая серия вопросов и оправданий, почему модульное тестирование может быть неприменимо к вашему коду. Другими словами: "Я не понимаю, что я выберу из модульных тестов, и они очень беспокоятся писать, может быть, они не для меня?"

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

Я думаю, что вы ошибочно оцениваете стоимость обслуживания и какие вещи могут сломаться в вашем коде. Итак, вот мои мысли:

  • Должен ли я тестировать небольшие классы? Да, если есть вещи в этом классе, которые могут сломаться.
  • Должен ли я тестировать функции? Да, если в этой функции есть вещи, которые могут сломаться. Почему бы и нет? Или ваша забота о том, считается ли она единицей или нет? Это просто болтает над именами и не должно иметь никакого отношения к тому, следует ли вам писать для него единичные тесты! Но, по моему опыту, я вижу метод или функцию, описанные как тестируемая единица.
  • Должен ли я unit test класс, если он используется двумя другими классами? Да, если есть что-то, что может сломаться в этом классе. Должен ли я тестировать его отдельно? Преимущество этого заключается в том, чтобы иметь возможность изолировать разрывы прямо до общего класса, вместо того, чтобы искать через классы использования, чтобы увидеть, были ли они сломаны или одна из их зависимостей.
  • Должен ли я тестировать вывод данных из моего класса, если другая программа прочтет его? Ад да, особенно если эта другая программа является сторонней! Это отличное приложение модульных тестов (или, возможно, системных тестов, в зависимости от изоляции, участвующих в тесте): чтобы убедиться, что данные, которые вы выводите, являются именно тем, что вы думаете, что вы должны иметь выход. Я думаю, вы обнаружите, что имеет возможность упростить поддержку вызовов неизмеримо. (Хотя, пожалуйста, обратите внимание, что это не замена хорошего приемочного тестирования на этом конце клиента.)
  • Должен ли я тестировать код сбрасывания? Возможно. Поймет ли стратегия TDD быстрее выкинуть свой код в дверь? Возможно. Будет ли иметь твердые единичные куски, которые вы можете адаптировать к новым ограничениям, уменьшает необходимость выбросить код? Может быть.
  • Должен ли я тестировать код, который постоянно меняется? Да. Просто убедитесь, что все применимые тесты обновлены и прошли! Постоянно изменяющийся код может быть особенно восприимчив к ошибкам, в конце концов, и включение безопасных изменений - это еще один пример тестирования модулей. Кроме того, это, вероятно, ставит нагрузку на ваш инвариантный код настолько же надежным, насколько это возможно, чтобы включить эту скорость изменения. И вы знаете, как вы можете убедить себя, является ли кусок кода надежным...
  • Должен ли я тестировать функции, которые больше не нужны? Нет, вы можете удалить тест и, вероятно, код (тестирование, чтобы вы не нарушили ничего в этом процессе, конечно!). Не оставляйте unit test rot around, особенно если тест больше не работает или работает, или люди в вашей организации не будут отходить от модульных тестов, и вы потеряете преимущество. Я видел, как это произошло. Это некрасиво.
  • Должен ли я тестировать код, который не используется моим проектом, даже если он был написан в контексте моего проекта? В зависимости от того, что является результатом вашего проекта, и каковы приоритеты вашего проекта. Но уверены ли вы, что никто, кроме вашего проекта, не будет использовать его? Если они не будут, а вы нет, возможно, это просто мертвый код, и в этом случае см. Выше. С моей точки зрения, я бы не почувствовал, что выполнил полную работу с классом, если мое тестирование не охватывало всех его важных функций, независимо от того, использовал ли проект все эти функции или нет. Мне нравятся классы, которые чувствуют себя полными, но я слежу за тем, чтобы не перерабатывать кучу вещей, которые мне не нужны. Если я помещу что-то в класс, тогда я намереваюсь использовать его и поэтому хочу убедиться, что он работает. Это вопрос личного качества и удовлетворения для меня.

Ответ 2

Не зацикливаться на подсчете строк кода. Напишите как можно больше тестового кода, чтобы убедить себя, что каждый ключевой элемент функциональности тщательно протестирован. В качестве крайнего примера проект SQLite имеет тесты: соотношение исходных кодов больше 600: 1. Здесь я использую термин "крайний" в хорошем смысле; смехотворное количество тестирования, которое продолжается, возможно, является основной причиной того, что SQLite захватил мир.

Ответ 3

Как вы можете делать все эти вычисления? В идеале вы никогда не должны находиться в ситуации, когда вы можете считать строки вашего завершенного класса, а затем начать писать unit test с нуля. Эти 2 типа кода (реальный код и тестовый код) должны быть разработаны и развиты вместе, и только одна метка LOC, которая действительно должна вас беспокоить, в конце концов - 0 LOC для тестового кода.

Ответ 4

Относительные подсчеты LOC для кода и тестов бессмысленны. Что еще важнее, так это тестирование. Самое главное - найти ошибки.

Когда я пишу модульные тесты, я стараюсь сосредоточить свои усилия на тестировании сложного кода, который скорее всего будет содержать ошибки. Простые материалы (например, простые методы getter и setter) вряд ли будут содержать ошибки и могут быть проверены косвенно с помощью тестов на уровне более высокого уровня.

Ответ 5

Некоторое время назад у я был Тот же вопрос, который вы указали в виду. Я изучил много статей, учебников, книг и т.д. Хотя эти ресурсы дают мне хорошую отправную точку, я все еще не уверен в том, как эффективно применять код Unit Testing. После прохождения xUnit Test Patterns: Рефакторинг тестового кода и поставьте его на полку около года (вы знаете, у нас много продуктов Чтобы учиться), он дает мне то, что мне нужно. Эффективно применять код тестирования. С множеством полезных шаблонов (и советов) вы увидите, как стать кодовым аппаратом для тестирования. Темы как

  • Шаблоны тестовой стратегии
  • Основные шаблоны
  • Шаблоны настройки устройства
  • Шаблоны проверки результатов
  • Проверить двойные шаблоны
  • Тестовые шаблоны организации
  • Шаблоны баз данных
  • Шаблоны значений

И так далее...

Я покажу вам, например, шаблон производного значения

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

Образец тестовой организации, связанный с вашим вопросом (класс Testcase для каждой функции)

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

Но перед чтением

xUnit Test Patterns http://xunitpatterns.com/Cover-Small.gif

Мой совет: внимательно прочитайте

Ответ 6

Вы, похоже, обеспокоены тем, что может быть больше тестового кода, чем код-под-тестом.

Я думаю, что мы могли бы быть выше, чем вы говорите. Я ожидал бы, что любой серьезный тест будет иметь широкий диапазон входных данных. Таким образом, ваш 20-строчный класс может иметь 200 строк тестового кода.

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

Итак, да, проверь все. Старайтесь не думать о тестировании как о труде.

Ответ 7

Я часть команды, которая только что начала добавлять тестовый код к нашей существующей и довольно старой базе кода.
Я использую здесь "test", потому что чувствую, что это может быть очень неопределенным, поскольку это погода unit test, или системный тест, или интеграционный тест, или что-то еще. Различия между терминами имеют большие серые области и не добавляют значительную ценность.

Поскольку мы живем в реальном мире, у нас нет времени добавить тестовый код для всех существующих функций. У нас все еще есть Дэйв, парень, который находит большинство ошибок. Вместо этого, когда мы разрабатываем, мы пишем тесты. Вы знаете, как вы запускаете свой код, прежде чем рассказывать своему боссу, что он работает? Ну, используйте единую структуру (мы используем Junit) для выполнения этих прогонов. И просто держите их всех, а не удаляйте их. Что бы вы ни делали, чтобы убедить себя, что это работает. Сделайте это.

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

Ответ 8

для java u можно использовать junit

JUnit

JUnit - простая структура для записи повторяемых тестов. Это экземпляр архитектуры xUnit для модулей модульного тестирования.

* Getting Started
* Documentation
* JUnit related sites/projects
* Mailing Lists
* Get Involved

Начало работы Чтобы начать работу с модульного тестирования, и JUnit прочитал статью: JUnit Cookbook. В этой статье описывается базовое тестовое письмо с использованием JUnit 4.

Вы найдете дополнительные образцы в пакете org.junit.samples:

* SimpleTest.java - some simple test cases
* VectorTest.java - test cases for java.util.Vector

JUnit 4.x поставляется с текстовым TestRunner. Для графической обратной связи большинство основных IDE поддерживают JUnit 4. При необходимости вы можете запускать тесты JUnit 4 в среде JUnit 3, добавляя к каждому тестовому классу следующий метод:

public static Test suite() {  вернуть новый JUnit4TestAdapter (ThisClass.class); }

Документация

JUnit Cookbook
    A cookbook for implementing tests with JUnit.
Javadoc
    API documentation generated with javadoc.
Frequently asked questions
    Some frequently asked questions about using JUnit.
Release notes
    Latest JUnit release notes
License
    The terms of the common public license used for JUnit.

Следующие документы по-прежнему описывают JUnit 3.8.

The JUnit 3.8 version of this homepage
Test Infected - Programmers Love Writing Tests
    An article demonstrating the development process with JUnit.
JUnit - A cooks tour 

JUnit Связанные проекты/Сайты

* junit.org - a site for software developers using JUnit. It provides instructions for how to integrate JUnit with development tools like JBuilder and VisualAge/Java. As well as articles about and extensions to JUnit.
* XProgramming.com - various implementations of the xUnit testing framework architecture. 

Списки рассылки Существует три списка рассылки junit:

* JUnit announce: [email protected] Archives/Subscribe/Unsubscribe
* JUnit users list: [email protected] Archives/Subscribe/Unsubscribe
* JUnit developer list: [email protected] Archives/Subscribe/Unsubscribe

Примите участие JUnit отмечает, что программисты тестируют собственное программное обеспечение. В результате ошибки, исправления и запросы функций, которые включают JUnit TestCases, имеют больше шансов быть адресованными, чем те, у кого нет. Исходный код JUnit теперь размещен на GitHub.

Ответ 9

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

Это позволило наши тесты быть написаны гораздо быстрее и значительно увеличило тестовую разборчивость.

Ответ 10

Я собираюсь ответить на то, что, по моему мнению, является основным моментом вашего вопроса. Во-первых, сколько тестового кода вы должны писать? Ну, Test-Driven Development может быть полезной. Я не использую его так строго, как это предлагается в теории, но я считаю, что написание теста сначала помогает мне понять проблему, которую я хочу решить гораздо лучше. Кроме того, это обычно приводит к хорошему тестированию.

Во-вторых, какие классы следует тестировать? Опять же, TDD (или, точнее, некоторые из его принципов) может помочь. Если вы разработаете свою систему сверху вниз и сначала напишите свои тесты, у вас будут тесты для внешнего класса при написании внутреннего класса. Эти тесты должны завершиться неудачно, если у внутреннего класса есть ошибки.

TDD также тесно связан с идеей Дизайн для тестирования.

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

Ответ 11

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

Я предлагаю применить персональную ответственность за тестирование и самостоятельно определить ответ. Это ваш код, и вы несете ответственность за его работу. Если он ломается, вы должны заплатить за последствия исправления кода, ремонта данных, ответственности за потерянный доход и извинения перед людьми, чья заявка сломалась, когда они пытались ее использовать. Итог - ваш код никогда не должен прерываться. Итак, что вы должны сделать, чтобы обеспечить это?

Иногда модульное тестирование может хорошо работать, чтобы помочь вам протестировать все конкретные методы в библиотеке. Иногда модульное тестирование просто занято, потому что вы можете сказать, что код работает на основе вашего использования кода во время тестирования более высокого уровня. Вы разработчик, вы несете ответственность за то, чтобы код никогда не ломался - как вы думаете, лучший способ достичь этого?

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

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

Для меня это похоже на здравый смысл.

Ответ 12

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

Модульные тесты очень полезны. Я рекомендую вам записать эти тесты. Однако не все требует проверки. Например, вам не нужно тестировать простые геттеры и сеттеры.

Если вы хотите написать свои модульные тесты на Java через Eclipse, просмотрите "Как написать тесты единиц Java". Я надеюсь, что это помогает.