Kotlin, Gradle и Allure2
В этой заметке разберёмся, как подключить отчёты Allure2 к тестам, написанным на Kotlin.
Что такое Allure?
Приведу цитату из статьи “Allure-framework. Часть 1”
Allure Framework — популярный инструмент построения отчётов автотестов, упрощающий их анализ. Это гибкий и легкий инструмент, который позволяет получить не только краткую информацию о ходе выполнения тестов, но и предоставляет всем участникам производственного процесса максимум полезной информации из повседневного выполнения автоматизированных тестов.
Разработчикам и тестировщикам использование отчетов Allure позволяет сократить жизненный цикл дефекта: падения тестов могут быть разделены на дефекты продукта и дефекты самого теста, что сокращает затраты времени на анализ дефекта и его устранение. Также к отчету могут быть прикреплены логи, обозначены тестовые шаги, добавлены вложения с разнообразным контентом, получена информация о таймингах и времени выполнения тестов. Кроме того, Allure-отчеты поддерживают взаимодействие с системами непрерывной интеграции и баг-трекинговыми системами, что позволяет всегда держать под рукой нужную информацию о прохождении тестов и дефектах.
Тест-менеджерам Allure дает общее представление о работоспособности проекта, позволяет понять, какие фичи проекта покрыты тестами, как сгруппированы дефекты, каков общий тренд качества проекта.
На этом теория заканчивается.
Создаём новый проект
Создаем новый проект в IntelliJ Idea. New Project — Java — Kotlin (Java):
После нажатия на кнопку Finish надо дождаться, когда gradle скачает все зависимости.
Настраиваем зависимости
В build.gradle добавляем зависимости для работы с JUnit5 и Allure2.
def allureVersion = '2.9.0'
def junitVersion = '5.1.0'dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
// JUnit5
testImplementation("org.junit.jupiter:junit-jupiter-api:$junitVersion")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitVersion")
testCompile('org.assertj:assertj-core:3.11.1')
// Allure
testRuntimeOnly("io.qameta.allure:allure-junit5:$allureVersion")
testCompile("io.qameta.allure:allure-java-commons:$allureVersion")
testCompile("io.qameta.allure:allure-attachments:$allureVersion")
testCompile("io.qameta.allure:allure-generator:$allureVersion")
testCompile("io.qameta.allure:allure-httpclient:$allureVersion")
}
Подключаем плагин для Allure и настраиваем его.
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.11'
id 'io.qameta.allure' version '2.6.0'
}...allure {
autoconfigure = true
version = '2.9.0'
clean = true
reportDir = file("$projectDir/build/allure-report")
resultsDir = file("$projectDir/build/allure-results")
downloadLinkFormat = 'https://dl.bintray.com/qameta/maven/io/qameta/allure/allure-commandline/%s/allure-commandline-%<s.zip'
}
Настраиваем JUnit.
test {
useJUnitPlatform()
systemProperty 'allure.results.directory', "$projectDir/build/allure-results"
testLogging {
events "PASSED", "FAILED", "SKIPPED", "STANDARD_OUT", "STANDARD_ERROR"
}
scanForTestClasses = false
testLogging.showStandardStreams = true
dependsOn 'cleanTest'
}
Пишем тесты
Создаём новый файл src/test/kotlin/TestCalc.kt
/**
* Калькулятор, который будем тестировать
*/
class Calc {
fun add(x: Int, y: Int) = x + y
fun div(x: Int, y:Int): Int = x / y
}@DisplayName("Проверка калькулятора")
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class TestCalc {
private val calc = Calc() @Test
@DisplayName("Проверка сложения положительных чисел")
@Description("Описание теста")
@Feature("Сложение")
fun testAdd() {
assertThat(calc.add(1, 2)).isEqualTo(3)
} @Test
@DisplayName("Проверка сложения отрицательных чисел")
@Feature("Сложение")
fun testAddBothNegative() {
assertThat(calc.add(-1, -2)).isEqualTo(-3)
} @Test
@DisplayName("Проверка коммутативности")
@Feature("Сложение")
fun testAddCommutative() {
assertThat(calc.add(1, 2)).isEqualTo(calc.add(2, 1))
}
}
Аннотация @TestInstance(TestInstance.Lifecycle.PER_CLASS) необходима для того, чтобы была возможность использовать аннотации @AfterAll и @BeforeAll (подробнее тут)
Создаём новую конфигурацию запуска: Run — Edit Configurations… — + — Gradle. Gradle project = kotlinallure, Tasks = clean test allureReport
Запускаем тесты. В папке build/allure-report будет сформирован отчёт о тестировании. Открываем его на просмотр (allure-report/index.html):
Пишем ещё тесты
Напишем заведомо падающие тесты.
@Test
@DisplayName("Проверка деления на ноль")
@Feature("Деление")
fun testDivZero() {
assertThat(calc.div(5, 0))
}@Test
@DisplayName("Проверка деления на отрицательное число")
@Feature("Деление")
fun testDivNegative() {
// тест падает
assertThat(calc.div(7, -2)).isEqualTo(-3.5)
}
Снова запускаем тесты и видим, что тестирование провалилось, а отчёт не сформировался.
Это произошло, потому что Gradle выполняет команды одну за одной (clean test allureReport) и останавливается, если какая-то из них завершилась ошибкой. В нашем случае провалилась команда test.
Чтобы сформировать отчёт, надо выполнить команду gradle allureReport в командной строке или запустить эту задачу из бокового меню Idea.
Результат:
Заключение
Подключить Allure легко, пользоваться тоже. У него есть модули для интеграции с Apache HttpClient-ом или OkHttp, в результате чего в отчёт автоматически будут сохраняться все исходящие и входящие http запросы, что пригодится при написании API тестов, также есть модуль для подключения к Selenide.
Подробнее про то, какие бывают аннотации и как ими пользоваться, можно прочитать в этой статье Allure-Framework. Работа с кодом.