La automatización de pruebas es una técnica muy útil para tener en tu arsenal de pruebas, sin mencionar que la demanda de estas habilidades ha aumentado constantemente en los últimos años debido a los efectos de las prácticas Agiles y DevOps, donde, en el mejor de los casos, necesitas que tus pruebas detecten errores temprano, rápido y con frecuencia.

Hay muchas herramientas en varios lenguajes de programación que pueden ayudarte a traducir tus escenarios a pruebas automatizadas de manera rápida y fácil en cada capa, esto es particularmente importante para los ingenieros de prueba, ya que regularmente son los principales responsables de la automatización de pruebas por encima de la fase de integración.

El lenguaje de programación

En un equipo de desarrollo de software, típicamente las responsabilidades de automatización de pruebas a veces se dividen usando la pirámide de pruebas como referencia y teniendo en cuenta qué tan cerca está un rol de una capa específica:

The Pyramind

Dejando de lado las pruebas de Unitarias e Integración, que en caso de que si se realicen, probablemente serán escritas por los desarrolladores en el mismo lenguaje utilizado para construir el sistema, todo lo que este encima de estas capas puede escribirse potencialmente usando un lenguaje diferente:

  • Pruebas API
  • GUI
    • Web (escritorio y móvil)
    • Móvil

Esto es bueno y malo. Bueno porque permite que cualquier miembro del equipo contribuya en el lenguaje que es más competente, malo porque puede llevar a un espaguetis de librerías.

El lenguaje es una de las muchas cosas importantes a considerar antes de seleccionar una herramienta o librería y no debe ser algo por moda.

Las herramientas

Antes de elegir una herramienta específica, deberíamos tomarnos un tiempo para investigar y respaldar esa decisión antes de ir a ciegas a la noche, he visto proyectos fallar solo porque alguien decidió usar una herramienta o lenguaje de nicho o porque JS dio a luz a un nuevo framework que se está apoderando momentáneamente del mundo.

Entonces, nuestra investigación nos lleva a muchas herramientas en diferentes lenguajes, algunas de las más populares son:

  • Java
  • Ruby
  • Python
  • JavaScript   

Todos estos son excelentes lenguajes, cada uno con sus pros y sus contras, pero para encontrar el que nos permita crear pruebas automatizadas para la GUI y pruebas API, necesitamos investigar un poco mas.

Los que tienen las mayores ofertas son Java y JavaScript, con sus grandes comunidades y librerías.

Pero, aunque las librerías son parte de nuestra investigación, no son parte de nuestros criterios de aceptación, no estamos buscando herramientas, estamos buscando la mejor relación cobertura/esfuerzo en un panorama de herramientas en constante cambio para que no terminemos con las pruebas de API utilizando una librería de Python, utilizando Selenium WebDriver con JavaScript y Appium con Ruby para dispositivos móviles…Sí, sucede.

Y si bien podemos aprovechar algunas de estas herramientas en paralelo, podemos tener al menos (desde una perspectiva de esfuerzo) un punto común que sirva como denominador, y este punto es el lenguaje.

¿Qué pasaría si, en este momento y en este día, pudiéramos encontrar solo uno que nos brinde la mejor relación entre cobertura, librerías increíbles, facilidad de uso y soporte de plataforma, no sería increíble? Lo seria, por lo que deberíamos tomarnos un tiempo para considerar si este lenguaje ya existe.

Kotlin

Kotlin trae muchas características que son muy interesantes y útiles, y puedes encontrar información extensa sobre el lenguaje con una simple búsqueda en Google, pero muchos de los artículos que encontrarás siempre se expresan desde el punto de vista de desarrollar una aplicación móvil o del desarrollo del backend.

Pero dado que la automatización de pruebas también se puede describir como una disciplina de desarrollo, todas las cosas buenas que Kotlin aporta para crear aplicaciones o backends, también son aplicables para la automatización de pruebas.

Algunos hechos ya muy conocidos de Kotlin:

  • Kotlin es un lenguaje de programación OSS de tipado estático dirigido a la JVM, Android, JavaScript y Nativo.
  • Kotlin tiene paradigma orientado a objetos como funcional.
  • Es discutiblemente, fácil de aprender.
  • Es un lenguaje de programación de Android de primera clase para Google junto Java y C ++, lo que ha impulsado su adopción y sigue creciendo cada día. Esto significa que obtendrás soporte con bastante facilidad, sin mencionar nuevos artículos todos los días sobre los usos que puede hacer con el lenguaje.
  • Es de JetBrains, por lo que tiene un soporte constante y el mejor IDE del mercado en IntelliJ.
  • Kotlin es 100% interoperable con el lenguaje de programación Java. Y este punto es muy importante, porque aprovechas la fuerza vital de la JVM.

Esta fuerza vital significa que tienes a tu disposición una gran cantidad de librerías que puedes usar sin esfuerzo adicional y sin la verbosidad y la grandilocuencia de Java.

Sí, también podríamos usar Java para estas librerías, pero no estarías leyendo esta publicación si no estuviera buscando una alternativa.

Kotlin para el desarrollo de pruebas automatizadas

Hay muchos casos de uso muy útiles que podrías hacer con Kotlin para crear pruebas automatizadas, ya sea para web con Selenium, API’s con Rest-Assured o móvil con Espresso y Appium y muchos, muchos más.

Pero necesitamos unificar la anécdota, no hablar sobre usos específicos en una capa específica, sino resumir que puedes usar Kotlin para casi todo lo relacionado con el desarrollo de automatización de pruebas, punto.

Rasquemos la superficie y veamos algunas de las cosas que se puede hacer con Kotlin.

Como punto de partida, es bueno tener en cuenta que puedes escribir nombres bastante legibles para tus funciones de prueba, por lo que puedes pasar de esto:

public void testThatHangingOutWithRickAndMortyIsNotAGoodIdea(){
//code
}
Java

A esto:

fun `test that hanging out with Rick and Morty is not a good idea`(){
//code
}
Kotlin

Otra característica excelente de este lenguaje es la habilidad para crear un DSL, que nos da claridad y fácil comprensión y aún así sigue siendo código:

fun `should login successfully`() {
  withLoginRobot {
    initiateTheLogin()
  } and {
    acceptThePermissions()
  } andThenVerifyThat {
    userIsLoggedIn()
  }
}
Kotlin

También:

val cities : List<String> =
Given {
    queryParam("deleted", false)
} When {
    get("/users")
} Then {
    statusCode(200)
    body("size()", is(3))
    body("name.any { it == 'Ervin Howell' }", is(true))
    body("find { user -&gt; user.username == 'Antonette' }.company.name", equalTo("Romaguera-Jacobson"))
} Extract {
    path("address.city")
}
Kotlin

Con Kotlin también puedes decir más utilizando menos, puedes reducir el tamaño de tu código mientras mantienes la misma o más funcionalidad en comparación con Java. El siguiente ejemplo toma un POJO en Java con fines ilustrativos:

 1 public class Person {
 2   private String name;
 3   private int age = 0;
 4
 5   public Person(String name, int age) {
 6       this.name = name;
 7       this.age = age;
 8   }
 9
10   public String getName() {
11       return name;
12   }
13
14   public void setName(String name) {
15       this.name = name;
16   }
17
18   public int getAge() {
19       return age;
20   }
21
22   public void setAge(int age) {
23       this.age = age;
24   }
25
26   @Override
27   public boolean equals(Object o) {
28       if (this == o) return true;
29       if (o == null || getClass() != o.getClass()) return false;
30
31       Person person = (Person) o;
32
33       if (name != null ? !name.equals(person.name) : person.name != null) return false;
34       if (age != 0 ? age != person.age : person.age != 0) return false;
35   }
36
37   @Override
38   public int hashCode() {
39       int result = name != null ? name.hashCode() : 0;
40       result = 31 * result + age;
41       return result;
42   }
43
44   @Override
45   public String toString() {
46       return "Person{" +
47               "name='" + name + '\'' +
48               ", age='" + age + '\'' +
49               '}';
50   }
51 }
Java

Este es básicamente el código anterior en Kotlin con 50 líneas menos:

1 data class Person(var name: String, var age: Int)
Kotlin

También puedes agregar el hecho de que hoy en dia, la mayor parte del desarrollo nativo de Android está realizándose ó migrándose a Kotlin, por lo que puedes tener una muy buena fuente de ayuda y soporte allí mismo en tu equipo.

Ventajas ocultas

Y aquí hay un beneficio inadvertido de usar Kotlin, es que puedes aprender y hacer la transición a Swift con muy poco esfuerzo, son muy similares:

println("Hello, world!")
Kotlin
print("Hello, world!")
Swift
fun makeIncrementer(): (Int) -> Int {
    val addOne = fun(number: Int): Int {
        return 1 + number
    }
    return addOne
}
val increment = makeIncrementer()
increment(7)
Kotlin
func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
let increment = makeIncrementer()
increment(7)
Swift

Puedes encontrar estas y muchas más similitudes aquí

¿Por qué es esto importante? Digamos que aprendiste Espresso y quieres hacer lo mismo en IOS, lo que significa comenzar a convertir algunos scripts de Appium de IOS que pueden caber en una capa inferior, para eso puedes usar XCUITest, es como el Espresso de IOS.

Pensamientos finales

Me gusta automatizar las cosas, y en nuestro trabajo, sea cual sea la comodidad u optimización en la que obtengo los mismos o mejores resultados con menos esfuerzo, al menos lo intentaré. Desde que comencé a usar Kotlin en lugar de Java para la automatización de pruebas, no he mirado atrás.

Entonces, si eres es un tester o desarrollador que da sus primeros pasos al escribir pruebas automatizadas o incluso si tienes experiencia, ten en cuenta que con Kotlin puedes abarcar casi todos los aspectos de tu automatización de pruebas con y con mucho menos esfuerzo.

En Kotlin encontraras un lenguaje fácil, moderno y divertido que será un poderoso aliado para tus pruebas automatizadas.

Anímate y pruébalo, avísame cómo te va.