Введение в 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
Установка и Настройка
- Скачать Katalon Studio с https://katalon.com/
- Не требуются дополнительные драйверы или зависимости
- Активировать аккаунт (доступен бесплатный tier)
- Начать создавать тесты немедленно
Понимание Интерфейса
Основные Компоненты:
Компонент | Назначение | Описание |
---|---|---|
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 идеален для быстрого создания тестов:
Шаги:
- Нажать кнопку Record Web
- Ввести URL приложения
- Взаимодействовать с приложением (Katalon записывает все действия)
- Остановить запись
- Просмотреть и отредактировать сгенерированные шаги теста
- Выполнить тест
Пример Записанного Теста:
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:
- Запустить инструмент Object Spy
- Захватить web-элементы визуально
- Просмотреть предложенные локаторы
- Добавить в Object Repository
- Использовать в тест-кейсах через
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 Studio | Selenium + Java | Cypress | TestComplete |
---|---|---|---|---|
Сложность Настройки | Нет | Высокая | Низкая | Низкая |
Запись и Воспроизведение | Да | Нет | Нет | Да |
Скриптинг | Groovy | Java/Python/C# | JavaScript | Множественный |
API Тестирование | Встроено | Внешние библиотеки | Да | Да |
Mobile Тестирование | Встроено | Настройка Appium | Нет | Да |
Отчётность | Отличная | Базовая | Хорошая | Отличная |
Стоимость | Бесплатный tier + Платная | Бесплатно | Бесплатно + Платная | Только платная |
Кривая Обучения | Низкая-Средняя | Высокая | Средняя | Низкая-Средняя |
Заключение
Katalon Studio выделяется как истинное all-in-one решение для автоматизации тестирования, которое балансирует простоту использования с мощными возможностями. Его унифицированная платформа устраняет необходимость в множественных инструментах и сложных интеграциях, делая его идеальным для команд любого размера и уровня навыков.
Katalon Studio Идеален Для:
- Команд, нуждающихся в быстрой настройке автоматизации тестирования
- Организаций, тестирующих web, API и mobile
- Команд со смешанными навыками (ручные тестировщики + инженеры автоматизации)
- Проектов, требующих комплексной отчётности и аналитики
- CI/CD интеграции с минимальной конфигурацией
Используя встроенные возможности Katalon, умное управление объектами и обширные возможности интеграции, команды могут достичь более быстрого time-to-market, сохраняя высокие стандарты качества.
Следующие Шаги
- Скачать Katalon Studio с https://katalon.com
- Пройти встроенные туториалы
- Создать первый тест используя Record Web
- Изучить управление Object Repository
- Настроить CI/CD интеграцию с вашим пайплайном
- Присоединиться к Katalon Community Forum для поддержки
Начните с простых record-and-playback тестов, затем постепенно внедряйте скриптинг и продвинутые возможности по мере роста зрелости автоматизации вашей команды.