
Cursor пишет вам unit‑тесты за минуту. 5 паттернов, на которых эти тесты пропустят любой баг
badcasedaily1 только что Cursor пишет вам unit‑тесты за минуту. 5 паттернов, на которых эти тесты пропустят любой баг Средний 6 мин 8 Блог компании OTUS Искусственный интеллект Тестирование IT-систем * Java *...
Вот важная новость с фронта ИИ: badcasedaily1 только что Cursor пишет вам unit‑тесты за минуту. 5 паттернов, на которых эти тесты пропустят любой баг Средний 6 мин 8 Блог компании OTUS Искусственный интеллект Тестирование IT-систем * Java * Программирование * Мнение Cursor пишет тесты быстро. Открыл класс, нажал Ctrl+I, кинул промпт «напиши unit‑тесты» — через минуту в файле сорок строк с моками, ассертами и красивыми именами вроде shouldReturnUserWhenIdIsValid.
Закоммитил, замержил, побежал дальше. Покрытие в проекте растёт, скорость написания тестов раза в три‑четыре выше, чем руками. А потом замечаешь, что тесты есть, а толку от них всё меньше.
Технические детали
Регрессия пролетает мимо них и падает в проде. Открываешь тот самый тест, который должен был это ловить, — формально зелёный, но если присмотреться, не проверяет вообще ничего. Ниже — пять типичных паттернов вайбкодинга unit‑тестов, которые сейчас встречаются практически в каждом проекте, где разработчики делегируют тесты Cursor, Copilot или Claude.
Примеры на Java с JUnit и Mockito, но в pytest и Jest картина один в один. Cursor пишет один happy‑path тест и считает работу выполненной@Test void shouldDivideTwoNumbers() { assertEquals(2, calculator. divide(10, 5)); }Один тест на счастливый путь, и на этом Cursor останавливается — никаких проверок «что, если делитель ноль», «что, если переполнение int», «что, если оба значения отрицательные».
Сделал ровно то, что просили: «напиши тест для метода divide», метод делит два числа — вот тест на деление двух чисел. От регрессий защита нулевая, можно сломать в divide вообще всё, кроме случая 10 / 5 = 2, и тест останется зелёным. Лечится тем, что edge cases приходится проговаривать в промпте явно: «напиши тесты для divide, включая граничные случаи — деление на ноль, переполнение, отрицательные значения, ноль в делимом».
Отраслевые последствия
После такой формулировки Cursor выдаёт уже три‑пять тестов вместо одного. Но просить нужно каждый раз, сам по дефолту edge cases часто не вспоминает, останавливается на самом простом сценарии. Ассерт по строке там, где надо было по значениюassertEquals( "User created successfully", response.
getMessage() );Cursor взял текущее значение из реализации и зафиксировал его в тесте. Через полгода продактам надоело «User created successfully», переименовали на «Пользователь зарегистрирован» и двести тестов краснеют разом, хотя в коде ничего не сломано. Если в ассерте сравнивается строка, рядом должен быть комментарий о том, почему важна именно эта строка — контракт с фронтом, документация API, ещё какая‑то внешняя завязка.
Если такого объяснения нет, проверять надо структуру, а не текст:assertThat(response. CREATED); assertThat(response.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





