jueves, 30 de junio de 2016

Tutorial git con "monos"

https://backlogtool.com/git-guide/en/

viernes, 17 de junio de 2016

Git, salvar credenciales

Para que git guarde credenciales:
 
git config --global credential.helper wincred
 

Podam con máximo de elementos por array

DataProviderStrategy strategy = new RandomDataProviderStrategyImpl();
strategy.setMemoization(true);
strategy.setDefaultNumberOfCollectionElements(3);
return new PodamFactoryImpl(strategy);

jueves, 16 de junio de 2016

Selenium con Junit instalación y ejemplo de uso

Qué es Selenium 

(De la wikipedia) Selenium es un entorno de pruebas de software para aplicaciones basadas en la web. Selenium provee una herramienta de grabar/reproducir para crear pruebas sin usar un lenguaje de scripting para pruebas (Selenium IDE). Incluye también un lenguaje específico de dominio para pruebas (Selanese) para escribir pruebas en un amplio número de lenguajes de programación populares incluyendo Java, C#, Ruby, Groovy, Perl, Php y Python. Las pruebas pueden ejecutarse entonces usando la mayoría de los navegadores web modernos en diferentes sistemas operativos como Windows, Linux y OSX. Para más info: http://www.seleniumhq.org/

Requisitos previos 


 El ejemplo de uso utilizará Firefox como navegador, suele pasar que para la última versión de un navegador aún no existen librerías de Selenium adaptadas.

En este ejemplo usaremos la versión 46, que en el momento del tutorial era la última que funcionaba correctamente.
Enlace: https://ftp.mozilla.org/pub/firefox/releases/46.0.1/
Para que selenium se ejecute sin problemas, tanto ejecutando un test junit manualmente como utilizando maven es necesario que la carpeta del ejecutable de Firefox se encuentre en el PATH del sistema.
Ejemplo para windows:
Abrir consola: cmd
Añadir al path el directorio de instalación: set PATH=%PATH%;C:\Firefox

Clases

Ejemplo de clase Parent, nuestras clases de tests extenderán de ésta, un ejemplo de método que ejecuta Selenium es el método login:

 public abstract class SeleniumParent {  
      @Rule  
      public TestName name = new TestName();  
      public WebDriver driver;  
      public final static String BASEURL = "http://localhost:8080/";  
      public static String pathScreenShots;  
      @BeforeClass  
      public static void beforeClass() {  
           pathScreenShots = "./target/screenshots/" + new SimpleDateFormat("ddMMyyyy_HHmmss").format(new Date()) + "/";  
      }  
      @Before  
      public void before() throws Exception {  
           driver = new FirefoxDriver();  
           driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);  
      }  
      @After  
      public void after() throws Exception {  
           driver.quit();  
      }  
      public boolean isElementPresent(By by) {  
           try {  
                driver.findElement(by);  
                return true;  
           } catch (NoSuchElementException e) {  
                return false;  
           }  
      }  
      public String captureScreen() {  
           try {  
                File source = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);  
                FileUtils.copyFile(source, new File(pathScreenShots + name.getMethodName() + "/" + source.getName()));  
           } catch (IOException e) {  
                pathScreenShots = "Failed to capture screenshot: " + e.getMessage();  
           }  
           return pathScreenShots;  
      }  
      public void login(String user, String password) {  
           driver.get(BASEURL + "MIAPP/");  
           driver.findElement(By.id("user_field")).sendKeys(user);  
           driver.findElement(By.id("password_field")).sendKeys(password);  
           captureScreen();  
           driver.findElement(By.id("login_button")).sendKeys(Keys.ENTER);  
      }  

      public void validateInitialOk() {  
           if (isElementPresent(By.className("title_page"))) {  
                captureScreen();  
                Assert.assertTrue(isElementPresent(By.className("title_page")));  
           } else {  
                Assert.fail("Titles is not present");  
           }  
      }  

 }  

Un ejemplo de clase de test sería éste:

 public class SeleniumExample extends SeleniumParent {  
      @Test  
      public void testLoginFrontOk() throws Exception {  
           login("raulito", "raulito123");  
           validateInitialOk();  
      }  
 }  

De esta manera abstraeríamos la gran mayoria de "procesos" de los propios tests, dejando algo muy visual, intuitivo y reutilizable. En el ejemplo se ve que se ejecuta el login de la aplicación y se pasan las validaciones pertinentes de forma rápida.
Inicialmente los métodos login y validateInitialOk están en el parent por "comodidad" para el ejemplo. La división en otras clases, tanto clases de validación o clases de funcionalidad ya sería otro tema.

 Ejecución de un test Selenium 


 Previo a ejecutar un test de Selenium se necesita que esté levantada la aplicación en local y sea accesible por “http://localhost:8080/miapp/”. Esta ruta inicialmente está añadida directamente en código, se podría hacer que dependiera de un parámetro de entorno y así poder lanzar los tests contra diferentes estancias de la aplicación, en local,test,etc...

Manual desde el IDE 

Una vez levantada la aplicación en local se puede ejecutar el test de forma manual desde el IDE. Se verá como se abren ventanas de Firefox y como se está navegando por ellas. Lo interesante de realizar los tests Selenium mediante Junit es que la validación de campos es mucho más fácil de realizar que utilizando el plugin de los navegadores.

Utilizando Maven 

 El ejemplo inicial se ha llamado SeleniumExample.java a propósito, si el nombre de la clase no contiene la palabra “Test” el plugin maven-surefire-plugin, el que ejecuta los tests unitarios, no llama a esta clase. Bastaría con cambiar el nombre de esta clase a SeleniumExampleTest.java y al ejecutar mvn clean test se vería como se ejecutan los tests Selenium correctamente.

jueves, 14 de abril de 2016

Eclipse no encuentra tools 1.5.0

Solución:
Descargar http://repository.ops4j.org/maven2/tools/tools/1.5.0/ 
Ponerlo en c:
Ejecutar 
mvn install:install-file -Dfile=C:\tools-1.5.0.jar -DgroupId=com.sun -DartifactId=tools -Dversion=1.5.0 -Dpackaging=jar

Añadir en las librerias de la jdk de eclipse el jar

jueves, 10 de septiembre de 2015

Propuesta de tecnologías de tests para integración continua

Para conseguir que en sonar aparezcan diferenciadas las coberturas de tests unitarios y tests de integración hemos llegado a lo siguiente.
A nivel de maven usamos los plugins:
  • Para configurar la ejecución de tests unitarios (UT):
          org.apache.maven.plugins
          maven-surefire-plugin
  • Para configurar la ejecución de tests de integración (IT):
          org.apache.maven.plugins
          maven-failsafe-plugin
  • Para publicar informes de cobertura en Sonar:
          org.jacoco
          jacoco-maven-plugin

Se optó por Jacoco para los informes de cobertura en Sonar debido a que nos permitía realizar una diferenciación entre la cobertura de tests unitarios y tests de integración. Descartamos el plugin Cobertura que no nos permitía realizar este paso
A nivel de tests usamos:
  • Junit+Jmockit+Podam para tests unitarios.Para los tests unitarios hemos probado varias librerías para mockear objetos y clases y finalmente nos hemos decantado por Jmockit http://jmockit.org/ . Esta librería es la que más encaja con surefire,failsafe,jacoco y sonar, además de momento es menos engorrosa. Descartamos Mockito y Powermockito debido a problemas con clases estáticas, aunque los tests funcionaban Jacoco no era capaz de generar informes de cobertura de ellas, esto era un bug conocido. Actualmente hay otro bug en Jacoco que no permite contar la cobertura de las lineas dentro de los "catch". Utilizamos Podam para generar clases con contenido dummy de forma rápida.
  • Junit+Spring para tests de integración. Utilizamos SpringBoot para arrancar un servidor embebido con la aplicación y RestTemplate para lanzar las llamadas a nuestros endpoints.