You are on page 1of 5

Sacndole Partido a JUnit

Mdulo 1. Introduccin a las Pruebas

Ejercicios Resueltos

Ejercicio 03.
El siguiente cdigo muestra para calcular la potencia de dos de cualquier nmero con cualquier
cantidad de cifras. Para evitar desbordamientos de tipos bsicos, se utiliza una lista para cada
cifra y se gestiona a mano los acarreos.

A la vista del cdigo anterior. Cules seran las pruebas que hara? El objetivo es
buscar el nmero mnimo de pruebas que sea relevante, es decir, que prueben condiciones
distintas..
Esta

solucin

est

publicada

en

Solveet

en

el

siguiente

enlace:

http://www.solveet.com/exercises/Potencias-de-Dos/30/solution-1315

Solucin:

Las pruebas que yo hice estn resumidas en la siguiente tabla:

Cada prueba verifica un comportamiento (o ejecucin) distinta del cdigo. Para poder
determinar las pruebas a hacer a un cdigo es interesante conocer algunas de las tcnicas
clsicas que existen desde los aos 70 como anlisis de caminos, particiones equivalentes,
valores lmites, etc.
Hablemos de la refactorizacin. En este caso sera recomendable extraer el cdigo que
genera la cadena de texto con el nmero a un mtodo aparte, ya que convertir el resultado en
una cadena es una responsabilidad distinta de calcular la potencia de dos de un nmero. Otra
posible refactorizacin es mover la gestin del acarreo a una pequea clase auxiliar para que
se vea ms claro el por qu se hace cada operacin en el algoritmo.

Ejercicio 06.
Escriba un conjunto de pruebas para verificar el comportamiento de un mtodo que recibe
como parmetro dos conjuntos ordenados (o dos listas o dos arrays ordenadas de menor a
mayor) y devuelva un nuevo conjunto ordenado que contenga los elementos de ambos
conjuntos en el mismo orden.
Cmo podramos saber el nmero de elementos comunes que haba en ambos
conjuntos de entrada?
2

Solucin
Los valores de entrada son las dos listas ordenadas y el resultado obtenido es una tercera lista.
Veamos qu combinaciones podemos hacer.
Lista A
Lista B
Vaca
Vaca
Vaca
No vaca
No Vaca
Vaca
N elementos
N elementos
N elementos
M elementos
M elementos N elementos
M es siempre mayor que N.

Resultado esperado
Lista vaca
Lista B
Lista A
Lista con 2N elementos ordenada
Lista con N+M elementos ordenada
Lista con N+M elementos ordenada

Segn los resultados esperados podramos ahorrarnos algunas pruebas ya que las
ltimas combinaciones generan el mismo resultado. Pero si implementamos el cdigo vemos
que en los dos ltimos casos, aunque el resultado es el mismo, se ejecuta un cdigo distinto,
por lo que para cumplir con el criterio de caminos posibles aadiramos tambin las dos
ltimas pruebas.

Ejercicio 09.
Contamos con una clase C con un atributo a (por ejemplo de tipo String) y un mtodo getA que
nos devuelve su valor. Tambin disponemos de una factora F con un mtodo creaLista que no
admite ningn parmetro y crea y devuelve una lista (interfaz List) de objetos de clase C en el
que cada objeto tiene un valor en su atributo a distinto de los dems.
Escriba utilizando una herramienta XUnit un caso de prueba que verifique que todos
los objetos en la lista devuelta por el mtodo creaLista son distintos. Intente no presuponer el
orden de los elementos ni valores concretos para el atributo a.

Solucin

El cdigo que el enunciado nos dice que tenemos puede ser algo as:

public class C {
String a;

public C(String s) {
a = s;
}
public String getA() {
return a;
}
}
public class F {
public static List<C> creaLista() {
return Arrays.asList(new C("A"), new C("B"), new C("C"), new C("D"));
}
}

Veamos una posible prueba. En este caso la idea que aplico es guardar todos los
elementos de la lista en un conjunto y comprobar si ambos tienen el mismo tamao. Si no lo
tienen es que haba elementos repetidos. Para esto necesito que los objetos de la clase C se
puedan comparar, por lo que creo un comparador basado en el atributo A.

class ComparatorForC implements Comparator<C> {


@Override
public int compare(C arg0, C arg1) {
return arg0.getA().compareTo(arg1.getA());
}
}
@Test
public void testFactory_TodosLosElementosDeLaListaSonDistintos() {
List<C> listOfC = F.creaLista();
Set<C> setOfC = new TreeSet<C>(new ComparatorForC());
setOfC.addAll(listOfC);
assertEquals(listOfC.size(), setOfC.size());
}

Y la prueba funciona.
Sin embargo no me fio de esta prueba. Estoy dando por hecho que la prueba es
correcta pero slo la he hecho funcionar con una lista cuyos elementos son todos distitis. Si la
factora fallara y repitiera elementos, mi prueba lo detectara? No lo s.
Para resolver esta duda voy a crear a mano una lista con elementos repetidos y voy a
repetir la prueba. Si es capaz de detectar que la lista no es correcta y falla me sentir ms
seguro y confiar ms. Veamos el cdigo.

@Test
public void testDetectaListasErroneas() {

List<C> listOfC = Arrays.asList(new C("A"), new C("B"), new C("C"), new C("A"));
Set<C> setOfC = new TreeSet<C>(new ComparatorForC());
setOfC.addAll(listOfC);
assertEquals(listOfC.size()-1, setOfC.size());
}

Efectivamente, el conjunto tiene un elemento menos que la lista, por lo que mi prueba
es correcta.
Adems podemos aprovechar el cdigo anterior para practicar refactorizacin. Aunque
la prueba no tiene muchas lneas puede no ser fcil de entender, por ejemplo en el assert
puede que no est claro el por qu se resta un 1. Adems hay mucho cdigo repetido.
El primer paso es crear un mtodo factora que genere el conjunto de elementos a
partir de la lista.
private Set<C> createSetFromListUsingComparatorForC(List<C> listOfC) {
Set<C> setOfC = new TreeSet<C>(new ComparatorForC());
setOfC.addAll(listOfC);
return setOfC;
}

El segundo paso es mover el assert de la segunda prueba a un mtodo que indique con
ms claridad qu estamos probando:
void assertOneElementIsRepeated(List<C> listOfC, Set<C> setOfC) {
assertEquals(listOfC.size()-1, setOfC.size());
}

El cdigo de las pruebas quedara de esta manera.


@Test
public void testDetectaListasErroneas() {
List<C> listOfC = Arrays.asList(new C("A"), new C("B"), new C("C"), new C("A"));
Set<C> setOfC = createSetFromListUsingComparatorForC(listOfC);
assertOneElementIsRepeated(listOfC, setOfC);
}

Reconocimiento - CompartirIgual (by-sa)


Contacta con nosotros en formacion@iwt2.org

You might also like