Ответ
Тестирование классифицируется по уровню детализации (уровни) и по целям/методам (виды).
Уровни тестирования (по степени изоляции компонентов)
-
Модульное (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 -
Интеграционное тестирование: Проверка взаимодействия между модулями, сервисами или системами (например, API, база данных).
-
Системное (System) тестирование: Тестирование полностью интегрированной системы на соответствие требованиям (это уровень QA-инженеров).
-
Приемочное (Acceptance) тестирование: Финальная проверка заказчиком/стейкхолдером, что система готова к релизу (UAT — User Acceptance Testing).
Ключевые виды/типы тестирования (по целям)
-
Функциональное: Проверка, что ПО работает в соответствии с функциональными требованиями (например, «Пользователь может войти в систему»).
-
Нефункциональное: Проверка характеристик системы.
- Нагрузочное (Load) и стресс-тестирование (Stress): Оценка производительности под высокой нагрузкой (инструменты: JMeter, k6).
- Тестирование удобства использования (Usability): Насколько интерфейс понятен и удобен для пользователя.
- Тестирование безопасности (Security): Поиск уязвимостей.
-
Регрессионное тестирование: Проверка, что новые изменения (фичи, фиксы) не сломали существующий функционал. Часто автоматизируется.
-
Дымовое тестирование (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+ 🔞
Э, слушай, давай я тебе про тестирование расскажу, а то ты, похоже, как тот Герасим, молчишь и нихуя не понимаешь, блядь. Это ж не просто так, «нажал кнопку — работает». Тут целая наука, ёпта!
Вот смотри, есть у нас уровни — это как бы по степени «отдельности» проверяем. И есть виды — это по тому, что именно мы проверяем, нашу систему. Понял? Ну, типа, как в армии: есть звания (уровни), а есть род войск (виды). И один мудак может быть и сержантом, и танкистом одновременно, блядь.
Уровни, или «От мелкого говна до целой системы»
-
Модульное (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'ы проходят — значит, функция не совсем говно. Пока что. -
Интеграционное тестирование. А вот тут начинается веселье. Ты взял свою функцию, которая вроде работает, и кинул её в общий котёл с другими функциями, с базой данных, с каким-нибудь внешним API. И смотришь: они там друг друга не сожрут? Данные не потеряются? Это как запустить в одну комнату трёх пьяных мужиков и одну кошку — посмотреть, что будет, блядь.
-
Системное (System) тестирование. Вот это уже работа для нас, для QA. Берём всю систему целиком — этот ваш готовый сайт или приложение — и начинаем ебашить по полной. Соответствует ли оно тому, что в требованиях написал какой-то умник-аналитик? Всё ли можно нажать, везде ли можно зайти? Это и есть основная наша работа, ёпта.
-
Приемочное (Acceptance) тестирование. А это самый смак. Это когда заказчик, тот самый, который деньги платит, садится и говорит: «А ну-ка, покажите, что вы там наделали». И если он скажет «Да, это то, что я хотел» — можно выдохнуть. А если нет... Ну, ты понял. UAT, блядь, User Acceptance Testing — последний рубеж перед релизом.
Виды, или «Чего мы хотим от этой системы, кроме как чтобы она просто работала»
-
Функциональное. Самый понятный вид, бля. «А кнопка «Войти» — она входит? А кнопка «Купить» — она покупает?». Проверяем, что система делает то, что должна делать. Всё по документации, мать её.
-
Нефункциональное. А вот тут уже интереснее. Система-то работает, но как она работает?
- Нагрузочное и стресс-тестирование. А что будет, если на ваш сайт зайдёт не один пользователь, а десять тысяч? А если сто тысяч? Он не ляжет, как сука, с перепугу? Для этого есть специальные инструменты вроде JMeter — они имитируют этих самых пользователей, только без мозгов и требований к зарплате.
- Тестирование удобства (Usability). А удобно ли этим пользователям? Может, чтобы найти кнопку «Купить», надо пройти квест с гномами и драконом? Вот это и проверяем.
- Тестирование безопасности (Security). А не залезет ли в нашу систему какой-нибудь школьник-хакер и не сольёт ли все пароли? Тоже важная хуйня, поверь.
-
Регрессионное тестирование. Любимейший вид, ебать мои старые костыли! Починили одну багу, выпустили обновление. А не сломали ли мы при этом пятнадцать других мест, которые раньше работали? Вот чтобы этого не было, и бегаем каждый раз по старым тест-кейсам. Часто это автоматизируют, иначе с ума сойти можно.
-
Дымовое тестирование (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), и функциональный (проверяет функцию входа), и может быть частью регрессионной или дымовой проверки. Вот так всё и переплетается, блядь, в один большой, сложный, но охуенно интересный клубок.
Короче, тестирование — это вам не хухры-мухры, это серьёзная работа. Чтобы не получилось как с той Муму: вроде всё написали, а в итоге систему пришлось «топить», потому что она на всех серила, блядь.