← Назад к вопросам
Какими видами тестирования занимается команда QA
1.0 Junior🔥 81 комментариев
#Тестирование
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Виды тестирования, которыми занимается QA команда
Классификация тестирования
Тестирование делится по нескольким критериям:
По типу исполнения:
├─ Manual Testing (ручное)
└─ Automated Testing (автоматизированное)
По уровню тестирования:
├─ Unit Testing
├─ Integration Testing
├─ System Testing
└─ Acceptance Testing
По типу функциональности:
├─ Functional Testing
└─ Non-Functional Testing
Unit Testing (Модульное тестирование)
Определение
Тестирование отдельных компонентов/функций в изоляции.
// Unit Test: тестируем один метод
@Test
public void testCalculateDiscount() {
// Arrange
PriceCalculator calculator = new PriceCalculator();
// Act
double discount = calculator.calculateDiscount(100, 20);
// Assert
assertEquals(20.0, discount, 0.01);
}
// Что тестируется:
// - Только метод calculateDiscount()
// - Без БД, без сети, без других зависимостей
// - Быстро (миллисекунды)
// - Изолировано
Кто делает
- Разработчики (основная ответственность)
- Иногда QA (но редко)
Инструменты
- JUnit, TestNG (Java)
- Mockito (мокирование зависимостей)
- AssertJ (assertions)
Примеры
// Unit тесты для UserService
@Test
public void testCreateUser_ValidInput() {
UserRepository repository = Mockito.mock(UserRepository.class);
UserService service = new UserService(repository);
User newUser = new User("john@example.com", "John");
service.createUser(newUser);
Mockito.verify(repository).save(newUser);
}
@Test
public void testCreateUser_InvalidEmail() {
UserRepository repository = Mockito.mock(UserRepository.class);
UserService service = new UserService(repository);
User newUser = new User("invalid-email", "John");
assertThrows(IllegalArgumentException.class, () -> {
service.createUser(newUser);
});
}
Integration Testing (Интеграционное тестирование)
Определение
Тестирование взаимодействия между несколькими компонентами/сервисами.
// Integration Test: тестируем взаимодействие UserService и БД
@SpringBootTest
@Transactional
public class UserServiceIntegrationTest {
@Autowired
private UserService userService;
@Autowired
private UserRepository userRepository;
@Test
public void testUserCreationFlow() {
// 1. Создаём пользователя через сервис
User newUser = new User("alice@example.com", "Alice");
User created = userService.createUser(newUser);
// 2. Проверяем что попал в БД
User fromDB = userRepository.findById(created.getId()).orElse(null);
// 3. Проверяем что данные целостны
assertEquals("alice@example.com", fromDB.getEmail());
}
}
// Что тестируется:
// - Взаимодействие UserService и БД
// - Реальная БД (H2 in-memory)
// - Трансакции, cascades
// - Медленнее чем Unit (но всё ещё быстро)
Кто делает
- Разработчики (основная ответственность)
- QA (в продвинутых командах)
Инструменты
- Spring Boot Test
- TestContainers (настоящие БД в Docker)
- REST Assured (тестирование API)
Примеры
// Integration тест между API и БД
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void testCreateUserEndpoint() {
// POST /api/users
HttpEntity<User> request = new HttpEntity<>(new User("bob@example.com", "Bob"));
ResponseEntity<User> response = restTemplate.postForEntity(
"/api/users",
request,
User.class
);
assertEquals(HttpStatus.CREATED, response.getStatusCode());
assertNotNull(response.getBody().getId());
}
}
System Testing (Системное тестирование)
Определение
Тестирование всей системы как одного целого, включая все компоненты.
┌────────────────────────────────────┐
│ System Under Test (SUT) │
│ ┌─────────────────────────────┐ │
│ │ Frontend (Web/Mobile) │ │
│ │ ├─ User Interface │ │
│ │ ├─ Form validation │ │
│ │ └─ Navigation │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ Backend (API) │ │
│ │ ├─ REST endpoints │ │
│ │ ├─ Business logic │ │
│ │ └─ Database │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ External services │ │
│ │ ├─ Payment gateway │ │
│ │ ├─ Email service │ │
│ │ └─ Third-party APIs │ │
│ └─────────────────────────────┘ │
└────────────────────────────────────┘
Кто делает
- QA (основная ответственность)
- Иногда разработчики (для самопроверки)
Типы System Testing
1. Functional System Testing
- Все функции работают как задумано
- Пример: "Создание заказа → Оплата → Email подтверждение"
2. Non-Functional System Testing
- Performance (скорость)
- Security (безопасность)
- Scalability (масштабируемость)
- Reliability (надёжность)
- Usability (удобство)
Примеры
// Functional System Test (end-to-end)
@Test
public void testCompleteOrderFlow() {
// 1. Открыть приложение
driver.get("https://shop.example.com");
// 2. Авторизоваться
driver.findElement(By.id("email")).sendKeys("user@example.com");
driver.findElement(By.id("password")).sendKeys("password123");
driver.findElement(By.id("login")).click();
// 3. Добавить товар в корзину
driver.findElement(By.xpath("//button[contains(text(), 'Add to Cart')]")).click();
// 4. Оформить заказ
driver.findElement(By.id("checkout")).click();
// 5. Заполнить адрес доставки
driver.findElement(By.id("address")).sendKeys("123 Main St");
// 6. Оплатить
driver.findElement(By.id("pay")).click();
// 7. Проверить подтверждение
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement confirmationMsg = wait.until(
ExpectedConditions.visibilityOfElementLocated(
By.id("success-message")
)
);
assertTrue(confirmationMsg.isDisplayed());
assertTrue(confirmationMsg.getText().contains("Order confirmed"));
}
Performance Testing (Тестирование производительности)
Определение
Тестирование скорости, отзывчивости и стабильности под нагрузкой.
// JMeter script (XML)
<httpSampler guiclass="HttpTestSampleGui">
<elementProp name="HTTPsampler.Arguments" ...>
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">api.example.com</stringProp>
<stringProp name="HTTPSampler.path">/api/users</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<stringProp name="HTTPSampler.protocol">https</stringProp>
</httpSampler>
<!-- 1000 потоков, каждый делает 10 запросов -->
<ThreadGroup guiclass="ThreadGroupGui">
<stringProp name="ThreadGroup.num_threads">1000</stringProp>
<stringProp name="ThreadGroup.ramp_time">60</stringProp>
<stringProp name="ThreadGroup.duration">300</stringProp>
</ThreadGroup>
<!-- Результаты: average response time, throughput, error rate -->
Метрики
1. Response Time — время ответа (мс)
- Ideal: < 200ms
- Acceptable: < 1000ms
- Bad: > 3000ms
2. Throughput — запросов в секунду
- Пример: 500 req/sec
3. Error Rate — процент ошибок
- Ideal: 0%
- Acceptable: < 0.1%
4. CPU & Memory — использование ресурсов
- Не должны выходить в 100%
Типы нагрузки
1. Load Testing
- Normal load
- Ожидаемое количество пользователей
- Пример: 1000 одновременных пользователей
2. Stress Testing
- Beyond normal capacity
- До какого момента система не сломается
- Пример: 10000 одновременных пользователей
3. Soak Testing
- Long-running load
- Проверить memory leaks
- Пример: 1000 пользователей × 24 часа
Security Testing (Тестирование безопасности)
Типы
1. Authentication Testing
- Правильно ли проверяется пароль
- Работает ли 2FA
- Сессии не утекают
2. Authorization Testing
- Пользователь видит только свои данные
- Admin может делать то что обычный пользователь
- Role-based access work
3. SQL Injection Testing
- SELECT * FROM users WHERE id = 1' OR '1'='1
- Защита от вставки SQL
4. CSRF/XSS Testing
- Cross-Site Request Forgery
- Cross-Site Scripting
5. API Security
- Rate limiting
- Token expiration
- HTTPS enforcement
Пример
// Security Test
@Test
public void testUnauthorizedAccess() {
// Без токена
HttpEntity<Void> request = new HttpEntity<>(null);
ResponseEntity<String> response = restTemplate.exchange(
"/api/admin/users",
HttpMethod.GET,
request,
String.class
);
assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
}
@Test
public void testSQLInjection() {
String maliciousInput = "1' OR '1'='1";
// Должна быть параметризованная query, не конкатенированная
User user = userRepository.findByIdSafe(maliciousInput);
assertNull(user); // Injection не сработала
}
Usability Testing (Тестирование удобства)
Определение
Тестирование user experience, интерфейса, навигации.
1. Navigation Testing
- Можно ли пользователю легко найти то что нужно
- Кнопки и ссылки видны
- Меню логично организовано
2. Accessibility Testing
- Работает ли для людей с ограничениями
- Screen readers
- Keyboard navigation
- Color contrast для слабовидящих
3. Cross-browser Testing
- Chrome, Firefox, Safari, Edge
- Мобильные браузеры
- Old browsers (IE)
4. Responsive Testing
- Mobile (320px)
- Tablet (768px)
- Desktop (1920px)
Пример
1. Человек открывает сайт
2. Он ищет кнопку "Купить"
3. Может ли он её найти за 5 секунд?
4. Какие ошибки он делает?
5. На каких элементах он зависает?
6. Интуитивен ли процесс?
Acceptance Testing (Приёмочное тестирование)
Определение
Тестирование что система соответствует требованиям бизнеса.
# Behavior-Driven Development (BDD) format
Feature: User Registration
Scenario: Register with valid email
Given user is on registration page
When user enters "john@example.com"
And user enters password "Password123"
And user clicks "Register" button
Then user should see "Registration successful"
And user should be logged in
Scenario: Register with duplicate email
Given user "alice@example.com" already exists
When user tries to register with "alice@example.com"
Then user should see error "Email already exists"
Инструменты
- Cucumber (BDD)
- Robot Framework (Keyword-driven)
- FitNesse (Table-driven)
Regression Testing (Регрессионное тестирование)
Определение
Перетестирование старых функций после изменений, чтобы убедиться что ничего не сломалось.
// После каждого деплоя перетестируем все старые тесты
// Если что-то новое сломало старое — это регрессия
// Пример регрессии:
// Feature 1: Login — работает 2 года
// Feature 2: OAuth — добавили вчера
// Сегодня обнаружили что Login сломался из-за OAuth
// Это регрессия → нужно регрессионное тестирование
Smoke Testing (Дымовое тестирование)
Определение
Быстрое поверхностное тестирование основных функций после деплоя.
// Smoke тест перед полным тестированием
// Занимает 30 минут
public class SmokeTest {
@Test
public void testAppStartup() { /* открыть app */ }
@Test
public void testLogin() { /* залогиниться */ }
@Test
public void testMainFeatures() { /* основные функции */ }
// Если хоть один упал — не запускаем полное тестирование
}
Чек-лист видов тестирования
| Тип | Кто делает | Автоматизация | Скорость | Покрытие |
|---|---|---|---|---|
| Unit | Разработчик | 100% | ⭐⭐⭐⭐⭐ | Функции |
| Integration | Разработчик | 80% | ⭐⭐⭐⭐ | Компоненты |
| System | QA | 70% | ⭐⭐⭐ | Весь продукт |
| Performance | QA | 60% | ⭐⭐⭐ | Нагрузка |
| Security | QA | 40% | ⭐⭐ | Уязвимости |
| Usability | QA | 0% (manual) | ⭐⭐ | UX |
| Acceptance | QA | 50% | ⭐⭐⭐ | Требования |
| Regression | QA | 90% | ⭐⭐⭐ | Регрессии |
| Smoke | QA | 100% | ⭐⭐⭐⭐⭐ | Основное |
Пирамида тестирования
╱╲ E2E тесты (少ないが遅い)
╱ ╲
╱────╲ Integration тесты (много, средне быстро)
╱ ╲
╱────────╲ Unit тесты (много, очень быстро)
╱__________╲
Вывод
QA команда занимается:
- Unit Testing (опционально)
- Integration Testing (часто с разработчиками)
- System Testing (ежедневно)
- Performance Testing (перед релизом)
- Security Testing (критично)
- Usability Testing (постоянно)
- Acceptance Testing (по требованиям)
- Regression Testing (после каждого деплоя)
- Smoke Testing (перед полным тестированием)
Best Practice: Пирамида тестирования — много unit тестов, среднее количество integration, мало E2E.