# Принципы программирования

### **1. SOLID** — принципы ООП-дизайна

(часто спрашивают даже у автотестеров)

1. **S** — *Single Responsibility Principle* (Принцип единственной ответственности)\
   → Класс/метод должен иметь только одну зону ответственности.\
   **Пример в тестах:**
   * Класс `LoginPage` только описывает элементы страницы и действия на ней, а не выполняет API-запросы.
2. **O** — *Open/Closed Principle* (Открыт для расширения, закрыт для изменения)\
   → Легко добавлять функционал через наследование/композицию, не меняя старый код.
3. **L** — *Liskov Substitution Principle* (Принцип подстановки Лисков)\
   → Подклассы должны полностью заменять базовые классы без изменения поведения.
4. **I** — *Interface Segregation Principle* (Принцип разделения интерфейсов)\
   → Не заставлять класс реализовывать лишние методы.
5. **D** — *Dependency Inversion Principle* (Инверсия зависимостей)\
   → Модули верхнего уровня не должны зависеть от модулей нижнего уровня напрямую.

***

### **2. DRY, KISS, YAGNI**

* **DRY** (*Don't Repeat Yourself*) — избегай дублирования кода.\
  → Выноси повторяющуюся логику в функции/фикстуры.
* **KISS** (*Keep It Simple, Stupid*) — пиши проще.\
  → Чем меньше ненужной абстракции, тем лучше.
* **YAGNI** (*You Aren’t Gonna Need It*) — не реализуй то, что не нужно сейчас.\
  → Не трать время на “а вдруг потом понадобится”.

***

### **3. PEP 8 и Code Style**

* Единый стиль кода: отступы, длина строк, имена переменных, docstring.
* Понятные названия методов (`test_login_success`, а не `tl_scs`).

***

### **4. Чистая архитектура (Clean Architecture)**

* Разделение кода на **слои**:
  * Доменная логика (что тестируем).
  * Интерфейсы (API, UI, БД).
  * Инфраструктура (логирование, конфиги).
* В тестах это часто выражается в **Page Object Model** или **Screenplay Pattern**.

***

### **5. Принципы тестового кода**

* **AAA** (*Arrange – Act – Assert*) — структура теста:
  1. Arrange (Подготовка данных и окружения).
  2. Act (Выполнение действия).
  3. Assert (Проверка результата).
* **FIRST** (для тестов):
  * **F** — Fast (быстрые).
  * **I** — Independent (независимые).
  * **R** — Repeatable (повторяемые).
  * **S** — Self-Validating (сами проверяют результат).
  * **T** — Timely (пишутся вовремя, а не после релиза).

***

### **6. Принципы проектирования автотестов**

* Локаторы и тестовые данные не должны быть захардкожены в тестах.
* Логика повторного использования — в фикстурах и утилитах.
* Минимум зависимости тестов друг от друга.
