В чем разница static переменной в классе и для чего она используется
Что проверяют
Понимаете ли вы, что статическое поле одно на весь класс, а не на каждый объект, и чем это оборачивается в автотестах. Для QA следом почти всегда спрашивают, что будет со статическим WebDriver при параллельном запуске тестов.
Как отвечать
Начните с определения. Обычное поле принадлежит экземпляру, у каждого объекта своя копия. Статическое принадлежит типу: копия одна, все экземпляры видят одно и то же значение, а обращаются к нему через имя класса, без создания объекта.
Дальше детали, которые показывают, что вы писали код, а не читали определение:
- время жизни: статическое поле инициализируется один раз, при первом обращении к классу, и живёт, пока класс загружен, то есть обычно весь прогон тестов. В C# для этого есть статический конструктор, в Java блок
static {}; - константы: в C#
constподставляется при компиляции и неявно статический, аstatic readonlyвычисляется в рантайме. В Java аналогstatic final; - применения: счётчики экземпляров, кэши, настройки окружения, прочитанные один раз, фабрики и синглтоны;
- потоки: одно поле на все потоки, поэтому
count++из нескольких потоков теряет значения. НуженInterlocked.Incrementв C# илиAtomicIntegerв Java.
Для тестировщика главное следствие: статическое состояние общее для всех тестов прогона. Когда NUnit с [Parallelizable], xUnit или TestNG с parallel="methods" запускают тесты параллельно, а драйвер лежит в статическом поле, потоки начинают управлять одним браузером. Решение: ThreadLocal<IWebDriver> в C# или ThreadLocal<WebDriver> в Java, либо свой экземпляр драйвера на каждый тест.
Где спотыкаются
Хвалят static за «экономию памяти». Экономия копеечная, а цена в виде общего изменяемого состояния заметная.
Держат в статических полях данные теста: созданного пользователя, токен, номер заказа. Тесты начинают зависеть от порядка запуска и падают только в CI, где порядок и параллельность другие.
Путают static с неизменяемостью. Статическое поле спокойно меняется, неизменным его делает только readonly или final.