Какие основные уровни и виды тестирования программного обеспечения вы знаете?

Ответ

Тестирование классифицируется по уровню детализации (уровни) и по целям/методам (виды).

Уровни тестирования (по степени изоляции компонентов)

  1. Модульное (Unit) тестирование: Проверка минимальных единиц кода (функций, методов, классов) в изоляции. Выполняется разработчиками.

    # Пример unit-теста на Python (pytest)
    def add(a, b):
        return a + b
    
    def test_add():
        assert add(2, 3) == 5
        assert add(-1, 1) == 0
        assert add(0, 0) == 0
  2. Интеграционное тестирование: Проверка взаимодействия между модулями, сервисами или системами (например, API, база данных).

  3. Системное (System) тестирование: Тестирование полностью интегрированной системы на соответствие требованиям (это уровень QA-инженеров).

  4. Приемочное (Acceptance) тестирование: Финальная проверка заказчиком/стейкхолдером, что система готова к релизу (UAT — User Acceptance Testing).

Ключевые виды/типы тестирования (по целям)

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

  2. Нефункциональное: Проверка характеристик системы.

    • Нагрузочное (Load) и стресс-тестирование (Stress): Оценка производительности под высокой нагрузкой (инструменты: JMeter, k6).
    • Тестирование удобства использования (Usability): Насколько интерфейс понятен и удобен для пользователя.
    • Тестирование безопасности (Security): Поиск уязвимостей.
  3. Регрессионное тестирование: Проверка, что новые изменения (фичи, фиксы) не сломали существующий функционал. Часто автоматизируется.

  4. Дымовое тестирование (Smoke/Sanity Check): Быстрая поверхностная проверка ключевых функций после сборки, чтобы убедиться в её принципиальной работоспособности перед запуском полного тест-рана.

Пример автоматизированного UI-теста (Selenium WebDriver + Python):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def test_user_login():
    driver = webdriver.Chrome()
    try:
        driver.get("https://app.example.com/login")
        # Ввод данных
        driver.find_element(By.ID, "username").send_keys("test_user@mail.com")
        driver.find_element(By.ID, "password").send_keys("SecurePass123!")
        driver.find_element(By.XPATH, "//button[@type='submit']").click()

        # Явное ожидание и проверка успешного входа
        welcome_element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "welcome-message"))
        )
        assert "Welcome, test_user" in welcome_element.text
        print("Login test PASSED")
    finally:
        driver.quit()

# Запуск теста
if __name__ == "__main__":
    test_user_login()

Связь: Один тест-кейс может относиться к определенному уровню и виду одновременно (например, системное функциональное регрессионное тестирование).

Ответ 18+ 🔞

Э, слушай, давай я тебе про тестирование расскажу, а то ты, похоже, как тот Герасим, молчишь и нихуя не понимаешь, блядь. Это ж не просто так, «нажал кнопку — работает». Тут целая наука, ёпта!

Вот смотри, есть у нас уровни — это как бы по степени «отдельности» проверяем. И есть виды — это по тому, что именно мы проверяем, нашу систему. Понял? Ну, типа, как в армии: есть звания (уровни), а есть род войск (виды). И один мудак может быть и сержантом, и танкистом одновременно, блядь.

Уровни, или «От мелкого говна до целой системы»

  1. Модульное (Unit) тестирование. Это когда ты берёшь одну мелкую, блядь, функцию, отгораживаешь её от всего мира и начинаешь долбить: «А ну-ка, сука, сложи 2 и 3!». Делают это обычно сами разработчики, пока код ещё тёплый. Вот, смотри, как просто:

    # Пример unit-теста на Python (pytest)
    def add(a, b):
        return a + b
    
    def test_add():
        assert add(2, 3) == 5  # Ну, тут всё ясно, бля
        assert add(-1, 1) == 0 # А если минус?
        assert add(0, 0) == 0  # А если нихуя?

    Если всё assert'ы проходят — значит, функция не совсем говно. Пока что.

  2. Интеграционное тестирование. А вот тут начинается веселье. Ты взял свою функцию, которая вроде работает, и кинул её в общий котёл с другими функциями, с базой данных, с каким-нибудь внешним API. И смотришь: они там друг друга не сожрут? Данные не потеряются? Это как запустить в одну комнату трёх пьяных мужиков и одну кошку — посмотреть, что будет, блядь.

  3. Системное (System) тестирование. Вот это уже работа для нас, для QA. Берём всю систему целиком — этот ваш готовый сайт или приложение — и начинаем ебашить по полной. Соответствует ли оно тому, что в требованиях написал какой-то умник-аналитик? Всё ли можно нажать, везде ли можно зайти? Это и есть основная наша работа, ёпта.

  4. Приемочное (Acceptance) тестирование. А это самый смак. Это когда заказчик, тот самый, который деньги платит, садится и говорит: «А ну-ка, покажите, что вы там наделали». И если он скажет «Да, это то, что я хотел» — можно выдохнуть. А если нет... Ну, ты понял. UAT, блядь, User Acceptance Testing — последний рубеж перед релизом.

Виды, или «Чего мы хотим от этой системы, кроме как чтобы она просто работала»

  1. Функциональное. Самый понятный вид, бля. «А кнопка «Войти» — она входит? А кнопка «Купить» — она покупает?». Проверяем, что система делает то, что должна делать. Всё по документации, мать её.

  2. Нефункциональное. А вот тут уже интереснее. Система-то работает, но как она работает?

    • Нагрузочное и стресс-тестирование. А что будет, если на ваш сайт зайдёт не один пользователь, а десять тысяч? А если сто тысяч? Он не ляжет, как сука, с перепугу? Для этого есть специальные инструменты вроде JMeter — они имитируют этих самых пользователей, только без мозгов и требований к зарплате.
    • Тестирование удобства (Usability). А удобно ли этим пользователям? Может, чтобы найти кнопку «Купить», надо пройти квест с гномами и драконом? Вот это и проверяем.
    • Тестирование безопасности (Security). А не залезет ли в нашу систему какой-нибудь школьник-хакер и не сольёт ли все пароли? Тоже важная хуйня, поверь.
  3. Регрессионное тестирование. Любимейший вид, ебать мои старые костыли! Починили одну багу, выпустили обновление. А не сломали ли мы при этом пятнадцать других мест, которые раньше работали? Вот чтобы этого не было, и бегаем каждый раз по старым тест-кейсам. Часто это автоматизируют, иначе с ума сойти можно.

  4. Дымовое тестирование (Smoke/Sanity Check). Это как быстрый «понюхал — не воняет?». После каждой новой сборки запускаем пару ключевых тестов: запускается ли вообще приложение? Можно ли залогиниться? Если даже это не работает — дальше можно не проверять, всё равно сплошной пиздец. Экономит время, блядь.

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

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def test_user_login():
    driver = webdriver.Chrome()
    try:
        driver.get("https://app.example.com/login")
        # Ввод данных
        driver.find_element(By.ID, "username").send_keys("test_user@mail.com")
        driver.find_element(By.ID, "password").send_keys("SecurePass123!")
        driver.find_element(By.XPATH, "//button[@type='submit']").click()

        # Явное ожидание и проверка успешного входа
        welcome_element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "welcome-message"))
        )
        assert "Welcome, test_user" in welcome_element.text
        print("Login test PASSED")
    finally:
        driver.quit()

# Запуск теста
if __name__ == "__main__":
    test_user_login()

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

Короче, тестирование — это вам не хухры-мухры, это серьёзная работа. Чтобы не получилось как с той Муму: вроде всё написали, а в итоге систему пришлось «топить», потому что она на всех серила, блядь.