Что такое модульное тестирование и как это сделать?

Точный дубликат многих должностей:

What is unit testing?
What Makes a Good Unit Test?
New to Unit Testing
Unit Testing - definitions
Learning Unit Testing
How to properly mock and unit test
Unit Testing: Beginner Questions
And many more ...
Кроме того, Google для site:stackoverflow.com "how do you" unit-test

Я читал некоторые вопросы по модульному тестированию, но я точно не знаю, что это или как вы это делаете. Я надеялся, что кто-то может сказать мне следующее:

  • Что именно является модульной тестирования? Встроен ли он в код или выполняться как отдельные программы? Или что-то еще?
  • Как вы это делаете?
  • Когда это должно быть сделано? Есть ли раз или проекты, чтобы не делать этого? Все ли можно проверить?

Большое спасибо за помощь.

Ответ на: "Что такое модульное тестирование и как это сделать?"

Количество ответов:7

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

проводятся как отдельные программы, но метод тестирования варьируется в зависимости от языка и типа программного обеспечения (GUI, command-line, library).

Большинство языков имеют unit testing frameworks, you should look into one for yours. , вы должны смотреть в один для вашего. Тесты

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

встроенный в код или запустить как отдельный

Что именно тестирует подразделение ИГ? Неужели все единицы-тестируемый?

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

Группа тестирования является массовой темой и в полной мере получить представление о том, как она может наилучшим образом принести пользу вам я рекомендую достать книгу по модульному тестированию, такие как " -52-" ", который даст вам хорошее представление о концепциях и как вы можете применить их к коду ". -74-" Программ? Или что-то еще?

From MSDN: The primary goal of unit testing is to take the smallest piece of testable software in the application, isolate it from the remainder of the code, and determine whether it behaves exactly as you expect. : Основная цель модульного тестирования состоит в том, чтобы взять наименьшую часть тестируемого программного обеспечения в приложении, изолировать его от оставшейся части кода и определить, ведет ли он себя именно так, как вы ожидаете.

По существу, вы пишете маленькие кусочки кода, чтобы проверить отдельные биты вашего кода. В мире .net, вы бы запустить эти маленькие кусочки кода, используя что-то вроде NUnit или MBunit или даже встроенные в инструменты тестирования в визуальной студии. В Java можно использовать JUnit. По существу испытания бегунов будет строить ваш проект, загрузки и выполнения модульных тестов, а затем сообщить вам, если они проходят или не.

Как вы это делаете?

Ну это легче сказать, чем сделать для модульного тестирования. Это занимает довольно много практики, чтобы получить хорошее в нем. Необходимо структурировать код таким образом, чтобы сделать тестирование простым для 100-х, чтобы сделать тесты эффективными.

Когда это должно быть сделано? Есть ли раз или проекты, чтобы не делать этого? Является ли

Результатом, как правило, является куча документации и намного меньше ошибок, потому что поведение кода закреплено вниз.

Я строю тестовые чехлы для всех краевых кейсов и запускаю их по аналогии с работой сборщика мусора поколений. Пока я реализую класс, я запускаю только тестовые случаи, связанные с классом. Как только я закончу с работой над этим классом, я запускаю все unittests для того, чтобы увидеть, если все еще работает.

Вы должны проверить как можно больше, до тех пор, как тестовый код достаточно легко оставаться непроверенным. Учитывая, что нет, не все вменяемо. Подумайте Пользовательские интерфейсы. Подумайте, водитель для космического челнока или ядерной бомбы (по крайней мере, не с чистой JUnit-тесты ;) ). Тем не менее, много-много кода является проверяемым. Структуры данных. Алгоритмы. Большинство прикладных классов. Так что проверьте это!

Хт. тетха

Что такое объединитель? Это сложно определить. На техническом уровне вы строите функции, которые вызывают функции в вашей кодовой базе и проверяете результаты. В принципе, вы получаете кучу вещей, как "утвердить (5' 3) No 8", просто более сложным (как в DataLayer (MockDatabase()).getUser (). На уровне просмотра инструмента вы добавляете автоматизированную проверку, специфичную для проекта, если все по-прежнему работает так, как вы предполагали, что все работает. Это очень, очень полезно, если вы рефакторируете и если вы реализуете сложные алгоритмы.

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

http://www.nunit.org/index.php?p=quickStart&r=2.5

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

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

На "Как это сделать" часть:

Я думаю, что введение в ScalaTest does good job of illustrating different styles of unit tests. делает хорошую работу по иллюстрации различных стилей модульных тестов.

На "Когда это сделать" часть:

Модуль тестирования не только для тестирования. Делая модульное тестирование, вы также заставляют дизайн программного обеспечения в нечто, что является единицей проверяемой. Многие люди считают, что этот дизайн по большей части Хороший дизайн (TM), независимо от других преимуществ от тестирования.

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

Что...

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

"единица" в этом смысле является самым маленьким атомным компонентом кода, который имеет смысл протестировать, как правило, методом какого-либо класса, например. Частью этого процесса является создание объектов заглушки (или "макетов"), которые позволяют работать с устройством в качестве самостоятельного объекта.

Как...

Почти всегда, процесс модульного тестирования встроен в IDE (или через расширения), таким образом, что он выполняет тесты с каждой компиляцией. Существует ряд рамок для оказания помощи в создании модульных тестов (и действительно макет objcts), часто называют foo Unit (ср. jUnit, xUnit, nUnit). Эти платформы предоставляют формализованный способ создания тестов.

Как процесс, тестирование управляемой разработки (TDD) часто является мотивацией для модульного тестирования (но модульное тестирование не требует TDD), который предполагает, что тесты являются частью определения спецификации, и поэтому требует, чтобы они написаны во-первых, с кодом, написанным только для "решения" этих тестов.

Когда...

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

Что такое модульное тестирование? Тестирование

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

может быть таким же простым, как выход консоли, до green light" in a GUI such as в графическом интерфейсе, таком как NUnit, or a different language-specific framework. или другой языковой фреймворк.

Исполнительские модульные тесты разработаны, чтобы быть простыми, как правило, тесты написаны в виде функций, которые будут определять, является ли возвращенное значение равным значение, которое вы ожидали, когда вы написали функцию (или значение, которое вы будет ожидать , когда вы в конечном итоге написать его - это называется Test Driven Development when you write the tests first). при написании тестов в первую очередь).

Как вы выполняете модульные тесты?

Представьте себе очень простую функцию, которую вы хотели бы протестировать:

int CombineNumbers(int a, int b) {
    return a+b;
}

Модульный тестовый код будет выглядеть примерно так:

void TestCombineNumbers() {
    Assert.IsEqual(CombineNumbers(5, 10), 15); // Assert is an object that is part of your test framework
    Assert.IsEqual(CombineNumbers(1000, -100), 900);
}

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

Теперь представьте себе, другой разработчик приходит и меняет CombineNumbers() function for performance, or some other reason: функция для производительности, или по какой-то другой причине:

int CombineNumbers(int a, int b) {
    return a * b;
}

Когда разработчик запускает тесты, которые вы создали для этой очень простой функции, они увидят, что первый Assert fails, and they now know that the build is broken. не удается, и теперь они знают, что сборка сломана.

Когда следует проводить модульные тесты?

Они должны быть сделаны как можно чаще. Когда вы выполняете тесты в процессе разработки, ваш код автоматически будет разработан лучше, чем если бы вы просто написали функции, а затем перешли. Кроме того, такие понятия, как Dependency Injection are going to evolve naturally into your code. будут естественным образом развиваться в ваш код.

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