Модульные тесты и функциональные тесты - PullRequest
360 голосов
/ 30 апреля 2010

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

Ответы [ 13 ]

470 голосов
/ 30 апреля 2010

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

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


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

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

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

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

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

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


Как итог,

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

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

225 голосов
/ 30 апреля 2010

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

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

134 голосов
/ 30 апреля 2010
  • В модульном тесте проверяется независимая единица поведения . Что такое единица поведения? Это самая маленькая часть системы, которая может быть независимо протестирована модулем. (Это определение на самом деле является круговым, поэтому, на самом деле, это вообще не определение , но на практике оно работает довольно хорошо, потому что вы можете понять его интуитивно.)

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


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

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


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

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


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

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


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

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


84 голосов
/ 01 июня 2016

TLDR:

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


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

enter image description here

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

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

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

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

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

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

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

enter image description here

12 голосов
/ 30 апреля 2010

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

См. Также Взгляд IBM на грань между модульным тестированием и функциональным тестированием .

7 голосов
/ 09 сентября 2015

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

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

В основном:

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

, а

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

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

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

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

6 голосов
/ 04 марта 2017

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

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

6 голосов
/ 29 сентября 2012

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

3 голосов
/ 31 октября 2016

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, чтобы проверить, появляется ли конкретное сообщение об ошибке при вводе неверного ввода. Мы не хотим проверять, отклонены ли все неверные данные или нет. Это работа модульных тестов.

3 голосов
/ 30 апреля 2010

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

...