Введение в Katalon Studio

Katalon Studio — это комплексная all-in-one платформа для автоматизации тестирования, которая сочетает простоту бескодового тестирования с мощностью скриптовой автоматизации. Построенный поверх Selenium и Appium, Katalon предоставляет унифицированное решение для тестирования web, API, mobile и desktop приложений без необходимости обширных знаний программирования.

В отличие от традиционных фреймворков тестирования, требующих значительной настройки и конфигурации, Katalon Studio предлагает интегрированную среду разработки (IDE) со встроенными возможностями для создания, выполнения, отчётности и интеграции тестов — всё в одном пакете.

Почему Выбрать Katalon Studio?

Ключевые Преимущества:

  • Нулевая Настройка: Готов к использованию сразу после установки
  • Мультиплатформенная Поддержка: Web, API, Mobile (iOS/Android), Desktop (Windows)
  • Двойной Режим: Запись и воспроизведение для новичков, скриптинг (Groovy) для продвинутых
  • Встроенный Object Repository: Умное управление и поддержка объектов
  • Нативные Интеграции: Jira, Git, Jenkins, Azure DevOps, TestRail
  • Самовосстанавливающиеся Тесты: AI-powered исцеление локаторов элементов
  • Богатая Отчётность: Встроенная аналитика, скриншоты, видео, логи

Начало Работы с Katalon Studio

Установка и Настройка

  1. Скачать Katalon Studio с https://katalon.com/
  2. Не требуются дополнительные драйверы или зависимости
  3. Активировать аккаунт (доступен бесплатный tier)
  4. Начать создавать тесты немедленно

Понимание Интерфейса

Основные Компоненты:

КомпонентНазначениеОписание
Test ExplorerНавигация по проектуОрганизация тестов, тестовых сюит, файлов данных
Test Case EditorСоздание тестовРежимы Manual, Script и Keyword
Object RepositoryХранение элементовЦентрализованное управление web/mobile элементами
Test Suite CollectionОркестрация тестовГруппировка и конфигурация выполнения тестов
ReportsАнализ результатовВстроенные HTML отчёты со скриншотами
Script EditorКастомный скриптингКастомные keywords и логика на Groovy

Структура Проекта

KatalonProject/
├── Test Cases/
│   ├── Web/
│   │   ├── Login/
│   │   │   └── TC_Login_Valid.groovy
│   │   └── Checkout/
│   │       └── TC_Checkout_Success.groovy
│   ├── API/
│   │   └── User_API_Tests.groovy
│   └── Mobile/
│       └── App_Navigation.groovy
├── Object Repository/
│   ├── Web/
│   │   ├── LoginPage/
│   │   └── DashboardPage/
│   └── Mobile/
│       └── HomeScreen/
├── Test Suites/
│   ├── Smoke_Test_Suite.ts
│   └── Regression_Suite.ts
├── Test Listeners/
├── Keywords/
│   └── CustomKeywords.groovy
├── Data Files/
│   ├── user_data.xlsx
│   └── test_config.csv
├── Checkpoints/
├── Reports/
└── Profiles/
    ├── default.glbl
    ├── staging.glbl
    └── production.glbl

Web-Тестирование с Katalon

Запись и Воспроизведение

Web Recorder Katalon идеален для быстрого создания тестов:

Шаги:

  1. Нажать кнопку Record Web
  2. Ввести URL приложения
  3. Взаимодействовать с приложением (Katalon записывает все действия)
  4. Остановить запись
  5. Просмотреть и отредактировать сгенерированные шаги теста
  6. Выполнить тест

Пример Записанного Теста:

import static com.kms.katalon.core.testobject.ObjectRepository.findTestObject
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI

// Открыть браузер
WebUI.openBrowser('')

// Перейти по URL
WebUI.navigateToUrl('https://demo.example.com')

// Максимизировать окно
WebUI.maximizeWindow()

// Ввести имя пользователя
WebUI.setText(findTestObject('Object Repository/LoginPage/input_username'), 'testuser')

// Ввести пароль
WebUI.setEncryptedText(findTestObject('Object Repository/LoginPage/input_password'), 'encrypted_password')

// Нажать кнопку логина
WebUI.click(findTestObject('Object Repository/LoginPage/btn_login'))

// Проверить отображение dashboard
WebUI.verifyElementPresent(findTestObject('Object Repository/Dashboard/lbl_welcome'), 10)

// Закрыть браузер
WebUI.closeBrowser()

Режим Ручного Скриптинга

Для большего контроля используйте ручной режим со встроенными keywords:

import static com.kms.katalon.core.testobject.ObjectRepository.findTestObject
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import com.kms.katalon.core.model.FailureHandling as FailureHandling

WebUI.comment('Тест-кейс: Проверка Поиска и Фильтрации Продуктов')

// Настройка
WebUI.openBrowser('')
WebUI.navigateToUrl('https://shop.example.com')
WebUI.maximizeWindow()
WebUI.waitForPageLoad(10)

// Поиск продукта
WebUI.setText(findTestObject('Shop/input_search'), 'ноутбук')
WebUI.click(findTestObject('Shop/btn_search'))

// Применить фильтры
WebUI.waitForElementPresent(findTestObject('Shop/filter_price'), 10)
WebUI.click(findTestObject('Shop/filter_price_500_1000'))
WebUI.click(findTestObject('Shop/filter_brand_dell'))

// Проверить результаты
int productCount = WebUI.getNumberOfTotalOption(findTestObject('Shop/product_cards'))
WebUI.verifyGreaterThan(productCount, 0)

// Проверить детали продукта
WebUI.verifyElementText(findTestObject('Shop/first_product_title'), 'Dell Laptop')
String price = WebUI.getText(findTestObject('Shop/first_product_price'))
assert price.contains('₽') : 'Цена должна содержать знак рубля'

// Скриншот
WebUI.takeScreenshot('screenshots/product_search_results.png')

// Очистка
WebUI.closeBrowser()

Управление Object Repository

Object Repository Katalon централизует управление элементами:

Свойства Объекта:

// Объект: LoginPage/input_username
// Методы Селектора (упорядочены по приоритету):
1. Атрибуты: id = 'username'
2. XPath: //input[@id='username']
3. CSS: input#username

// Объект: LoginPage/btn_submit
// Самовосстановление включено: Да
// Методы Селектора:
1. Атрибуты: id = 'submit-btn'
2. XPath: //button[@type='submit']
3. CSS: button[type='submit']
4. Текст: 'Войти'

Использование Object Spy:

  1. Запустить инструмент Object Spy
  2. Захватить web-элементы визуально
  3. Просмотреть предложенные локаторы
  4. Добавить в Object Repository
  5. Использовать в тест-кейсах через findTestObject()

Возможности API-Тестирования

RESTful API Тестирование

Katalon превосходен в API-тестировании без дополнительных плагинов:

import com.kms.katalon.core.testobject.RequestObject
import com.kms.katalon.core.testobject.ResponseObject
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import groovy.json.JsonSlurper

// Тест-кейс: Создать и Проверить Пользователя
WebUI.comment('API Тест: Создание Пользователя и Проверка Ответа')

// Создать пользователя через POST
RequestObject createUserRequest = findTestObject('API/Users/POST_CreateUser')

// Установить тело запроса
def requestBody = [
    username: 'новыйпользователь',
    email: 'новыйпользователь@example.com',
    firstName: 'Иван',
    lastName: 'Иванов',
    role: 'tester'
]

createUserRequest.setBodyContent(new groovy.json.JsonBuilder(requestBody).toString())

// Отправить запрос
ResponseObject createResponse = WS.sendRequest(createUserRequest)

// Проверить статус ответа
WS.verifyResponseStatusCode(createResponse, 201)

// Распарсить ответ
def jsonSlurper = new JsonSlurper()
def responseData = jsonSlurper.parseText(createResponse.getResponseBodyContent())

// Проверить данные ответа
assert responseData.username == 'новыйпользователь'
assert responseData.email == 'новыйпользователь@example.com'
assert responseData.id != null

String userId = responseData.id

// GET детали пользователя
RequestObject getUserRequest = findTestObject('API/Users/GET_UserById')
getUserRequest.setRestUrl("https://api.example.com/users/${userId}")

ResponseObject getResponse = WS.sendRequest(getUserRequest)

// Проверить GET ответ
WS.verifyResponseStatusCode(getResponse, 200)
def userData = jsonSlurper.parseText(getResponse.getResponseBodyContent())
assert userData.username == 'новыйпользователь'

// Проверить время ответа
long responseTime = getResponse.getResponseTime()
assert responseTime < 2000 : "Время ответа должно быть меньше 2 секунд"

// Проверить заголовки
WS.verifyElementPropertyValue(getResponse, 'Content-Type', 'application/json')

println("Пользователь успешно создан с ID: ${userId}")

Конфигурация API Test Object

Web Service Request Object:

// Object Repository/API/Users/POST_CreateUser

[Request]
Тип: RESTful
Метод: POST
URL: https://api.example.com/users
Headers:
  - Authorization: Bearer ${GlobalVariable.API_TOKEN}
  - Content-Type: application/json
Body:
{
  "username": "${username}",
  "email": "${email}",
  "role": "tester"
}

[Проверка]
Код Статуса: 201
Время Ответа: < 3000ms

API Test Suites с Data-Driven Testing

import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import internal.GlobalVariable as GlobalVariable

// Data-driven API тестирование
def testData = findTestData('Data Files/API_Users')

for (int i = 1; i <= testData.getRowNumbers(); i++) {
    String username = testData.getValue('username', i)
    String email = testData.getValue('email', i)
    String expectedStatus = testData.getValue('expected_status', i)

    // Создать запрос
    def request = findTestObject('API/Users/POST_CreateUser')
    def body = [username: username, email: email]
    request.setBodyContent(new groovy.json.JsonBuilder(body).toString())

    // Отправить и проверить
    def response = WS.sendRequest(request)
    WS.verifyResponseStatusCode(response, expectedStatus.toInteger())

    println("Тест ${i}: ${username} - Статус ${expectedStatus} - ПРОШЁЛ")
}

Mobile Тестирование (iOS & Android)

Настройка Mobile Тестов

import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as Mobile
import com.kms.katalon.core.configuration.RunConfiguration

// Настроить desired capabilities
RunConfiguration.setWebDriverPreferencesProperty("appium:platformName", "Android")
RunConfiguration.setWebDriverPreferencesProperty("appium:deviceName", "Pixel 5")
RunConfiguration.setWebDriverPreferencesProperty("appium:app", "/путь/к/app.apk")

// Запустить приложение
Mobile.startApplication('путь/к/app.apk', false)

// Ожидать элемент
Mobile.waitForElementPresent(findTestObject('Mobile/HomeScreen/btn_login'), 10)

// Тапнуть по элементу
Mobile.tap(findTestObject('Mobile/HomeScreen/btn_login'), 5)

// Ввести текст
Mobile.setText(findTestObject('Mobile/LoginScreen/input_username'), 'testuser', 0)
Mobile.setText(findTestObject('Mobile/LoginScreen/input_password'), 'password', 0)

// Скрыть клавиатуру
Mobile.hideKeyboard()

// Тапнуть логин
Mobile.tap(findTestObject('Mobile/LoginScreen/btn_submit'), 5)

// Проверить навигацию
Mobile.verifyElementExist(findTestObject('Mobile/Dashboard/lbl_welcome'), 10)

// Действия свайпа
Mobile.swipe(100, 500, 100, 200) // Свайп вверх

// Закрыть приложение
Mobile.closeApplication()

Кросс-Платформенное Mobile Тестирование

// Кастомный keyword для кросс-платформенного тестирования
class MobileHelper {

    @Keyword
    def launchApp(String platform) {
        if (platform == 'iOS') {
            RunConfiguration.setWebDriverPreferencesProperty("appium:platformName", "iOS")
            RunConfiguration.setWebDriverPreferencesProperty("appium:deviceName", "iPhone 14")
            RunConfiguration.setWebDriverPreferencesProperty("appium:app", "/путь/к/app.ipa")
        } else {
            RunConfiguration.setWebDriverPreferencesProperty("appium:platformName", "Android")
            RunConfiguration.setWebDriverPreferencesProperty("appium:deviceName", "Pixel 5")
            RunConfiguration.setWebDriverPreferencesProperty("appium:app", "/путь/к/app.apk")
        }

        Mobile.startApplication(GlobalVariable.MOBILE_APP, false)
    }

    @Keyword
    def loginUser(String username, String password, String platform) {
        def usernameField = platform == 'iOS' ?
            'Mobile/iOS/input_username' : 'Mobile/Android/input_username'
        def passwordField = platform == 'iOS' ?
            'Mobile/iOS/input_password' : 'Mobile/Android/input_password'

        Mobile.setText(findTestObject(usernameField), username, 5)
        Mobile.setText(findTestObject(passwordField), password, 5)
        Mobile.tap(findTestObject("Mobile/${platform}/btn_login"), 5)
    }
}

Продвинутые Возможности и Паттерны

Кастомные Keywords

Расширьте возможности Katalon кастомными Groovy keywords:

// Keywords/CustomWebKeywords.groovy
package com.example.keywords

import com.kms.katalon.core.annotation.Keyword
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import org.openqa.selenium.WebElement

class CustomWebKeywords {

    @Keyword
    def waitAndClick(TestObject testObject, int timeout = 10) {
        WebUI.waitForElementClickable(testObject, timeout)
        WebUI.click(testObject)
    }

    @Keyword
    def scrollToElement(TestObject testObject) {
        WebElement element = WebUI.findWebElement(testObject, 10)
        WebUI.executeJavaScript(
            "arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});",
            Arrays.asList(element)
        )
        WebUI.delay(1)
    }

    @Keyword
    def verifyElementTextContains(TestObject testObject, String expectedText) {
        String actualText = WebUI.getText(testObject)
        assert actualText.contains(expectedText) :
            "Ожидаемый текст '${expectedText}' не найден в '${actualText}'"
    }

    @Keyword
    String generateRandomEmail(String domain = 'example.com') {
        String randomString = UUID.randomUUID().toString().substring(0, 8)
        return "test_${randomString}@${domain}"
    }

    @Keyword
    def loginAsUser(String username, String password) {
        WebUI.setText(findTestObject('LoginPage/input_username'), username)
        WebUI.setEncryptedText(findTestObject('LoginPage/input_password'), password)
        WebUI.click(findTestObject('LoginPage/btn_login'))
        WebUI.waitForElementPresent(findTestObject('Dashboard/lbl_welcome'), 10)
    }
}

Использование:

import com.example.keywords.CustomWebKeywords

CustomWebKeywords custom = new CustomWebKeywords()

// Использовать кастомные keywords
custom.scrollToElement(findTestObject('Page/btn_submit'))
custom.waitAndClick(findTestObject('Page/btn_submit'))

String email = custom.generateRandomEmail('testdomain.com')
custom.verifyElementTextContains(findTestObject('Page/lbl_message'), 'Успешно')

custom.loginAsUser('admin', 'encrypted_password')

Глобальные Переменные и Профили

Управляйте конфигурациями для разных окружений:

// Profiles/default.glbl
GlobalVariable.BASE_URL = 'https://staging.example.com'
GlobalVariable.API_TOKEN = 'staging_api_token_here'
GlobalVariable.TIMEOUT = 10

// Profiles/production.glbl
GlobalVariable.BASE_URL = 'https://example.com'
GlobalVariable.API_TOKEN = 'production_api_token_here'
GlobalVariable.TIMEOUT = 15

// Использование в тестах
WebUI.navigateToUrl(GlobalVariable.BASE_URL + '/login')

Test Listeners для Кастомной Логики

// Test Listeners/TestListener.groovy
import com.kms.katalon.core.annotation.AfterTestCase
import com.kms.katalon.core.annotation.BeforeTestCase
import com.kms.katalon.core.context.TestCaseContext

class TestListener {

    @BeforeTestCase
    def beforeTestCase(TestCaseContext testCaseContext) {
        println("Запуск теста: ${testCaseContext.getTestCaseId()}")
        // Кастомная логика настройки
        // Инициализация тестовых данных
        // Настройка соединений с БД
    }

    @AfterTestCase
    def afterTestCase(TestCaseContext testCaseContext) {
        println("Завершён тест: ${testCaseContext.getTestCaseId()}")

        if (testCaseContext.getTestCaseStatus() == "FAILED") {
            // Сделать скриншот при падении
            WebUI.takeScreenshot("failures/${testCaseContext.getTestCaseId()}.png")

            // Залогировать дополнительную отладочную информацию
            println("Тест упал в: " + new Date())

            // Отправить уведомление
            // sendSlackNotification(testCaseContext)
        }

        // Очистка
        WebUI.closeBrowser()
    }
}

CI/CD Интеграция

Интеграция с Jenkins

// Jenkinsfile
pipeline {
    agent any

    stages {
        stage('Checkout') {
            steps {
                git 'https://github.com/yourorg/katalon-tests.git'
            }
        }

        stage('Запуск Тестов') {
            steps {
                script {
                    def katalonStudio = '/Applications/Katalon Studio.app/Contents/MacOS/katalon'

                    sh """
                        "${katalonStudio}" \
                        -noSplash \
                        -runMode=console \
                        -projectPath="${WORKSPACE}/YourProject.prj" \
                        -retry=0 \
                        -testSuiteCollectionPath="Test Suites/Regression_Suite" \
                        -executionProfile="production" \
                        -browserType="Chrome (headless)" \
                        -apiKey="${KATALON_API_KEY}" \
                        --config -webui.autoUpdateDrivers=true
                    """
                }
            }
        }

        stage('Публикация Отчётов') {
            steps {
                publishHTML([
                    reportDir: 'Reports',
                    reportFiles: 'report.html',
                    reportName: 'Katalon Test Report'
                ])
            }
        }
    }

    post {
        always {
            junit 'Reports/**/*.xml'
        }
    }
}

Docker Интеграция

# Dockerfile
FROM katalonstudio/katalon:latest

# Копировать проект
COPY . /katalon/project

# Запустить тесты
CMD katalon -noSplash -runMode=console \
    -projectPath=/katalon/project/YourProject.prj \
    -testSuiteCollectionPath="Test Suites/Smoke_Tests" \
    -browserType="Chrome (headless)" \
    -apiKey=$KATALON_API_KEY

Best Practices и Оптимизация

1. Организовывайте Тесты Иерархически

Test Cases/
├── Smoke/
│   ├── Web/
│   └── API/
├── Regression/
│   ├── Critical/
│   └── Medium/
└── Integration/

2. Используйте Паттерн Page Object

Создавайте переиспользуемые классы страниц:

// Keywords/pages/LoginPage.groovy
class LoginPage {
    static def usernameField = 'LoginPage/input_username'
    static def passwordField = 'LoginPage/input_password'
    static def loginButton = 'LoginPage/btn_login'

    @Keyword
    static def login(String username, String password) {
        WebUI.setText(findTestObject(usernameField), username)
        WebUI.setText(findTestObject(passwordField), password)
        WebUI.click(findTestObject(loginButton))
    }
}

3. Включите Self-Healing

Настройте self-healing в Project Settings:

  • Включить self-healing execution
  • Установить резервные стратегии локаторов
  • Регулярно просматривать исцелённые элементы

4. Оптимизируйте Выполнение

// Параллельное выполнение в Test Suite Collection
// Включить в настройках Test Suite Collection:
- Максимум параллельных инстансов: 4
- Запускать с: Chrome (headless)

Сравнение с Другими Инструментами

ХарактеристикаKatalon StudioSelenium + JavaCypressTestComplete
Сложность НастройкиНетВысокаяНизкаяНизкая
Запись и ВоспроизведениеДаНетНетДа
СкриптингGroovyJava/Python/C#JavaScriptМножественный
API ТестированиеВстроеноВнешние библиотекиДаДа
Mobile ТестированиеВстроеноНастройка AppiumНетДа
ОтчётностьОтличнаяБазоваяХорошаяОтличная
СтоимостьБесплатный tier + ПлатнаяБесплатноБесплатно + ПлатнаяТолько платная
Кривая ОбученияНизкая-СредняяВысокаяСредняяНизкая-Средняя

Заключение

Katalon Studio выделяется как истинное all-in-one решение для автоматизации тестирования, которое балансирует простоту использования с мощными возможностями. Его унифицированная платформа устраняет необходимость в множественных инструментах и сложных интеграциях, делая его идеальным для команд любого размера и уровня навыков.

Katalon Studio Идеален Для:

  • Команд, нуждающихся в быстрой настройке автоматизации тестирования
  • Организаций, тестирующих web, API и mobile
  • Команд со смешанными навыками (ручные тестировщики + инженеры автоматизации)
  • Проектов, требующих комплексной отчётности и аналитики
  • CI/CD интеграции с минимальной конфигурацией

Используя встроенные возможности Katalon, умное управление объектами и обширные возможности интеграции, команды могут достичь более быстрого time-to-market, сохраняя высокие стандарты качества.

Следующие Шаги

  1. Скачать Katalon Studio с https://katalon.com
  2. Пройти встроенные туториалы
  3. Создать первый тест используя Record Web
  4. Изучить управление Object Repository
  5. Настроить CI/CD интеграцию с вашим пайплайном
  6. Присоединиться к Katalon Community Forum для поддержки

Начните с простых record-and-playback тестов, затем постепенно внедряйте скриптинг и продвинутые возможности по мере роста зрелости автоматизации вашей команды.