Модульные тесты и функциональные тесты


407

В чем разница между юнит-тестами и функциональными тестами? Может ли юнит-тест также проверить функцию?



Ответы:


254

Модульный тест - тестирование отдельного модуля, такого как метод (функция) в классе, со всеми макетированными зависимостями.

Функциональный тест - интеграционный тест АКА, тестирующий часть функциональности в системе. Это протестирует многие методы и может взаимодействовать с такими зависимостями, как базы данных или веб-службы.


170
Позвольте мне не согласиться с «интеграционным тестом АКА». Интеграционный тест проверяет интеграцию между двумя или более системами / подсистемами в вашем коде. Пример, проверка SQL-запроса через ORM, проверяет, что ORM и база данных работают хорошо вместе. Функциональные тесты АКА Сквозь конец ИМХО.
График

7
Я согласен с @graffic Functional Test! = Интеграционный тест Вы, должно быть, путаете «интеграцию» подкомпонентов системы друг с другом, например, постоянное состояние и т. Д. Но в общем смысле интеграционное тестирование имеет гораздо более широкий охват.
Nabster

4
Нет, не был смущен ни о чем.
bpapa

3
Интеграционный тест IS-A Функциональный тест. Но не наоборот. Гуглите «функциональное и нефункциональное тестирование» и отметьте «Изображения».
Андрейс

4
Этот ответ просто НЕПРАВИЛЬНО! Функциональное тестирование даже близко не подходит к интеграционному тесту ..
Sotn

517

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

Вы можете прочитать больше в модульном тестировании и функциональном тестировании


Хорошо объясненная реальная аналогия модульного тестирования и функционального тестирования может быть описана следующим образом:

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

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

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

Домовладелец выполняет функциональные испытания на дому. У него есть точка зрения пользователя.

Строительный инспектор выполняет модульные испытания дома. У него есть перспектива строителя.


Как итог,

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

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


18
Цитата немного расплывчата для кого-то нового в этой концепции.

2
@ fig-gnuton, я попытался уточнить, чтобы, надеюсь, не сделать описание неясным. Внутри ссылки они дают хороший пример, я мог бы обновить ответ цитатой, если вы думаете, что это может помочь ОП.
Энтони Форлони

148
Возможно, другой способ сказать это так: «Модульное тестирование позволяет убедиться, что код выполняет то, что хочет программист. Функциональные тесты позволяют убедиться, что программист делает то, что хочет клиент»?
JS.

3
Мне это нравится, но я бы приспособил его к. Функциональное тестирование гарантирует , что приложение позволяет пользователю выполнить действие. Test Unit делает , что код ведет себя как программист ожидает.
Адам

2
Разве не того, чего хочет программист, придерживается того, чего хочет конечный пользователь? Зачем писать тест, который не соответствует ожиданиям клиента?
О.Бадр

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

  • Функциональный тест проверяет независимую часть функциональности.


  • Единица поведения очень мала: хотя мне абсолютно не нравится эта дурацкая мантра «один модульный тест на метод», с точки зрения размера она почти правильная. Единица поведения - это нечто среднее между частью метода и, возможно, парой методов. Максимум объект, но не более одного.

  • Часть функциональности обычно включает в себя множество методов и прорезает несколько объектов и часто через несколько архитектурных слоев.


  • Модульный тест будет выглядеть примерно так: когда я вызываю validate_country_code()функцию и передаю код страны, 'ZZ'она должна возвращаться false.

  • Функциональным тестом будет: когда я заполняю форму доставки с кодом страны ZZ, я должен быть перенаправлен на страницу справки, которая позволяет мне выбрать код страны из меню.


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

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


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

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



отличный ответ! одна вещь - «функциональные тесты никогда не должны меняться в основной версии», почему это так?
Лазер

5
@Lazer, @cdeszaq: во многих проектах изменение номера основной версии используется для обозначения обратной несовместимости и OTOH, если основная версия не изменяется, обратная совместимость гарантируется . Что означает «обратная совместимость»? Это означает «не меняет поведение, видимое пользователю». А функциональные тесты - это исполняемая кодировка спецификации поведения, видимого пользователю. Так, если основной номер не меняется, то функциональные тесты не допускается к изменению либо и , наоборот, если функциональная ТЭЦ делать изменения, то основное количество должно измениться.
Йорг Миттаг

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

3
@ JörgWMittag нравится эта идея: «функциональные тесты представляют собой исполняемую кодировку спецификации поведения, видимого пользователю» ... независимо от того, согласны ли на самом деле другие супер-эксперты, это помогает мне в первоначальном вопросе увидеть разницу между 'Em "
Майк Грызун

1
«Функциональным тестом будет следующее: когда я заполняю форму доставки с кодом страны ZZ, меня перенаправляют на страницу справки, которая позволяет мне выбрать код страны из меню». Это немного придирчиво, но я бы назвал это «приемочным тестом». Функциональный тест будет проверять, что при вводе ZZ в форму доставки пользователь перенаправляет на правильный URL-адрес или выдает конкретное исключение или ошибку.
Боб Рэй

98

TLDR:

Чтобы ответить на вопрос: модульное тестирование является подтипом функционального тестирования.


Есть две большие группы: функциональное и нефункциональное тестирование. Лучшая (неисчерпывающая) иллюстрация, которую я нашел, это эта (источник: www.inflectra.com ):

введите описание изображения здесь

(1) Модульное тестирование: тестирование небольших фрагментов кода (функций / методов). Это можно рассматривать как (белый ящик) функционального тестирования.

Когда функции объединены, вы создаете модуль = отдельную часть, возможно, с пользовательским интерфейсом, который можно протестировать (тестирование модуля). Если у вас есть хотя бы два отдельных модуля, вы склеиваете их вместе, а затем получаете:

(2) Интеграционное тестирование: когда вы соединяете два или более частей (под) модулей или (под) систем вместе и смотрите, хорошо ли они играют вместе.

Затем вы интегрируете 3-й модуль, а затем 4-й и 5-й в любом порядке, в котором вы или ваша команда сочтете нужным, и как только все части головоломки собраны вместе, приходит

(3) Системное тестирование: тестирование ПО в целом. Это в значительной степени "Интеграционное тестирование всех частей вместе".

Если все в порядке, тогда приходит

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

введите описание изображения здесь


2
Я видел много таких картинок в Google, которые описывают «модульный тест» как своего рода «функциональный тест». Но почему тогда другие ответы здесь описывают совершенно иную концепцию: «Функциональный тест» - это скорее сквозной тест, а модульный тест - не функциональный тест? Я был в замешательстве. Есть две разные "религии", которые по-разному определяют термин "функциональный тест" или как?
Руслан Стельмаченко

Ответы (даже высоко одобренные) тоже могут быть неправильными;)
Андрейс

1
Мне нравится картинка, но для тестирования системной интеграции головоломка должна быть «полной», без других мест для подключения других частей.
Джонатон Рейнхарт

4
@JonathonReinhart - не обязательно. Открытые края могут представлять легкую расширяемость системы новыми функциями, что особенно полезно при использовании подхода к разработке, такого как Agile.
Майлз

Из множества противоречивых ответов, приведенных выше, очевидно, что Functional Testэто не стандартизированный термин и имеет разное значение для разных людей.
Пенге Гэн

12

«Функциональный тест» не означает, что вы тестируете функцию (метод) в своем коде. Обычно это означает, что вы тестируете функциональность системы - когда я запускаю foo file.txtиз командной строки, строки file.txt, возможно, меняются местами. В отличие от одного единичного теста, как правило, охватывает один случай одного метода - length("hello")должен возвращать 5, иlength("hi") возвращать 2.

Посмотрите также, как IBM проводит грань между модульным тестированием и функциональным тестированием .


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

8

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

Взято из книги "Персона TDD" Гарри Персиваль


8

Согласно ISTQB эти два не сопоставимы. Функциональное тестирование не является интеграционным тестированием.

Модульное тестирование является одним из уровней тестирования, а функциональное тестирование является типом тестирования.

В принципе:

Функцией системы (или компонента) является «то, что она делает». Обычно это описывается в спецификации требований, функциональной спецификации или в случаях использования.

пока

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

Согласно ISTQB компонент / модульное тестирование может быть функциональным или не функциональным:

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

Цитаты из фондов тестирования программного обеспечения - сертификация ISTQB


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

6

В Rails папка unit предназначена для хранения тестов для ваших моделей, функциональная папка предназначена для хранения тестов ваших контроллеров, а папка интеграции предназначена для хранения тестов, в которых задействовано любое количество взаимодействующих контроллеров. Светильники - это способ организации тестовых данных; они находятся в папке светильников. Файл test_helper.rb содержит конфигурацию по умолчанию для ваших тестов. ты можешь посетить это .


3

Я думаю об этом так: модульный тест устанавливает, что код выполняет то, что вы хотели, чтобы код делал (например, вы хотели добавить параметры a и b, вы фактически добавляете их, а не вычитаете их), Функциональные тесты проверяют, что весь код работает вместе, чтобы получить правильный результат, так что то, что вы намеревались сделать, код на самом деле получает правильный результат в системе.


3

AFAIK, юнит-тестирование НЕ является функциональным тестированием. Позвольте мне объяснить с небольшим примером. Вы хотите проверить, работает ли функция входа в почтовое веб-приложение или нет, так же, как и пользователь. Для этого ваши функциональные тесты должны быть такими.

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

Должны ли наши функциональные тесты проверять, можем ли мы войти в систему с неверными данными? Например. Электронная почта не имеет символа @, имя пользователя содержит более одной точки (разрешена только одна точка), .com появляется перед @ и т. Д.? Вообще нет! Такое тестирование входит в ваши юнит-тесты.

Вы можете проверить, отклонены ли недействительные входные данные в модульных тестах, как показано в тестах ниже.

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like string.string@myapp.com, then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

Обратите внимание, что функциональный тест 4 фактически выполняет то, что делает модульный тест 1. Иногда функциональные тесты могут повторять некоторые (не все) тесты, выполненные модульными тестами, по разным причинам. В нашем примере мы используем функциональный тест 4, чтобы проверить, появляется ли конкретное сообщение об ошибке при вводе неверного ввода. Мы не хотим проверять, отклонены ли все неверные данные или нет. Это работа модульных тестов.


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

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

2

ЕДИНИЦА ТЕСТИРОВАНИЯ

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

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

ФУНКЦИОНАЛЬНОЕ ИСПЫТАНИЕ

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



1

Модульное тестирование : - Модульное тестирование особенно используется для тестирования компонента продукта по компоненту, особенно в процессе разработки продукта. Инструменты типа Junit и Nunit также помогут вам протестировать продукт в соответствии с модулем. ** Вместо того чтобы решать проблемы после интеграции, всегда удобно решить ее на ранних этапах разработки.

Функциональное тестирование: - Что касается тестирования, существует два основных типа тестирования: 1.Функциональное тестирование 2.Нефункциональное тестирование.

Нефункциональный тест - это тест, в ходе которого Тестер проверяет, что Продукт выполнит все те атрибуты качества, которые клиент не упомянул, но эти атрибуты качества должны присутствовать. Например: -Производительность, удобство использования, безопасность, нагрузка, стресс и т. Д., Но в функциональном тесте : - Клиент уже присутствует со своими требованиями, и они должным образом задокументированы. Задача тестировщиков состоит в перекрестной проверке того, выполняет ли функциональность приложения соответствующие в предлагаемую систему или нет. Для этого Тестер должен проверить функциональность Реализованного с предложенной Системой.


0

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

Функциональное тестирование : это хорошая ссылка. Объяснение функционального тестирования


6
Пожалуйста, вставьте самый важный текст в ваш ответ, вы никогда не знаете, когда страница может быть удалена, делая ссылку недействительной.
Андрейс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.