Está en la página 1de 50

1.

API de Java - JUnit

• La API de Java de un vistazo


• JUnit. Pruebas de unidad.
• Logging
• Debugging
• Librerías externas. Ejemplo: VLCj

Programación III
Versiones + Perfiles compact
• Hasta Java 7 versiones dependiendo de la amplitud:
– Java EE - Enterprise Edition
• Java distribuido / servidor de aplicaciones
– Java SE - Standard Edition
– Java ME - Micro Edition
• Dispositivos móviles y embebidos
• Dentro de Java 8 SE: perfiles compact
– Subconjuntos de la API para capacidades limitadas
• compact1 < compact2 < compact3 < Full SE API

Programación III
compact1
• Core
– java.lang
• Provides classes that are fundamental to the design of the
Java programming language.
– java.lang.annotation
• Provides library support for the Java programming
language annotation facility.
• [Metadatos] Información extra (no código) para el
compilador / deployment / runtime. Ejemplos:
» @Override, @Deprecated
» @SupressWarnings( tipo )
• En Java 8 hay más complejas (type annotations)
Programación III http://docs.oracle.com/javase/tutorial/java/annotations/
compact1 (2)
• Números grandes
– java.math
• Provides classes for performing arbitrary-precision integer
arithmetic (BigInteger) and arbitrary-precision decimal
arithmetic (BigDecimal).
• Seguridad
– java.security
– Provides the classes and interfaces for the security
framework.
– javax.security.auth / callback / login / cert
– javax.crypto
• Provides classes and interfaces for cryptographic ops

Programación III
compact1 (3)
• Red
– java.net
• Provides the classes for implementing networking
applications.
– javax.net / javax.net.ssl
(EjemploSockets.java)
• Ref Objects
• java.lang.ref
• Provides reference-object classes, which support a limited
degree of interaction with the garbage collector.

Programación III http://docstore.mik.ua/orelly/java-ent/jnut/ch13_01.htm


compact1 (4)
• Expresiones regulares (EjemploPattern.java)
– java.util.regex Classes for matching character
sequences against patterns specified by regular
expressions.
• Clase Pattern

String expReg = "p.*\\..*";


Pattern pat1 = Pattern.compile( expReg );
if (pat1.matcher(s).matches()) ...

Programación III http://docs.oracle.com/javase/tutorial/essential/regex/


compact1 ( 5)
• Fechas y horas (EjemploFechas.java)
– java.time The main API for dates, times, instants,
and durations.
– java.time.chrono / format / temporal / zone
– Clases Date, SimpleDateFormat, GregorianCalendar

Date d1 = new Date();


SimpleDateFormat f1 = new SimpleDateFormat(
"dd/MM/yyyy" );
System.out.println( f1.format(d1) );

Programación III
compact1 (6)
• E/S y Serialización
– java.io Provides for system input and output through
data streams, serialization and the file system.
– java.nio Defines buffers, which are containers
for data, and provides an overview of the other NIO
packages.
• java.nio.channels / charset / file ...

Programación III
compact1 (7)
• Java Collections (JC)
– java.util
• ArrayList, Arrays, HashMap, ...
– Además en java.util:
• Raíz del modelo de eventos (EventListener, EventObject)
• Fecha y hora
• Internacionalización (Locale) (tb en java.util.spi)
• Otras: StringTokenizer, Random, BitSet (array de bits),
Properties...
(EjemploLocale, StringTokenizer, Random)

http://docs.oracle.com/javase/tutorial/collections/
Programación III http://docs.oracle.com/javase/tutorial/i18n/locale/services.html
compact1 (8)
• Logging (EjemploLogger.java)
– java.util.logging Provides the classes and
interfaces of the JavaTM 2 platform's core logging
facilities.

Logger logger = Logger.getLogger( "Clase1" );


logger.setLevel( Level.ALL );
logger.log( Level.INFO, "Empezando" );
...
catch (Exception e) {
logger.log( Level.SEVERE, e.toString(), e );

Programación III http://docs.oracle.com/javase/7/docs/technotes/guides/logging/overview.html


compact1 (9)
• Concurrencia
– java.util.concurrent Utility classes commonly useful
in concurrent programming.
– java.util.concurrent.atomic / locks
• Reflectividad (reflection) (EjemploReflectividad.java)
• java.lang.reflect Provides classes and interfaces
for obtaining reflective information about classes
and objects.

Programación III
compact1 ( 10)
• JAR
– java.util.jar Provides classes for reading and
writing the JAR (Java ARchive) file format, which is
based on the standard ZIP file format with an
optional manifest file.
• ZIP (EjemploZip.java)
– java.util.zip Provides classes for reading and
writing the standard ZIP and GZIP file formats.

Programación III
compact1 (11)
• Scripting (EjemploScripting.java)
– javax.script The scripting API consists of interfaces
and classes that define Java TM Scripting Engines
and provides a framework for their use in Java
applications.
• Texto (EjemploNumberFormat.java)
– java.text Provides classes and interfaces for
handling text, dates, numbers, and messages in a
manner independent of natural languages.
• Formateo de fechas, números y mensajes
– (DateFormat, DecimalFormat, NumberFormat)

Programación III http://docs.oracle.com/javase/7/docs/technotes/guides/scripting/programmer_guide/


compact1 (12)
• Java 8: Expresiones lambda y referencias a métodos
– java.util.function Functional interfaces provide
target types for lambda expressions and method
references.
– java.util.stream Classes to support functional-
style operations on streams of elements, such as
map-reduce transformations on collections.
– java.lang.invoke The java.lang.invoke package
contains dynamic language support provided directly
by the Java core class libraries and virtual machine.

Programación III http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html


Lambda expressions
• Expresión lambda: ( pars ) -> código
• -> arrow o lambda operator
• Una e.l. puede ir donde pueda ir un objeto que
implemente un interfaz funcional
• Un interfaz funcional es un interfaz con un solo método
(Runnable, ActionListener, Comparable)
(ConceptoLambda.java)
(EjemploLambda.java - EjemploLambda2,3)

Programación III http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html


API - compact2 (1)
• JDBC
– java.sqlProvides the API for accessing and processing
data stored in a data source (usually a relational
database) using the Java programming language.
– javax.sql / javax.transaction
• RMI (Remote Method Invocation)
– java.rmi
• Comunicación remota
• Un objeto de una JVM puede llamar a un método de otro
en otra JVM (ej: aplicación cliente/servidor)

Programación III http://docs.oracle.com/javase/tutorial/rmi/


compact2 (2)
• XML/JAXP (Java API for XML Processing)
– javax.xml / org.w3c.dom / org.xml.sax

Programación III http://docs.oracle.com/javase/tutorial/jaxp/


compact3
• Security(*)
– javax.security.auth.kerberos / sasl
• XML / JAXP2(*)
– javax.xml.crypto
• Encriptado de XML
• JMX (Java Management eXtensions)
– javax.management / java.lang.management
– Gestión y monitorización de aplicaciones y la JVM

Programación III
compact3 (2)
• Instrumentación
– java.lang.instrument Provides services that
allow Java programming language agents to
instrument programs running on the JVM.
• Monitorización, profiling, analizadores... de Java
• JNDI (Java Naming and Directory Interface):
– javax.naming Provides the classes and interfaces for
accessing naming services.

Programación III
compact3 (3)
• Otros:
– javax.annotation.processing Facilities for
declaring annotation processors and for allowing
annotation processors to communicate with an
annotation processing tool environment.
– javax.lang.model Classes and hierarchies of
packages used to model the Java programming
language.
• Para reflectividad
– javax.sql.rowset Standard interfaces and base
classes for JDBC RowSet implementations.
• Más de JDBC

Programación III
Resto de Java SE (1)
• Security (**)
– java.security.cert Provides classes and interfaces
for parsing and managing certificates, certificate
revocation lists (CRLs), and certification paths.
– java.security.interfaces Provides interfaces for
generating RSA (Rivest, Shamir and Adleman
AsymmetricCipher algorithm) keys as defined in the
RSA Laboratory Technical Note PKCS#1, and DSA
(Digital Signature Algorithm) keys as defined in
NIST's FIPS-186

Programación III
Java SE (2)
• AWT
– java.awt
– java.awt.color
– java.awt.datatransfer (clipboard)
– java.awt.event
– java.awt.font
– java.awt.image
– java.awt.print
• Java 2D
– Clase java.awt.Graphics2D
– java.awt.geom

Programación III
Java SE (3)
• AWT - Drag & drop
• java.awt.dnd transfer information between two
entities logically associated with presentation
elements in the GUI.
• Input Methods
– java.awt.im Provides classes and interfaces for the
input method framework.
• Applets
• java.applet Provides the classes necessary to
create an applet and the classes an applet uses to
communicate with its applet context.
http://docs.oracle.com/javase/tutorial/uiswing/dnd/
Programación III http://docs.oracle.com/javase/7/docs/technotes/guides/imf/
Java SE (4)
• Swing
• javax.swing
• javax.swing.border
• javax.swing.colorchooser
• javax.swing.event
• javax.swing.filechooser
• javax.swing.plaf (look&feels)
• javax.swing.table (JTable)
• javax.swing.text (text components, html parser)
• javax.swing.tree (JTree)
• javax.swing.undo (soporte undo/redo)

Programación III
Java SE (5)
• Image I/O
– javax.imageio (E/S bmp, jpeg...)
• Print Service
– javax.print Java Print Service API.
• Sound
– javax.sound.midi
– javax.sound.sampled

Programación III
Java SE (6)
• Beans
– java.beans Contains classes related to
developing beans -- components based on the
JavaBeans™ architecture.
• javax.activation / javax.annotation
• Accessibility
– javax.accessibility Defines a contract between user-
interface components and an assistive technology
that provides access to those components.

Programación III
JavaSE (7) - CORBA / OMG

– org.omg.CORBA (Apls. distribuidas)


– org.omg.IOP / org.omg.Messaging /
org.omg.PortableInterceptor /
org.omg.PortableServer / org.omg.SendingContext /
javax.activity / org.omg.CosNaming (IDL)
– javax.rmi (RMI-IIOP)

Programación III
Java SE (8)
• XML (*) /JAX-WS
– javax.xml
• Java Web Services
– javax.jws
• Preferences
– java.util.prefsThis package allows applications to
store and retrieve user and system preference and
configuration data.
(EjemploPreferences.java)
– JNI (Java Native Interface)

Programación III
JUnit y pruebas unitarias
• JUnit es un framework para desarrollar pruebas
unitarias
– Pruebas de una clase / módulo de código
– Objetivo: aislar las partes y probar la corrección de
cada una
– Se podrán ejecutar de forma automática
• JUnit es una herramienta gratuita
– http://www.junit.org
– Integrada con Eclipse, NetBeans y otros IDEs

Programación III
¿Ganamos/perdemos tiempo?
• Es habitual la idea de que hacer JUnit's es una pérdida
de tiempo
– Pero es más una inversión
– No sólo vale para prueba inicial sino
• seguir probando en la evolución del sistema
• permiten incorporar los bugs como nuevas pruebas
• de forma progresiva ("aprender de los errores")
• ¡Merece la pena invertir el tiempo para luego
recuperarlo!

Programación III
Versión de JUnit
• JUnit 3 utiliza código Java "habitual"
• JUnit 4 utiliza anotaciones
• JUnit 5 – sept. 2017 – incorpora Java 8

Programación III
Pasos a seguir JUnit3
– Importar JUnit:
– import junit.framework.TestCase;
– Crear una clase que extienda TestCase
• Clase de pueba para una clase
– Implementar método setUp()
• Inicialización de las pruebas
– Implementar método tearDown()
• Si procede para liberar recursos (cerrar ficheros...)
– Definir métodos de test: testXXX()
• Uno por cada método original (XXX = nombre)

Programación III
Lanzar JUnit
– Para ejecutar JUnit no tiene main. El framework
carga la clase, crea un objeto, y va lanzando los
métodos en orden.

Programación III
¿Qué hay en los tests?
– Varios métodos que se pueden utilizar:
• assertEquals( val1, val2 ) --> si no son equals, fallo
• assertTrue( cond ) --> si no es cierta, fallo
• fail( mensaje ) --> si llega a ejecutarse es fallo
– Y otros:
• assertFalse( cond )
• assertNull( obj ), assertNotNull( obj )
• assertSame( obj, obj ), assertNotSame( obj, obj )

Programación III
Ejemplo
public class OperacionTest extends TestCase {
Operacion o1;
protected void setUp() throws Exception {
super.setUp();
o1 = Operacion.creaOperacion( "2 / -3 * (17 + 1)" );
}
public void testCreaOperacion() {
Operacion o1b = new OperacionBinaria(
new Numero(2), '/', new Numero(-3) );
Operacion o1b2 = new OperacionBinaria(
new Numero(17), '+', new Numero(1) );
o1b = new OperacionBinaria( o1b, '*', o1b2 );
assertEquals( o1, o1b );
assertTrue( o1.getValor()==o1b.getValor() );
}

Programación III
TestSuite
• Se pueden agrupar varias pruebas
– Para lanzar todas juntas

TestSuite ts = new TestSuite( "ejemplo" );


ts.addTest( new OperacionTest() );
ts.addTest( new FraccionTest() );
ts.addTest( new RealTest() );

Programación III
¿Y JUnit 4?
• JUnit 4 no necesita heredar de TestCase.
• En JUnit 4 los métodos no tienen que llamarse de una
forma fija, simplemente se pone una anotación
dependiendo de lo que queramos que haga ese
método:
– @Before - setUp
– @After - tearDown
– @Test - test...

Programación III
JUnit 4 (2)
• También hay:
– @BeforeClass, @AfterClass
– @Test (expected = Exception.class)
– @Test (timeout = msegs)
• Métodos de assert disponibles:
– fail( [stringMensaje ] )
– assertTrue( [stMens,] boolCondición )
– assertEquals( [stMens,] valEsperado, valor )
– assertEquals( [stMens,] valEsperado, valor, tol )
– assertSame/assertNotSame([stMens], refEsp, ref)
– assertNull / assertNotNull( [stMens], objeto )

Programación III
Suites en JUnit 4
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith( Suite.class )
@SuiteClasses( {
CocheTest.class,
EstrellaTest.class
...
} )

public class AllTests {


// No hace falta código
}

Programación III
JUnit paramétrico
• Si se quieren hacer test similares con varios valores se puede usar un
while/for o utilizar JUnit paramétrico:
@RunWith(Parameterized.class) // Prepara test paramétrico
public class TestParametrico {
@Parameters // Anotación de método de valores
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{ "", "" }, // ...
{ null, null }
});
}
@Parameter(0) // primer elemento
public String dato;
@Parameter(1) // segundo elemento
public String resultado;
@Test // El test se ejecutará tantas veces como elementos
public void test() {
assertEquals( resultado, metodoEnTest( dato ));
}

Ver TestUtilsStringParametrico.java
Programación III
Cobertura de tests
• Se llama cobertura al % de código que cubren los tests
unitarios. Lo ideal es el 100% ☺
• Hay herramientas que lo calculan automáticamente
• Por ejemplo EclEmma
(las últimas versiones
de Eclipse lo integran)

update.eclemma.org

Programación III
¿Y si no tengo Eclipse?
• Eclipse hace automáticamente algo que también se
puede programar. Por ejemplo:
import org.junit.runner.*;
import org.junit.runner.notification.Failure;
public class LanzadorJUnit {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(
ClaseTest.class );
for (Failure failure:result.getFailures()) {
System.out.println(failure.toString());
}
if (result.wasSuccessful()){
System.out.println("Tests ok! ");
} } }

Programación III
Relación entre pruebas
unitarias y logging
• Ambas valen para depurar
– Con las pruebas units. el log no vale de mucho (la
prueba sigue un recorrido "fijo"), para depurar los
errores podríamos usar debug en lugar de observar
los logs (aunque también)
– El log nos da pistas de errores inesperados
• Nos permite reproducirlo para depurarlo
– (Serie de acciones no previstas o no probadas)
• Un log de un bug puede y debe dar pie a un nuevo caso a
añadir a la prueba unitaria
– El log permite hacer también analítica de uso

Programación III
Hablando de depurar...
• Funciones básicas del debug
– F11 - Debug (vs. "run" Ctrl+F11) / ctrl+F2: Acabar
• Se para en el primer breakpoint
– Editar breakpoints - propiedades
– F5: Ejecuta entrando en el método (step into)
– F6: Ejecuta todo el método (step over)
– F7: Ejecuta hasta después del return
– F8: Relanza ejecución (hasta próximo bp)
– ctrl+R: Ejecuta hasta la línea en el cursor
– ctrl+sft+I: Muestra valor de expresión en cursor
– ctrl+sft+N: Abre panel de instancias de la clase

Programación III
Particularidades Debug... (1)
• Se puede hacer una parada cuando se lanza una
excepción: Run > Add Java Exception Breakpoint
– También se puede hacer con carga de clase
– También con cambio o acceso a variable (hacer el
breakpoint en la declaración)
– También con entrada o salida de método
• Las clases por las que se pasa en el paso-a-paso se
pueden filtrar:
– Window > Preferences > Java > Debug > Step
Filtering

Programación III
Particularidades Debug... (2)
• Hot swap debugging
– Cuando Eclipse en modo Debug está ejecutando un
método, ese método está cargado en memoria, con
lo cual no puede cambiarse.
(Al intentarlo --> cod "antiguo", o "reiniciar")
– Sí se puede cambiar OTRO método diferente al que
se está ejecutando (eso no afecta al estado actual de
ejecución).
– No se pueden añadir métodos o cambiar signaturas
(hacer cambios estructurales)

Programación III
APIs Externas
• No siempre se instalan igual
– Lo normal es que haya uno o varios .jar
• JUnit es una librería externa
– Aunque Eclipse la trae "puesta"
– Proceso general:
• Descargar
• Copiar en /lib o similar
• Agregar en Eclipse (Project|Properties|Java Build Path)
– Agregar el javadoc si se dispone de él
– Ejemplo: VLCj
• http://www.capricasoftware.co.uk/projects/vlcj/index.html

Programación III
Ejercicios (1)
• Busca cuatro tipos de @SupressWarnings
• Calcula decimales de pi con la clase BigDecimal ¿hasta
cuántos decimales puedes llegar?
• Modifica el ejemplo de comunicación por sockets para
enviar imágenes además de textos
• Usa Pattern para identificar una URL válida
• Programa un método que por reflectividad visualice
todos los nombres y valores de atributos de cualquier
objeto dado

Programación III
Ejercicios (2)
• Busca cualquier código que tengas con eventos e hilos y
sustituye todo lo posible por funciones lambda de Java
8
• Realizar un programa que visualice etiquetas y valores
de un fichero XML
• Crea una clase que opere con fracciones. Construye una
prueba unitaria en JUnit 4 para sus operaciones.
• Utiliza Logger para generar un log en fichero con toda la
información de interacción de alguna ventana que
tengas

Programación III
Ejercicios (3)
• Utiliza la solución de la práctica de ecosistema y depura
su ejecución. Observa cómo ocurren los hilos y la
diferencia entre el hilo de simulación y el de Swing.
• Busca y prueba un código sencillo para Google Drive,
utilizando la API de acceso desde Java

Programación III

También podría gustarte