AI Roo Code для тестировщика: как превратить обязательные запросы к DeepSeek в реальную пользу

AI

Редактор
Регистрация
23 Август 2023
Сообщения
3 600
Лучшие ответы
0
Реакции
0
Баллы
243
Offline
#1

TL;DR


Если вас заставляют делать N запросов к локальному DeepSeek в день — эта статья про то, как получать от них реальную пользу. Покажу, как с помощью Roo Code разобраться в чужом модульном Android-проекте и написать Kaspresso-тесты за 20 минут вместо нескольких часов. С конкретными промптами и решением проблемы «невидимых» id элементов.

Проблема, о которой не говорят вслух


Многие компании сейчас внедряют AI — кто добровольно, кто принудительно. Разворачивают локальный DeepSeek, устанавливают нормы: столько-то запросов в день, столько-то в месяц. Метрики есть, а польза? 🤔

Знакомая ситуация?


  • Чат с DeepSeek открыт в соседней вкладке


  • Вы копируете туда куски кода и получаете абстрактные ответы


  • AI не видит ваш проект, не понимает контекст


  • В итоге запросы делаются «для галочки»

Проблема не в AI и не в инженере. Проблема в инструменте.

Чат без интеграции с кодом — это Google с человеческим лицом. Он не знает, что у вас 12 модулей, не видит ваши layouts, не понимает, какие тесты уже написаны.

Roo Code подключается к тому же DeepSeek, но работает внутри IDE. Те же запросы — но с контекстом всего проекта. Разница как между «гуглить симптомы» и «показать снимок врачу».

Типичные боли QA-инженера

1. Модульный проект — чёрный ящик


app/
├── feature-auth/
├── feature-booking/
├── feature-profile/
├── core-ui/
├── core-network/
└── core-analytics/


Откуда берётся этот BookingViewModel? Где живёт RoomRepository? В каком модуле искать экран, который вы тестируете?

Новый человек в команде тратит первую неделю на археологию вместо тестов.

2. Элементы без id или с динамическими id


// Тест падает с ошибкой:
// NoMatchingViewException: No views in hierarchy found matching...
onView(withId(R.id.booking_button)).perform(click())


Элемент есть на экране, но тест его «не видит». Причины: Compose без testTag, RecyclerView с динамикой, кастомные View, элемент скрыт по умолчанию.

3. Миграция между фреймворками


Команда долго писала на Espresso, потом безопасники попросили сменить инструмент. Переписывать 200 тестов вручную?

Решение: Roo Code + ваш корпоративный DeepSeek


Roo Code — расширение для VS Code (и форков: Cursor, Windsurf), которое работает с полным контекстом проекта.

Ключевое отличие от чата:

Чат с DeepSeek​

Roo Code + DeepSeek​

Видит только то, что вы скопировали​

Видит всю структуру проекта​

Не знает про другие модули​

Анализирует зависимости между модулями​

Ответы абстрактные​

Ответы с конкретными путями к файлам​

Код нужно копировать вручную​

Создаёт файлы напрямую в проекте​

Не знает про ваши существующие тесты​

Видит стиль команды и следует ему​



Важно: Roo Code — это не другая модель. Это способ использовать тот же DeepSeek, который у вас уже развёрнут, но эффективно.

Подключение к вашему корпоративному DeepSeek

Вариант 1: DeepSeek через Ollama


1. Установите расширение Roo Code в VS Code
2. Откройте Roo Code → Settings (шестерёнка)
3. API Provider: выберите "Ollama"
4. Base URL: http://localhost:11434
(или IP сервера: http://192.168.1.100:11434)
5. Model: deepseek-r1:7b (или какая версия у вас установлена)

Вариант 2: Корпоративный API-сервер (OpenAI-совместимый)


Большинство корпоративных решений разворачивают модели с OpenAI-совместимым API:

1. API Provider: "OpenAI Compatible"
2. Base URL: адрес сервера (спросите у DevOps, например http://llm.company.local:8000/v1)
3. API Key: ключ от админов (или пустой, если авторизация отключена)
4. Model ID: название модели на сервере (уточните у DevOps)

Проверка подключения


После настройки отправьте тестовый запрос:

Привет! Какую модель ты используешь?


Если всё работает — получите ответ с названием модели.

Типичные проблемы:

Ошибка​

Причина​

Решение​

Connection refused​

Сервер недоступен​

Проверьте URL и сетевой доступ​

401 Unauthorized​

Неверный API Key​

Уточните ключ у администратора​

Model not found​

Неверное имя модели​

Проверьте точное название на сервере​


Практика: от экрана до теста за 20 минут

Исходные данные


  • Android-проект с модульной структурой


  • Вы не знаете проект досконально


  • Задача: написать UI-тесты для экрана бронирования


  • Фреймворк: Kaspresso
Шаг 1: Разведка проекта (3 минуты)


Откройте проект в VS Code с Roo Code.

Режим: Ask (для анализа)

Проанализируй структуру проекта и ответь:

1. Какие модули отвечают за функциональность бронирования?
2. Где находятся экраны (Activity/Fragment) для бронирования?
3. Какие ViewModel и Repository используются?
4. Есть ли уже написанные UI-тесты? Если да — какой фреймворк?

Формат: краткий список с путями к файлам


Что вы получите:

## Модули бронирования
- `feature-booking` — основная логика
- `core-ui` — переиспользуемые компоненты (RoomCard, TimeSlotPicker)
- `core-network` — API клиент

## Экраны
- `BookingListFragment` → feature-booking/src/main/java/.../ui/list/
- `BookingDetailFragment` → feature-booking/src/main/java/.../ui/detail/
- `CreateBookingFragment` → feature-booking/src/main/java/.../ui/create/

## Существующие тесты
- Найдено 23 UI-теста в `app/src/androidTest/`
- Фреймворк: Kaspresso 1.5.3
- Паттерн: Screen Object в `screens/` директории


3 минуты — и вы понимаете архитектуру лучше, чем после часа чтения кода.

Это тот же DeepSeek, те же запросы в вашу норму — но с реальным результатом.

Шаг 2: Изучение стиля команды (2 минуты)


Покажи пример существующего Kaspresso-теста из проекта.
Какие Screen Objects уже созданы?
Какой naming convention используется?


Теперь вы знаете, как писать тесты консистентно с командой.

Шаг 3: Создание Screen Object (5 минут)


Режим: Code (для генерации)

Создай Kaspresso Screen Object для CreateBookingFragment.

Требования:
1. Проанализируй layout файла fragment_create_booking.xml
2. Найди все интерактивные элементы
3. Используй стиль существующих Screen Objects из проекта
4. Если у элемента нет android:id — предложи альтернативный способ поиска
5. Добавь KDoc комментарии

Сохрани в: app/src/androidTest/java/.../screens/CreateBookingScreen.kt


Результат — готовый Screen Object с обработкой элементов без id:

object CreateBookingScreen : KScreen<CreateBookingScreen>() {

override val layoutId: Int = R.layout.fragment_create_booking
override val viewClass: Class<*> = CreateBookingFragment::class.java

/** Поле выбора даты */
val datePickerField = KEditText { withId(R.id.date_picker_field) }

/** Список доступных комнат */
val roomsList = KRecyclerView(
builder = { withId(R.id.rooms_recycler) },
itemTypeBuilder = { itemType:):RoomItem) }
)

/** Кнопка подтверждения */
val confirmButton = KButton { withId(R.id.confirm_booking_button) }

// ⚠️ Элемент без id — альтернативный поиск
/** Сообщение об ошибке (нет id, ищем по тексту) */
val errorMessage = KView {
withText(R.string.booking_error_message)
}

/** Лоадер (нет id, ищем по content description) */
val loadingIndicator = KView {
withContentDescription("Loading")
}
}

Шаг 4: Решение проблемы «невидимых» элементов (5 минут)


Вот та самая боль: тест не видит элемент.

В CreateBookingFragment есть кнопка "Забронировать", но тест падает с NoMatchingViewException.

Проанализируй:
1. Layout файл fragment_create_booking.xml
2. Код фрагмента CreateBookingFragment.kt
3. Возможные причины проблемы

Предложи решения для Kaspresso.


AI проанализирует ваш конкретный код и найдёт причину:

## Причина найдена

Кнопка "Забронировать" имеет `visibility="gone"` по умолчанию.
Она появляется только после выбора комнаты и времени.

## Решение для Kaspresso

// Дождаться появления кнопки:
step("Ждём появления кнопки") {
CreateBookingScreen {
confirmButton {
// Kaspresso автоматически ждёт до 10 сек
isVisible()
click()
}
}
}


Это не абстрактный совет из интернета — это анализ вашего конкретного кода.

Шаг 5: Генерация тест-кейсов (5 минут)


На основе анализа CreateBookingFragment создай набор тест-кейсов для Kaspresso.

Требования:
1. Покрой happy path и основные edge cases
2. Используй step() для читаемости
3. Следуй стилю существующих тестов проекта

Сохрани в: app/src/androidTest/java/.../tests/CreateBookingTest.kt

Бонус: миграция с Espresso на Kaspresso


Если нужно переписать старые тесты:

В папке app/src/androidTest/java/.../espresso/ находятся старые Espresso-тесты.

Мигрируй LoginEspressoTest.kt на Kaspresso:
1. Сохрани логику тестов
2. Преобразуй в Screen Object паттерн
3. Добавь step() для читаемости


Было (Espresso):

@Test
fun testSuccessfulLogin() {
onView(withId(R.id.email_input))
.perform(typeText("test@example.com"))
onView(withId(R.id.password_input))
.perform(typeText("password123"))
onView(withId(R.id.login_button))
.perform(click())
onView(withId(R.id.main_content))
.check(matches(isDisplayed()))
}


Стало (Kaspresso):

@Test
fun successfulLogin() = run {
step("Вводим email") {
LoginScreen {
emailInput.typeText("test@example.com")
}
}
step("Вводим пароль") {
LoginScreen {
passwordInput.typeText("password123")
}
}
step("Нажимаем войти") {
LoginScreen {
loginButton.click()
}
}
step("Проверяем главный экран") {
MainScreen {
mainContent.isVisible()
}
}
}

Что НЕ сделает AI (из коробки 🙂)


Код нужно проверять. AI сгенерирует Screen Object за 5 минут. Но он может:


  • Забыть импорт


  • Использовать deprecated API


  • Угадать неправильный id

Правило: каждый сгенерированный файл — запустить и проверить компиляцию. 30 секунд, которые сэкономят 30 минут отладки.

AI не знает ваш продукт. Он не понимает, что «важный клиент» = приоритет бронирования. Бизнес-логику знаете вы.

AI не найдёт все edge cases. Он предложит очевидные сценарии. Хитрые баги находят люди.

Итого: те же запросы — другой результат

Чат с DeepSeek​

Roo Code + DeepSeek​

часы на понимание модульной структуры​

минуты​

час на создание Screen Object​

минуты​

30 минут на каждый тест-кейс​

минуты​

Абстрактные ответы про Kaspresso​

Решение для вашего конкретного кода​



Запросы идут к тому же DeepSeek. Учитываются в ту же норму. Но вместо «кормить чат бредом» — получать реальную пользу.

Первый шаг


Не обязательно ничего внедрять или согласовывать.


  1. Установите расширение Roo Code в VS Code


  2. Подключите к вашему корпоративному DeepSeek (инструкция выше)


  3. Откройте проект и спросите: «Какие модули отвечают за [фича, над которой работаете]?»

Если ответ полезен — попробуйте сгенерировать Screen Object.
Если нет — напишите в комментариях, что пошло не так.

Чек-лист промптов для QA


✅ Укажите фреймворк (Kaspresso/Espresso/Compose Testing)
✅ Ссылайтесь на существующие тесты ("в стиле LoginTest.kt")
✅ Указывайте конкретные файлы для анализа
✅ Просите решения для проблем с id
✅ Требуйте step() для читаемости
✅ Указывайте путь для сохранения файла

FAQ


Q: Запросы через Roo Code учитываются в норму?
A: Если ваша компания считает запросы к API DeepSeek — да, учитываются. Roo Code использует тот же API, просто добавляет контекст проекта к каждому запросу.

Q: Это безопасно для корпоративного кода?
A: Код не уходит наружу. Roo Code отправляет запросы на ваш локальный сервер DeepSeek — тот же, к которому вы обращаетесь через чат.

Q: Работает ли с Compose Testing?
A: Да. Укажите в промпте «Compose Testing» вместо «Kaspresso».

Q: А если проект на Java?
A: Работает. Укажите «сгенерируй на Java».

Q: Нужно ли согласовывать установку Roo Code?
A: Это расширение для VS Code, не требует админских прав. Использует тот же DeepSeek, который уже одобрен. Но если сомневаетесь — уточните у безопасников.


Вопросы и кейсы из вашей практики — в комментариях. Особенно интересны проблемы с «невидимыми» элементами в Kaspresso.
 
Яндекс.Метрика Рейтинг@Mail.ru
Сверху Снизу