without marketing
Senior Test Automation Engineer
Sergey Pirogov
Speaker info
http://automation-remarks.com
fb.com/automationremarks
Backgroung
Kotlin
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) {
get(url)
}
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.open("http://automation-remarks.com")
driver.all(".post").shouldHave(size = 9)
ChromeDriver().apply {
open("http://automation-remarks.com")
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 {
@Test
fun basicPingTest() {
given()
.`when`()
.get("/garage")
.then().statusCode(200);
}
}
when is a keyword in Kotlin
Kotlin vs Selenide
@Test fun usingDollarsWithBackticks() {
`$`(By.name("q")).val("selenide")
`$$`("#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
@Test
fun basicPingTest() {
given()
.When()
.get("/garage")
.then().statusCode(200);
}
fun RequestSpecification.When(): RequestSpecification {
return this.`when`()
}
Kotlin vs Selenide fixed
@Test fun usingDollarsWithBackticks() {
get(By.name("q")).setValue("selenide")
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(){
assertThat(1).isEqualTo(1)
}
assert {
throw Exception("error")
}.throwsError {
it.hasMessage("wrong")
}
// -> 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")
deactivateTask("A")
counter.should(have.text("2"))
goToCompletedTab()
taskList.should(have.exactText("A"))
}
}
Conclusion
- Convert existing codebase is a bit painfull
- Kotlin is a great language
- Small amount of libraries
- Potentially bright future
Thank you!
http://automation-remarks.com
fb.com/automationremarks
Kotlin without marketing
By Sergey Pirogov
Kotlin without marketing
- 3,083