В чем разница между видами и типами тестирования ПО?

Ответ

Виды тестирования классифицируются по цели проверки:

  1. Функциональное: Проверяет, что система делает (соответствие функциональным требованиям).
    • Пример (проверка логина):
      # pytest
      def test_login_with_valid_credentials():
          result = login(username="test_user", password="correct_pass")
          assert result.is_successful() == True
          assert result.get_session() is not None
  2. Нефункциональное: Проверяет, как система работает (качества).
    • Нагрузочное (Performance): Проверка под нагрузкой.
    • Тестирование безопасности (Security).
    • Юзабилити-тестирование.

Типы тестирования классифицируются по способу/уровню проведения:

  • По уровню (Test Levels):
    1. Модульное (Unit): Тестирование отдельных функций/классов.
      // Jest
      test('sum function adds numbers', () => {
        expect(sum(1, 2)).toBe(3);
      });
    2. Интеграционное: Тестирование взаимодействия модулей/сервисов.
      # Интеграционный тест API
      def test_create_order_flow():
          user_id = create_test_user()          # Модуль A
          item_id = add_item_to_catalog()       # Модуль B
          order = place_order(user_id, item_id) # Интеграция A и B
          assert order.status == "PAID"
    3. Системное (End-to-End, E2E): Тестирование всей системы как единого целого.
  • По доступу к коду:
    • "Белый ящик" (White-box): С знанием внутренней реализации.
    • "Черный ящик" (Black-box): Без знания реализации, только по спецификации.
    • "Серый ящик" (Gray-box): Частичное знание (например, структура БД).

Итог: Вид отвечает на вопрос "что тестируем?" (функцию или качество), а тип"как и на каком уровне?" (модуль, интеграция, E2E).

Ответ 18+ 🔞

А, ну вот, классика жанра, блядь! Сидишь такой, думаешь: «Щас всё по полочкам разложу, как умный». А потом бац — и путаница в терминах, хуй с горы, ёпта! Давай разберём эту всю хуйню, чтобы не было как в том анекдоте про Герасима, который «Муму» говорит, а ему — «утопить в пизду».

Смотри, есть, условно, два главных вопроса. Первый: «ЧТО, блядь, мы проверяем?». Второй: «КАК, сука, и НА КАКОМ УРОВНЕ мы это делаем?».

1. ВИДЫ (ЧТО проверяем?)

Тут всё просто, как три копейки. Либо ты смотришь на функцию, либо на качество.

  • Функциональное (Что делает система?). Ну, тут всё ясно. Кнопка должна нажиматься, форма отправляться, данные сохраняться. Как в жизни: нажал «войти» с правильным паролем — зашёл, ебать мои старые костыли. Нажал с левым — получил по ебалу ошибкой.

    # pytest
    def test_login_with_valid_credentials():
        result = login(username="test_user", password="correct_pass")
        assert result.is_successful() == True  # Должно быть True, иначе пиздец
        assert result.get_session() is not None
  • Нефункциональное (КАК она это делает?). А вот это уже интереснее. Функция-то работает, а вот как — вопрос. Это как машина: едет-то она едет, но если со скоростью 20 км/ч глохнет, а пароль в базе лежит открытым текстом — это пиздопроебибна, а не система.

    • Нагрузочное: А выдержит ли она, когда на неё навалится овердохуища народу? Не ляжет ли, как сука, в самый ответственный момент?
    • Безопасность: А не проёбываем ли мы данные налево и направо? Нельзя же доверять пользователям, они же все — потенциальные пидарасы шерстяные.
    • Юзабилити: А удобно ли этой хренью пользоваться, или интерфейс спроектировал манда с ушами?

2. ТИПЫ (КАК и НА КАКОМ УРОВНЕ проверяем?)

А вот тут начинается матч-реванш между «мелко» и «крупно».

  • По уровню (Test Levels):

    1. Модульное (Unit). Это когда ты выковыриваешь одну маленькую функцию, изолируешь её от всего мира и начинаешь долбить со всех сторон. Типа, «а вдруг она, сука, сломается?».
      // Jest
      test('sum function adds numbers', () => {
        expect(sum(1, 2)).toBe(3); // Не 3? Ну всё, пизда функции.
      });
    2. Интеграционное. А вот тут уже начинается веселье. Ты соединяешь две или больше этих самых функций/модулей/сервисов и смотришь, как они друг друга ебут. Один данные отдаёт, другой принимает, третий записывает. Главное — чтобы по цепочке не пошла хуйня.
      # Интеграционный тест API
      def test_create_order_flow():
          user_id = create_test_user()          # Модуль A (пользователи)
          item_id = add_item_to_catalog()       # Модуль B (каталог)
          order = place_order(user_id, item_id) # А вот тут они встречаются, блядь!
          assert order.status == "PAID"         # И если статус не "PAID" — волнение ебать, всё просрали.
    3. Системное (E2E). Это апофеоз, ёперный театр! Ты садишься за комп, открываешь браузер (или мобилу) и проходишь ВЕСЬ путь, как настоящий пользователь: регистрация, выбор товара, оплата, получение чека. Если тут всё работает — можно выдохнуть. Но ненадолго, потому что обычно это долго и хрупко, как хуй в пальто.
  • По доступу к коду (Какой у тебя план, Фокс?):

    • «Белый ящик»: Ты, блядь, архитектор. Ты знаешь ВСЁ: каждый if, каждый for, каждую переменную. Тестируешь с умным видом, заглядывая в кишки.
    • «Чёрный ящик»: Ты — пользователь, хитрая жопа. Тебе похуй, как там внутри циклы бегают. Ты даёшь на вход — смотришь на выход. Не совпало? Баг, нахуй!
    • «Серый ящик»: Ты — полупидор. Немного знаешь (например, схему базы данных), но не всё. Используешь это знание, чтобы бить точно в больные места.

Итог, Колян, блядь:
Вид — это ЧТО (функция или качество).
Тип — это КАК (долбим по одному модулю, проверяем их стыковку или гоняем всю систему целиком) и С КАКИМИ ЗНАНИЯМИ (в кишках ковыряемся или снаружи плюём).

Запомни это, а то будешь как тот Герасим: «Муму» говорить, а тебе в ответ — «интеграционное нагрузочное тестирование, блядь».