cgc0045 / GESPRO_PracticaGestionCodigo

Universidad de Burgos. GII. Gestión Proyectos. Repostiorio que incluye el código inicial para la realización de la 2ª practica de planificación ágil
1 stars 0 forks source link

Despliegue: Ejecutable - Pruebas - calidad #1

Closed cgc0045 closed 7 years ago

cgc0045 commented 7 years ago

Crear el ejecutable con el ANT.

cgc0045 commented 7 years ago

Ya se puede utilizar el ant correctamente. Yo lo he probado en varias ocasiones en lugares diferentes y me ha funcionado. Si tienes cualquier problema me dices.

ant clean ant [runnable]

java ‐jar SistInfGenWeb.jar [nivel]

ysi0000 commented 7 years ago

La tarea javadoc tiene errores Añadir una taraea de test JUnit/DBUnit para probar La Fachada de acceso a datos. Incorporar la cobertura de pruebas (SonarCube o Eclemma)

ysi0000 commented 7 years ago

Referencia para pruebas de base de datos DBUnit http://dbunit.sourceforge.net/intro.html y curso de udemy. https://www.udemy.com/curso-especialistajava-pruebas-automaticas-en-java /?dtcode=aVHqjK62fugR

cgc0045 commented 7 years ago

He implementado un primer test para la clase SistInfData.java y he obtenido casi un 90% de cobertura en esa clase. captura

Pero he estado intentando crear una tarea en ANT con JaCoCo, pero me es imposible porque no consigo acceder al archivo de configuración que creamos, por lo que no se pueden leer las diferentes tablas para hacer las pruebas.

ysi0000 commented 7 years ago

No sé si entiendo el problema. Los test tienen que ser independientes de la aplicación. Por tanto la ejecución de los test tendrá sus propios recursos: bases de datos, archivos de configuración, etc Si nos vas a probar la la clase que trabaje con con los parámetros de configuración puedes hacerte una clase Mock que te devuelva parámetros de configuración que necesitas

cgc0045 commented 7 years ago

Intentaré hacer eso porque todas las clases usan el archivo de configuración, que es el que dice dónde está la carpeta de salida y dónde se encuentran los datos de entrada.

cgc0045 commented 7 years ago

No consigo hacerlo funcionar, y creo que no he entendido bien el concepto de Test. En la clase SistInfData.java tengo esto: private static final String DIRCSV = GetProperties.getSetting("dataIn");

Esa clase GetProperties es tal que así:

`public final class GetProperties {

private static final Logger LOGGER = Logger.getLogger(GetProperties.class);
private static final Properties properties = new Properties();
static {
    try {
        File file = new File("./../src/config.properties");
        FileInputStream fileInput = new FileInputStream(file);
        properties.load(fileInput);
        fileInput.close();
    } catch (IOException e) {
        LOGGER.error("El directorio en el que trabajas no es el correcto.");
        throw new ExceptionInInitializerError(e);
    }
}

public static String getSetting(String key) {
    return properties.getProperty(key).trim();
}

}`

Y aquí es donde me salta la IOException, porque no encuentra dicho fichero. Ahora mismo el test que se está realizando es sobre los datos que usa la aplicación(en la carpeta rsc/data), y por lo que me has comentado que de que tiene que ser independiente me temo que está mal realizado.

ysi0000 commented 7 years ago

La propiedad

dataIn

que defines en

SistInfData

debería ser diferente para las clases de test que para las clases de la aplicación. Necesitas crear un mock de la clase GetProperties para que cargue las propiedades de los test. Es decir sustituir

File file = new File("./../src/config.p

con las nuevas propiedades definidas en

File file = new File("./../test/config.

cgc0045 commented 7 years ago

No es que lo haya abandonado esto, pero después de 2 días sigo sin avanzar con este tema. No acabo de entender las clases Mock y no consigo sustituir el path del archivo de configuración.

ysi0000 commented 7 years ago

Perdona igual te he liado con la nomenclatura, lo que te quería indicar es que puedes hacer un Stub de la clase que llamas

GetProperties

para que devolviera el valor de la propiedad que necesites para probar en el test. Échate un vistazo al tema de pruebas de integración en el curso de Udemy que te pase. Una cuestión menor de diseño, nunca nombres una clase con un verbo

GetProperties

vs

PropertiesApp

. Mañana te puedo atender de 11:00 a 13:30 en mi despacho EPS A1

cgc0045 commented 7 years ago

He seguido paso a paso lo que va haciendo Raúl en el curso de pruebas automáticas. Y después de dar muchas vueltas y según entendí lo que me comentaste el viernes, esto es lo que me ha pasado:

@Test
    public void testAvg() throws Exception {

        PropertiesApp prop = mock(PropertiesApp.class);

        prop = PropertiesApp.getInstance("./../src/main/config.properties");

        when(prop.getSetting("dataIn")).thenReturn("./../src/rsc-test");
        sistInfData = new SistInfData();

        Number esperado = sistInfData.getAvgColumn("Nota", "Prueba");
        assertThat(esperado, is((Number) 5.5F));
    }

Al ejecutar esto, sale la siguiente traza de error:

1) testAvg(ubu.digit.pesistence.SistInfDataTest)
org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
   Those methods *cannot* be stubbed/verified.
2. inside when() you don't call method on mock but on some other object.
3. the parent of the mocked class is not public.
   It is a limitation of the mock engine.

Obviamente esto se debe a que getInstance es un método static, por lo que cambié el código por este:

@Test
    public void testAvg() throws Exception {

        mockStatic(PropertiesApp.class);

        String esp = "./../src/rsc-test";

        PropertiesApp prop = PropertiesApp
                .getInstance("./../src/main/config.properties");

        when(prop.getSetting("dataIn")).thenReturn(esp);
        sistInfData = new SistInfData();

        Number esperado = sistInfData.getAvgColumn("Nota", "Prueba");
        assertThat(esperado, is((Number) 5.5F));
    }

Pero con esa opción la variable prop es siempre null, no entiendo por qué... Pero bueno, al final he conseguido resolverlo de la siguiente manera:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ PropertiesApp.class, SistInfData.class })
public class SistInfDataTest {

    SistInfData sistInfData;

    PropertiesApp test = PropertiesApp
            .getInstance("./../src/test/config.properties");

    @Test
    public void testAvg() throws Exception {

        mockStatic(PropertiesApp.class);

        when(PropertiesApp.getInstance("./../src/main/config.properties"))
                .thenReturn(test);

        sistInfData = new SistInfData();

        Number esperado = sistInfData.getAvgColumn("Nota", "Prueba");
        assertThat(esperado, is((Number) 5.5F));
    }
//....
}

Ahora, voy a mejorarlo con un método @ Before para no tener que repetirlo en todos los métodos... Y luego espero que no me genere muchos problemas para meterlo en ANT

cgc0045 commented 7 years ago

Acabo de subir todo lo relacionado con las pruebas, los ficheros xml, un properties... He conseguido que se ejecuten los test, la cobertura y JaCoCo, pero de momento no he conseguido que me muestre los datos reales... Porque siempre obtengo un cobertura de 0% en todas las clases. Tendré que darle una vuelta a eso.

ysi0000 commented 7 years ago

Buena trabajo Beatriz. Efectivamente tu implementación de la prueba con el stub es la solución que te comenté. Intenta documentar la prueba (Descripción, Datos de Entrada y Salida esperada) con ocumentación JavaDoc

cgc0045 commented 7 years ago

He estado investigando el problema con la cobertura que tenía, ya que cuando lo ejecuto sobre el SistInfDataTest la cobertura siempre es 0%. Según este post parece que al usar PowerMock Eclemma no funciona. Por eso, voy a usar cobertura captura

cgc0045 commented 7 years ago

Acabo de conseguir que aparezca la cobertura en análisis de SonarQube: captura Conseguido esto, queda descartado Eclemma por los problemas que tiene con PowerMock. En su vez estoy usando cobertura, como ya he comentado.

ysi0000 commented 7 years ago

De nuevo un buen trabajo. Beatriz, ¿las 211 issue open se refieren a Bitbucket ? ¿Es posible integrar Sonar con BitBucket y Git?