Каждая часть знания должна иметь единственное, однозначное представление в системе.
Плохо (нарушение DRY):
// Тест 1
void testLoginSuccess() {
driver.findElement(By.id("username")).sendKeys("user1");
driver.findElement(By.id("password")).sendKeys("pass1");
// ...остальные шаги
}
// Тест 2
void testLoginFailure() {
driver.findElement(By.id("username")).sendKeys("wrong");
driver.findElement(By.id("password")).sendKeys("wrong");
// ...повторение тех же действий
}
Хорошо (соблюдение DRY):
class LoginSteps {
void performLogin(String user, String pass) {
driver.findElement(By.id("username")).sendKeys(user);
driver.findElement(By.id("password")).sendKeys(pass);
}
}
// Тесты теперь используют общий метод
void testLoginSuccess() {
new LoginSteps().performLogin("user1", "pass1");
}
Системы работают лучше всего, если они остаются простыми, а не усложняются.
Плохо (излишняя сложность):
@Test
void checkSearchResults() {
List<WebElement> results = driver.findElements(
By.xpath("//div[contains(@class,'result') and not(contains(@style,'hidden'))]"));
// Сложная логика проверки
}
Хорошо (простое решение):
@Test
void checkSearchResults() {
List<WebElement> results = driver.findElements(By.cssSelector(".result:visible"));
assertFalse(results.isEmpty());
}
Не добавляйте функциональность, пока она действительно не понадобится.
Плохо (преждевременная оптимизация):
// Создание сложной системы отчетности
// для проекта, который только начался
class AdvancedReportGenerator {
void generatePDF() { /*...*/ }
void generateExcel() { /*...*/ }
void generateHTML() { /*...*/ }
}
Хорошо (минимально достаточное решение):
// Простое логирование результатов пока достаточно
class SimpleLogger {
void logToConsole(String message) {
System.out.println(message);
}
}
| Принцип | Основная идея | Польза для QA |
|---|---|---|
| DRY | Избегай дублирования | Легче поддерживать тесты, меньше ошибок |
| KISS | Упрощай решения | Тесты понятнее, стабильнее |
| YAGNI | Не делай "на будущее" | Экономия времени, фокус на важном |
1. Использование шаблонов для похожих проверок
2. Вынесение общих шагов в отдельные методы
3. Параметризованные тесты
1. Четкие названия багов
2. Простые шаги воспроизведения
3. Минимально достаточная информация
1. Сначала покрываем основные сценарии
2. Не тестируем маловероятные edge-cases на ранних этапах
3. Постепенное расширение покрытия
DRY:
KISS:
YAGNI:
Эти принципы особенно важны для: