without marketing

Senior Test Automation Engineer

Sergey Pirogov

Speaker info





Gradle Meets Kotlin

Back at JavaOne 2015, during a lunch break we started chatting with Hans Dockter, CEO of Gradle. A couple of days after the conference, a few of us were at the Gradle offices talking about what would be the beginning of the collaboration between JetBrains and Gradle; to bring first-class tooling and support for a static language to Gradle.

Google Meets Kotlin

Google today announced that it is making Kotlin, a statically typed programming language for the Java Virtual Machine, a first-class language for writing Android apps.

Hype, hype, hype

Gartner curve

Kotlin vs Java

Kotlin features lost in Java

Null safety

var a: String = "abc"
a = null // compilation error
var b: String? = "abc"
b = null // ok

Extension functions

fun WebDriver.open(url: String) {

fun WebDriver.all(cssselector: String): MutableList<WebElement>? {
    return findElements(By.cssSelector(cssselector))

fun List<WebElement>.shouldHave(size: Int) {
    assert(this.size == size)
val driver = ChromeDriver()
driver.all(".post").shouldHave(size = 9)
ChromeDriver().apply {
        all(".post").shouldHave(size = 9)

Data class and property

data class User(val name: String, 
                val email: String, 
                val password: String)

val admin = User("Dima", "dima@ukr.net", "admin123")

driver.element("#password").value = admin.password

property access

String template

fun findCustomerById(id:Long):CustomerEntity{

    val query = """
                SELECT *
                FROM customer
                WHERE id = $id;

    return findOne(CustomerEntity::klass, query)

Reified type

val beanHandler = BeanHandler<City>(City::class.java)
val city: City  = QueryRunner().query("SELECT * FROM city", beanHandler)
inline fun <reified T> QueryRunner.findOne(sql: String): T {
    return BeanHandler(T::class.java).run { query(sql, this) }
val city : City = QueryRunner().findOne("SELECT * FROM city")

Java Interoperability  

Kotlin is designed with Java Interoperability in mind. Existing Java code can be called from Kotlin in a natural way, and Kotlin code can be used from Java rather smoothly as well.

Kotlin vs Rest Assured

class GarageRestTest {

    fun basicPingTest() {

when is a keyword in Kotlin

Kotlin vs Selenide

 @Test fun usingDollarsWithBackticks() {
        `$$`("#ires .g").shouldHave(size(10))
        `$`("#ires .g").shouldHave(text("Kotlin"));

$ is a keyword in Kotlin

val is a keyword in Kotlin

Kotlin vs Assertion libraries

class testExample{
  @Test fun example(){
    assertThat(1, `is`(equalTo(1))

is a keyword in Kotlin

Maybe we need back to Java

Kotlin vs Rest Assured fixed

fun basicPingTest() {

fun RequestSpecification.When(): RequestSpecification {
        return this.`when`()

Kotlin vs Selenide fixed

 @Test fun usingDollarsWithBackticks() {
        all("#ires .g").shouldHave(size(10))
        get("#ires .g").shouldHave(text("Kotlin"));
 fun get(selector: String) : SelenideElement {
     return `$`(selector);
 fun all(selector: String) : ElementsCollection {
     return `$$`(selector);

Kotlin Assertions fixed

@Test fun example(){
assert {
    throw Exception("error")
}.throwsError {
// -> expected [message] to be:<["wrong"]> 
                         but was:<["error"]>

Kotlin replacements

Rest Assured -> Retrofit

Selenide -> Kirk

Hamcrest -> AssertK

Kirk pragmatic DSL

drive {
    to(::TodoPage) {
      addTasks("A", "B", "C")


  • Convert existing codebase is a bit painfull
  • Kotlin is a great language
  • Small amount of libraries
  • Potentially bright future

Thank you!



Kotlin without marketing

By Sergey Pirogov

Kotlin without marketing

  • 2,985