Generación de Tests Unitarios

En este sitio podrá encontrar material del curso Generación Automática de Tests Unitarios, de la Escuela de Ciencias Informáticas ECI 2012. Para consultas, puede enviar un email a Nazareno Aguirre (naguirre@dc.exa.unrc.edu.ar).

Notas de las clases

    • Primera clase: 0, 1, 2, 3

    • Segunda clase: 4

    • Tercera clase: 5

    • Cuarta clase: 6

    • Quinta clase: 7

Prácticas

    • Práctica 1 (más ejercicios: actualización del 29/7)

Examen

IMPORTANTE! Entrega del examen/trabajo práctico postergada hasta el 10/09/2012.

    • Enunciado de los ejercicios del examen.

      • Clases ColaSobreListasEnlazadas.java y Nodo.java, a utilizar para la resoluci\'on del examen.

      • Clase ClassExamen.cs, a utilizar para la resolución del examen.

Código

  • SampleStaticRoutines

  • ListaSobreArreglos

    • PilaSobreListasEnlazadas (la versión para Korat, con los "imports" correspondientes y método de finitización, está al pie de esta página)

    • Nodo (la versión para Korat, con los "imports" correspondientes, está al pie de esta página)

    • Ejemplos C# de PEX y Code Contracts

Enlaces

Material Adicional

Preguntas Frecuentes

  • Cómo incorporar las clases de implementación de colas sobre listas enlazadas circulares a Korat

Una forma relativamente directa de hacerlo es siguiendo las siguientes instrucciones:

      • Descargar Korat del SVN (svn co https://korat.svn.sourceforge.net/svnroot/korat/trunk/ korat)

      • Dentro de la carpeta korat/examples/korat/examples, crear un directorio ColaSobreListasEnlazadas, y almacenar allí los .java del ejercicio (ColaSobreListasEnlazadas.java y Nodo.java). El paquete de estas clases debe ser korat.examples.ColaSobreListasEnlazadas.

      • Dentro del directorio korat, ejecutar: ant createJar (se debe tener ant instalado en el sistema, y dentro del directorio lib se deben dejar las librerías necesarias para Korat: http://korat.sourceforge.net/downloads.html)

De esta manera, se crea el archivo korat.jar (queda dentro del directorio dist), con las colas sobre listas enlazadas dentro. Una vez que tenemos este archivo, podemos generar tests para las colas sobre listas enlazadas de la siguiente manera:

java -cp korat.jar korat.Korat --class korat.examples.ColaSobreListasEnlazadas.ColaSobreListasEnlazadas --args 4

Para evitar tener problemas de seteo del CLASSPATH, copiar dentro de dist el contenido de lib (para tener, junto con korat.jar, las librerías auxiliares necesarias, en el mismo directorio).

  • Programé repOK y el finitization para las colas sobre listas enlazadas, pero cuando ejecuto Korat lanza la siguiente excepción:

Exception in thread "main" java.lang.UnsupportedOperationException:

Not implemented

at korat.instrumentation.Setter.set(Setter.java:33)

at korat.finitization.impl.CandidateBuilder.buildCandidate(CandidateBuilder.java:82)

at korat.testing.impl.StateSpaceExplorer.nextTestCase(StateSpaceExplorer.java:101)

at korat.testing.impl.TestCradle.startTestGeneration(TestCradle.java:267)

at korat.testing.impl.TestCradle.start(TestCradle.java:178)

at korat.testing.impl.TestCradle.start(TestCradle.java:144)

at korat.Korat.main(Korat.java:188)

Este problema puede deberse a un error de tipos en el Finitization. Uno usual es setear un rango de int como dominio del campo item de Nodo. El campo item de Nodo es de tipo Object, con lo cual habría que setear un rango de Integer como su dominio, y no un rango de int. Esto puede hacerse siguiendo el siguiente ejemplo:

IObjSet elems = f.createObjSet(Integer.class);

IClassDomain elemsClassDomain = f.createClassDomain(Integer.class);

elemsClassDomain.includeInIsomorphismCheck(false);

for (int i = 1; i <= numData; i++)

elemsClassDomain.addObject(new Integer(i));

elems.addClassDomain(elemsClassDomain);

elems.setNullAllowed(true); // null se incluye en el dominio

// poneR false si no se quiere permitir null.

Otro ejemplo similar es el de la clase SortedList provista en los ejemplos de Korat.

  • Cómo se serializan los inputs producidos por Korat?

Existe una opción por línea de comandos que permite seralizar las entradas producidas. En el sitio web de Korat, más específicamente en http://korat.sourceforge.net/manual.html, se especifica cómo. La clase correspondiente a los objetos a serializar debe implementar la interface Serializable.

  • Cómo recupero los inputs serializados por Korat para testear una rutina?

Para conseguir de-serializar los objetos serializados por Korat, hace falta un manejo de InputStream de Java. Aquí va un ejemplo de una clase auxiliar para la de-serialización:

import java.io.EOFException;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.util.ArrayList;

public class Deserialization {

public ObjectInputStream ois;

public Deserialization(String file) throws FileNotFoundException, IOException{

FileInputStream fileTestUnit = new FileInputStream(new File(file));

ois= new ObjectInputStream(fileTestUnit);

}


public ArrayList<ColaSobreListasEnlazadas> deserialization(){

ArrayList<ColaSobreListasEnlazadas> colas = new ArrayList<ColaSobreListasEnlazadas>();

try{

ColaSobreListasEnlazadas cola = (ColaSobreListasEnlazadas) nextObject();

while(cola != null){

colas.add(cola);

cola = (ColaSobreListasEnlazadas) nextObject();

}

}catch (Exception e) {

e.printStackTrace();

}

return colas;

}


private Object nextObject() throws ClassNotFoundException, IOException {

try {

return ois.readObject();

} catch (EOFException eof) {

return null;

} catch (ClassNotFoundException e) {

throw e;

} catch (IOException e) {

throw e;

}

}


}

  • No puedo hacer el ejercicio de PEX, porque sólo tengo Visual Studio Express

Esta solución es cortesía de Ramiro Rela. Pex requiere contar con un framework de unit testing. Para usar Pex con Visual Studio Express, se debe instalar NUnit para .NET (http://www.nunit.org/index.php?p=download). Instalar el .msi para .NET. En caso de tener problemas para correr suites NUnit (y consecuentemente para correr Pex), intentar seteando el ambiente runtime de .NET, a través de la variable de entorno COMPLUS_Version.

Comentarios de Alumnos

http://seguridad-agile.blogspot.com.ar/2012/09/automatizacion-de-test-eci-2012.html (cortesía de Carlos Pantelides)