lunes, 3 de octubre de 2011
domingo, 18 de septiembre de 2011
viernes, 16 de septiembre de 2011
miércoles, 31 de agosto de 2011
jueves, 14 de julio de 2011
martes, 12 de julio de 2011
Arreglos, tablas y listas
Tarea 4
Realicé una lista enlazada simple en Python, con la cual puedo agregar al inicio, al final, eliminar, y imprimir la lista. En el vídeo primero explico rapidamente lo que son arreglos, tablas y listas y después mi código.
El vídeo originalmente dura 7 minutos pero al convertirlo de ogv a avi algo paso y solo dura 4 minutos.. lo que noto es que todo sucede más rápido así que si no alcanzan a leer pues es poreso que explico pero pueden ir poniendo pause y así.
Vídeo:
Código:
Ejecución:
Referencias:
Listas en Python
Listas enlazadas
Tablas de dispersión
Realicé una lista enlazada simple en Python, con la cual puedo agregar al inicio, al final, eliminar, y imprimir la lista. En el vídeo primero explico rapidamente lo que son arreglos, tablas y listas y después mi código.
El vídeo originalmente dura 7 minutos pero al convertirlo de ogv a avi algo paso y solo dura 4 minutos.. lo que noto es que todo sucede más rápido así que si no alcanzan a leer pues es poreso que explico pero pueden ir poniendo pause y así.
Vídeo:
Código:
#!/usr/bin/python
#listas simples enlazadas con python
class Nodo: # en clase nodo definio el dato..y el apuntador al siguiente nodo "" sig""
def __init__(self, dato):
self.dato = dato
self.sig = None
def __str__(self):#esta funcion me sirve para poder meter cualquier dato a la lista
return str(self.dato)
class ListaEnlazada:#esta clase me ayuda a manejar la lista enlazada identificando la cabeza y el ultimo elemenyo
def __init__(self):
self.cabeza = None
self.cola = None
def agregarFinal(self, dato): # funcion agregar al final
nodo_nuevo = Nodo(dato)
if self.cabeza == None: # aqui si no hay cabezera el elemento se vuelve la cabezera
self.cabeza = nodo_nuevo
if self.cola != None: # si si hay entonces se va a la cola.sig y esta apuntara a nodo nuevo
self.cola.sig = nodo_nuevo
self.cola = nodo_nuevo
def agregarInicio(self, dato):#aqui agregamos al inicio
nodo_nuevo = Nodo(dato)
if self.cabeza == None: # si no habia cabeza este se vuelve la cabeza
self.cabeza = nodo_nuevo
if self.cola != None: #cuando si habia mas datos entonces el nuevo elemento apuntara ala cabeza
nodo_nuevo.sig = self.cabeza
self.cabeza = nodo_nuevo # y la cabeza es el nuevo elemento(nodo nuevo)
def eliminar(self, d):#para eliminar
nodo = self.cabeza
anterior = nodo#usamos anterior como auxiliar
if self.cabeza.dato == d: #si el dato a eliminar esta en la cabezera se elimina la cabeza y el cabeza.sig se vuelve la cabeza
self.cabeza = self.cabeza.sig
else:#si no se busca en el resto
while nodo != None:
if nodo.dato == d:
anterior.sig = nodo.sig
anterior = nodo
nodo = nodo.sig
def imprimir(self):#aqui la funcion imprimir me ayuda a imprimir mientras haya elementos en la lista
nodo = self.cabeza
while nodo != None:
print nodo.dato
nodo=nodo.sig#aqui se recorre
lista = ListaEnlazada()#creo un objeto nuevo que llamo lista
lista.agregarFinal(1)
lista.agregarFinal(2)
lista.agregarFinal(3)
lista.agregarInicio(7)
lista.agregarFinal(4)
lista.agregarFinal(5)
lista.agregarFinal(6)
lista.agregarInicio(10)
lista.eliminar(10)
lista.eliminar(7)
lista.imprimir()
Ejecución:
Referencias:
Listas en Python
Listas enlazadas
Tablas de dispersión
sábado, 9 de julio de 2011
jueves, 7 de julio de 2011
Algoritmos recursivos
Tarea 3
Flood fill on Prezi
Aclaro que en la parte de Complejidad, llegué a esa conclusión por el pdf que leí más no me copie de la conclusión de nadie :D.
.
.
miércoles, 6 de julio de 2011
Fundamentos de la complejidad computacional
Tarea 2
Algoritmos de Huffman
c ------>3
d ------>1
e ------>3
g ------>1
i ------>2
l ------>3
m------>2
n ------>1
o ------>4
p ------>1
r ------>1
s ------>3
t ------>2
u ------->1
" "------>3
Algoritmo
Algoritmos de Huffman
La finalidad de este algoritmo es encontrar una manera de comprimir datos, la manera en que lo hace es dandole a cada símbolo un código, el código que se le da a cada símbolo depende de la frecuencia con que el símbolo aparece en los datos, es fácil de comprender, al símbolo que aparezca más veces en los datos tendrá un código de representación más corto que un símbolo que aparesca menos veces.
Para hacerlo se debe primero hacer una tabla que relacione al símbolo con su frecuencia(esto no corresponde al algoritmo de Huffman), para así empezar a hacer el árbol binario usando el algoritmo de Huffman.
Voy a hacer un ejemplo con la frase: "clase de algoritmos computacionales"
Letra Frecuencia
a ------>4c ------>3
d ------>1
e ------>3
g ------>1
i ------>2
l ------>3
m------>2
n ------>1
o ------>4
p ------>1
r ------>1
s ------>3
t ------>2
u ------->1
" "------>3
Algoritmo
Ahora teniendo mi frencuencia de palabras en la frase puedo empezar a dibujar mi árbol binario, el método para hacerlo es:
Hacer un arbol para cada símbolo escribiendo el símbolo con su frecuencia
Juntar los arboles con menor frecuencia para formar un nuevo árbol(binario), las etiquetas de los nodos serán la suma de las frecuencias de los hijos
Se repite el proceso hasta tener un solo árbol binario
Y este es el árbol que diseñé para la frase "clase de algoritmos computacionales":
Y ahora si estamos listos para codificar los símbolos, este paso del algoritmo es muy sencillo se escriben números en cada rama de el árbol, 0 para el lado izquierdo y 1 para el lado derecho.
Y ahora se ve de esta manera:
Entonces ahora poder encontrar el código de cada símbolo debemos empezar desde la raiz hasta el símbolo, por ejemplo:
para la letra "a" el código 010,
para la letra m el código 0011,
y para la letra "u" el código 01100,
podemos ver que entre menos es la frecuencia de la letra el tamaño de la cadena de código que representa a la letra se vuelve mas larga. Esto es el funcionamiento de el algoritmo.
Definición formal
Entradas
Tenemos el conjunto A que representa a los símbolos que se codificarán A={a1, a2,...an}
También el conjunto F que representa la frecuencia de cada símbolo F={f1, f2....fn},
Salidas
C representara el conjunto de códigos que representan a cada símbolo entonces tenemos C(A, F)={c1, c2, ... cn}. Esto quiere decir que por ejemplo c1 es la cadena de código que me representa a a1, a1 es el símbolo de entrada.
Complejidad
Por ser un algoritmo iterativo tiene su complejidad O(nlogn).
Ya que se tiene un bucle interno con complejidad logn y luego se repite n veces, dónde n es el conjunto de símbolos.
Características del algoritmo
La manera en que se ecuentra la tabla de frecuencia de palabras no es asunto de este algoritmo.
El caso óptimo es cuando se tiene que la probabilidad de que salga un número es una potencia negativa de dos.
El peor caso es cuando se tiene 2^-1.
Esto tiene sentido porque cuando se tiene una letra que sale el 50%, se supone que entre todos las demas símbolos habran probabilidades demasiado bajas, entonces se tendrán para ellos cadenas muy largas, que es lo contrario a lo que se busca.
Otros algoritmos
Existe otro algoritmo "codificación aritmética" que tiene ventaja sobre la codificación de Huffman pero su ventaja no es tan grande como para cambiar la simplicidad de Huffman y el no pago de patentes por la complejidad de codificación aritmética además de que este método no es tan libre de usarse ya que esta patentado por IBM.
Aplicaciones
Este algoritmo sigue siendo muy utilizado debido a su simplicidad, velocidad y no problemas de patentes.
Ejemplos de su uso en compresión multimedia de jpeg y mp3.
Referencias
lunes, 4 de julio de 2011
Fundamentos de la complejidad computacional
Tarea 2
Algoritmo de Huffman
La finalidad de este algoritmo es encontrar una manera de comprimir datos, la manera en que lo hace es dandole a cada símbolo un código, el código que se le da a cada símbolo depende de la frecuencia con que el símbolo aparece en los datos, es fácil de comprender, al símbolo que aparezca más veces en los datos tendrá un código de representación más corto que un símbolo que aparesca menos veces.
Para hacerlo se debe primero hacer una tabla que relacione al símbolo con su frecuencia(esto no corresponde al algoritmo de Huffman), para así empezar a hacer el árbol binario usando el algoritmo de Huffman.
Voy a hacer un ejemplo con la frase: "clase de algoritmos computacionales"
Letra | Frecuencia |
---|---|
a | 4 |
c | 3 |
d | 1 |
e | 3 |
g | 1 |
i | 2 |
l | 3 |
m | 2 |
n | 1 |
o | 4 |
p | 1 |
r | 1 |
s | 3 |
t | 2 |
u | 1 |
" " | 3 |
Ahora teniendo mi frencuencia de palabras en la frase puedo empezar a dibujar mi árbol binario, el método para hacerlo es:
- Hacer un arbol para cada símbolo escribiendo el símbolo con su frecuencia
- Juntar los arboles con menor frecuencia para formar un nuevo árbol(binario), las etiquetas de los nodos serán la suma de las frecuencias de los hijos
- Se repite el proceso hasta tener un solo árbol binario
Y este es el árbol que diseñé para la frase "clase de algoritmos computacionales"
Y ahora si estamos listos para codificar los símbolos, este paso del algoritmo es muy sencillo se escriben números en cada rama de el árbol, 0 para el lado izquierdo y 1 para el lado derecho.
Y ahora se ve de esta manera:
Entonces ahora poder encontrar el código de cada símbolo debemos empezar desde la raiz hasta el símbolo, por ejemplo:
para la letra "a" el código 010,
para la letra m el código 0011,
y para la letra "u" el código 01100,
podemos ver que entre menos es la frecuencia de la letra el tamaño de la cadena de código que representa a la letra se vuelve mas larga. Esto es el funcionamiento de el algoritmo.
Definición formal
Entradas
Tenemos el conjunto A que representa a los símbolos que se codificarán A={a1, a2,...an}
También el conjunto F que representa la frecuencia de cada símbolo F={f1, f2....fn},
Salidas
C representara el conjunto de códigos que representan a cada símbolo entonces tenemos C(A, F)={c1, c2, ... cn}. Esto quiere decir que por ejemplo c1 es la cadena de código que me representa a a1, a1 es el símbolo de entrada.
Complejidad
Por ser un algoritmo iterativo tiene su complejidad O(nlogn).
Ya que se tiene un bucle interno con complejidad logn y luego se repite n veces, dónde n es el conjunto de símbolos.
Características del algoritmo
La manera en que se ecuentra la tabla de frecuencia de palabras no es asunto de este algoritmo.
El caso óptimo es cuando se tiene que la probabilidad de que salga un número es una potencia negativa de dos.
El peor caso es cuando se tiene 2^-1.
Esto tiene sentido porque cuando se tiene una letra que sale el 50%, se supone que entre todos las demas símbolos habran probabilidades demasiado bajas, entonces se tendrán para ellos cadenas muy largas, que es lo contrario a lo que se busca.
Otros algoritmos
Existe otro algoritmo "codificación aritmética" que tiene ventaja sobre la codificación de Huffman pero su ventaja no es tan grande como para cambiar la simplicidad de Huffman y el no pago de patentes por la complejidad de codificación aritmética además de que este método no es tan libre de usarse ya que esta patentado por IBM.
Aplicaciones
Este algoritmo sigue siendo muy utilizado debido a su simplicidad, velocidad y no problemas de patentes.
Ejemplos de su uso en compresión multimedia de jpeg y mp3.
Referencias
lunes, 27 de junio de 2011
Algoritmos computacionales simples
Tarea 1
Para esta primera tarea elegí explicar el algoritmo de Relleno, en inglés Floodfill, este algoritmo sirve para rellenar áreas, nosotros mismos hemos utilizado este algoritmo en programas como Paint que vendría siendo la función que hace el "bote de pintura", o en el buscaminas, entre muchos otros juegos.
Hay varias maneras de llevar acabo la función de rellenar, es decir hay soluciones distintas para un mismo problema, pero como ya bien sabemos no todas son óptimas.
Para esta tarea elegí explicar el algoritmo Recursivo que ofrece la solución pero no es el mejor para resolver el problema, ya que falla cuando se tiene un arreglo de datos demasiado grande ocurre lo que se llama "Desbordamiento" así se dice cuando el puntero de la pila aumenta mas que el límite máximo del área a cubrir.
Para empezar a cubirir el área se requieren 3 parámetros que debe de recibir la función: el color con el que se rellenará, el color anterior, y el punto de partida.
Aparte de la manera óptima para el algoritmo y la que no lo es hay algunas variantes, en este caso en la forma recursiva explicaré como es que se puede hacer diferentes tipos de relleno dependiendo de la funcion que queremos que realice.
Y como dicen que una imagen vale mas que mil palabras aqui les muestro dos animaciones que obtuve de "Wikipedia".
Este es algoritmo recursivo de 4 direcciones:
Pseudocódigo
y este otro de 8 direcciones:
Pseudocódigo
La otra forma que dije anteriormente es la óptima, esta se trata de tener una cola vacía a la que se le van agregando coordenadas de pixeles, empezando por algún pixel random o que el usuario elija. No se usa recursión es un método más elaborado pero con el se llega a soluciones más rapidas sin tantas llamadas alguna función además que no presenta el problema de "desbordamiento", como el de recursión.
Esta es la animación que nos muestra su manera de funcionar:
Espero pronto poder agregarle esta funcionalidad a mi código de Paint, esperaría que para la próxima semana estarles mostrando mi código en javascript listo para probarse(tratare de hacerlo de las dos formas recursivo o sin recursión).
Referencias:
miércoles, 25 de mayo de 2011
Matemáticas-Tarea
jueves, 12 de mayo de 2011
Implementación interfaces gráficas
Taller
Bueno para esta entrada de Taller en los botones yo esperaría poder poner iconitos,
solo que ahora estoy mas interesada en algunas partes de funcionalidad.
Primero que nada para implementar CSS3 y Html5 hay que ver la compatibilidad que hay con los navegadores esta es una pequeña tabla que ayuda a saber que navegador soporta que:
En mi proyecto este es el código de los botones:
el borde al canvas se lo agregue así:
y estoy en la busqueda de imagenes para los botones, la manera que probé de poner imagenes en el botón es esta:
Bueno para esta entrada de Taller en los botones yo esperaría poder poner iconitos,
solo que ahora estoy mas interesada en algunas partes de funcionalidad.
Primero que nada para implementar CSS3 y Html5 hay que ver la compatibilidad que hay con los navegadores esta es una pequeña tabla que ayuda a saber que navegador soporta que:
En mi proyecto este es el código de los botones:
el borde al canvas se lo agregue así:
y estoy en la busqueda de imagenes para los botones, la manera que probé de poner imagenes en el botón es esta:
Interfaces gráficas
Clase
CSS 3
CSS, separa el contenido de la forma, se cumplió ya con las primeras especificaciones del lenguaje. Sin embargo, el objetivo de ofrecer un control total a los diseñadores sobre los elementos de la página ha sido más difícil de cubrir. Las especificaciones anteriores del lenguaje tenían muchas utilidades para aplicar estilos a las webs, pero los desarrolladores aun continúan usando trucos diversos para conseguir efectos tan comunes o tan deseados como los bordes redondeados o el sombreado de elementos en la página.
CSS 1 ya significó un avance considerable a la hora de diseñar páginas web, aportando mucho mayor control de los elementos de la página. Pero como todavía quedaron muchas otras cosas que los diseñadores deseaban hacer, pero que CSS no permitía especificar, éstos debían hacer uso de trucos para el diseño. Lo peor de esos trucos es que muchas veces implica alterar el contenido de la página para incorporar nuevas etiquetas HTML que permitan aplicar estilos de una manera más elaborada. Dada la necesidad de cambiar el contenido, para alterar al diseño y hacer cosas que CSS no permitía, se estaba dando al traste con alguno de los objetivos para los que CSS fue creado, que era el separar por completo el contenido de la forma.
CSS 2 incorporó algunas novedades interesantes, que hoy ya utilizamos habitualmente, pero CSS 3 todavía avanza un poco más en la dirección, de aportar más control sobre los elementos de la página.
Así pues, la novedad más importante que aporta CSS 3, de cara a los desarrolladores de webs, consiste en la incorporación de nuevos mecanismos para mantener un mayor control sobre el estilo con el que se muestran los elementos de las páginas, sin tener que recurrir a trucos o hacks, que a menudo complicaban el código de las web.
Propiedades nuevas en CSS 3
He aquí una lista de las principales propiedades que son novedad en CSS3.
Bordes
border-color
border-image
border-radius
box-shadow
Fondos
background-origin
background-clip
background-size
hacer capas con múltiples imágenes de fondo
Color
colores HSL
colores HSLA
colores RGBA
Opacidad
Texto
text-shadow
text-overflow
Rotura de palabras largas
Interfaz
box-sizing
resize
outline
nav-top, nav-right, nav-bottom, nav-left
Selectores
Selectores por atributos
Modelo de caja básico
overflow-x, overflow-y
Otros
media queries
creación de múltiples columnas de texto
propiedades orientadas a discurso o lectura automática de páginas web
Web Fonts
Estructura en HTML5
1-ESTRUCTURA:
En html5 la estructura de las páginas web deben seguir un esquema básico a la hora de hacer el diseño, un header para presentar la web donde se incluirá el menú, una zona de contenidos, una zona para elementos adicionales y la zona footer que será el pie de página. En principio el diseño sigue lo estandar aunque por la forma que quieren que sigamos como por ejemplo la sidebar , nos puede recordar a WordPress que a una página normal.
2-ELEMENTOS DE NAVEGACIÓN:
En html5 los menús deben realizarse medianta listas no ordenadas
.
3-CABECERA:
La cabecerá deberá incluir el logo a título de la página la cual debería ser un h1, seguido de un h2 con una breve descripción del contenido de la página web.
4-ELEMENTOS DE FECHA:
Cuando enviamos contenidos actualizados a la página web, por ejemplo noticias o post para un blog deberemos incluir una nueva etiqueta
En mi proyecto
Me gustaría que al momento de utilizar por ejemplo el lápiz, se cambie la forma del cursor a un lapicito.
Y este es un diseño muy simple de la pantalla de mi proyecto:
miércoles, 27 de abril de 2011
Sistemas distribuidos
Semana 12
Clase de Programación Orientada a Objetos
Bibliografía
http://es.wikipedia.org/wiki/Sistema_distribuido
http://es.wikipedia.org/wiki/Serializaci%C3%B3n
http://www.inmensia.com/blog/20110125/html5_web_sockets.html
http://notasweb.com/articulo/javascript/persistencia-de-objetos-javascript-en-html5.html
Clase de Programación Orientada a Objetos
Sistemas distribuidos
Se podría definir un sistema distribuido por un conjunto de computadoras que aunque están separadas físicamente y conectadas entre sí por una red, cada computadora tiene sus componentes de software y hardware que el usuario percibe como un solo sistema. El usuario puede acceder a recursos remotos de la misma forma que puede manejar recursos locales, o un conjunto de maquinas que usan un software para conseguir un objetivo común.
Los sistemas distribuidos tienen que ser confiables es por eso que si un componente del sistema de descompone otro componente debe poder reemplazarlo, a esto se le conoce como tolerancia a fallos.
Los tamaños de sistemas distribuidos pueden variar, a esto se le conoce como escalabilidad, es decir pueden ser para una red de área local, metropolitana o Internet.
Características
- Seguridad en el sistema distribuido
- Se ejecuta en muchas computadoras
- Interacción entre los equipos
- Software diseñado para ser compatible con varios usuarios y sistemas operativos
- Compatibilidad entre los dispositivos conectados
RMI
RMI(Java Remote Method Invocation) es un mecanismo de Java que llama a un método de forma remota. Es parte de el entorno de ejecución en Java y proporciona una manera sencilla para la comunican de servidores en aplicaciones distribuidas basadas en Java.
En otros lenguajes se puede utilizar CORBA o SOAP en vez de RMI.
La característica de RMI es la facilidad de su uso en la programación por estar diseñado en Java, se puede pasar objetos por referencia, recolectar basura y paso de tipos arbitrarios.
Con RMI, un programa en Java puede exportar un objeto y así estar accesible en la red, entonces el programa permanece esperando peticiones de un puerto TCP. Con este método un cliente podrá conectarse i llamar métodos dados al objeto.
La invocación tiene los siguientes pasos:
- Encapsulado de los parámetros.
- Invocación del método.
- El servidor manda alguna respuesta.
- El cliente recibe la respuesta y puede utilizarlo.
Serialización
La serialización es un proceso de calificación de un objeto en un medio de almacenamiento ya sea un archivo o un buffer de memoria con el propósito de mandarlo a través de un conexión de red como cadenas de bytes o un formato mas legible como XML.
Esta es una forma muy común de para pasar objetos a través de la red, para hacer persistente un objeto en un archivo o base de datos, o para distribuir objetos idénticos a varias aplicaciones.
Algunas ventajas son:
Un método para checar el cambio en variables con respecto al tiempo
Un método de persistencia de objetos
Un método para la distribución de objetos.
Socket
El socket es concepto abstracto en el cual dos programas programas pueden pasarse datos de manera ordenada.
Un socket se constituye de dos direcciones, una IP y una REMOTA, un protocolo de transporte un par de números de puerto local y remoto.
Los sockets permiten implementar un cliente-servidor. La comunicación debe ser iniciada por uno de los programas que se denomina programa cliente y el segundo programa se mantiene esperando a que el programa cliente inicie por eso se llama servidor.
En mi proyecto
En mi proyecto puedo implementar un pequeño ejemplo que utilicé algunos de estos métodos, lo que se me ocurre es que varias personas puedan dibujar online al mismo tiempo, para esto quiero utilizar algunas propiedades de Javascript y HTML5 como son los socket utilizando Websockets y la serialización :
"Con HTML5 contamos con una nueva técnica para almacenar datos persistentes en el navegador cliente. Cuando HTML5 esté ampliamente extendido podremos hacer uso del API DOM Storage de HTML5 con el cúal los datos persistirán entre sesiones sin tener que usar las limitadas cookies (4KB por cookie). Con el API DOM Storage y los métodos JSON#stringify y JSON#parse podremos almacenar objetos complejos de un modo muy sencillo."
Este es un ejemplo de página en donde varias personas pueden dibujar online:
http://william.hoza.us/graffiti/
Bibliografía
http://es.wikipedia.org/wiki/Sistema_distribuido
http://es.wikipedia.org/wiki/Serializaci%C3%B3n
http://www.inmensia.com/blog/20110125/html5_web_sockets.html
http://notasweb.com/articulo/javascript/persistencia-de-objetos-javascript-en-html5.html
domingo, 10 de abril de 2011
Diseño de pruebas unitarias
Semana 11
Y en la siguiente entrada aplicaré estos conceptos a mi proyecto.
JsUnit:
http://www.jsunit.net/
Bibliografía:
http://es.wikipedia.org/wiki/Prueba_unitaria
http://msdn.microsoft.com/es-es/library/ms182517(v=vs.80).aspx
Clase de Programación Orientada a Objetos
Ventajas
El objetivo de las pruebas unitarias es aislar cada parte del programa y probar su correcto funcionamiento, estas pruebas individuales proporcionan 5 ventajas básicas:
Limitaciones
Pruebas Unitarias para mi Proyecto en Javascript y Html5
Para esto lo primero que hice fue descargar JsUnit:
después descomprimimos el "jsunit2_2.zip", ahora dentro de la carpeta descomprimida tenemos varios archivos y carpetas interesantes por ejemplo: tenemos una carpeta llamada "tests" con muchos ejemplos útiles que podemos correr, y tenemos el archivo llamado "testRunner" que es en dónde probaremos nuestro código.
"testRunner.html"
Carpeta "tests"
Una prueba unitaria es la manera de probar el buen funcionamiento de un módulo de código. Esto sirve para asegurar que cada uno de los módulos funcione correctamente independientemente uno del otro.
El objetivo es escribirle casos de prueba a cada método en el módulo de forma que cada caso sea independiente de lo demás.
Las pruebas unitarias sirven para utilizar otro código fuente llamado directamente a los métodos de una clase, pasando los parámetros necesarios y después, si se incluyen instrucciones Assert se pueden comparar valores esperados, los métodos de las clases unitarias se basan en clases Test, que se almacenan en archivos de código fuente.
Características de las pruebas unitarias
Las pruebas unitarias deben cumplir con los siguientes requisitos para que sean buenas:
- Automatizable: Es decir no se debería hacer manualmente.
- Completas: Deben de contener la mayor cantidad de código.
- Repetibles: Se deben crear pruebas para ejecutarlas varias veces.
- Independientes: La ejecución de una prueba no tendrá nada que ver con la ejecución de otra prueba, deben ser independientes.
- Profesionales: Las pruebas deben ser tomadas en cuenta con la misma importancia que el código, con documentación, etc.
Ventajas
El objetivo de las pruebas unitarias es aislar cada parte del programa y probar su correcto funcionamiento, estas pruebas individuales proporcionan 5 ventajas básicas:
- Fomentan el cambio: Facilitan al programador encontrar errores para así poder reeprogramar el código.
- Simplifica la integración: Ya que si el código funciona correctamente indivdualmente se facilita más adaptarlo para las pruebas de integración.
- Documenta el código: En dónde las propias pruebas unitarias son documentación del código ya que se puede ver como utilizarlo.
- Separa la interfaz y la implementación
- Los errores son más fáciles de encontrar
Limitaciones
Se debe de saber que las pruebas unitarias no descubrirán todos los errores del código. Ya que sólo prueban unidades por si solas. Entonces no son capaces de descubrir errores de integracion, problemas de rendimiento, entre otros.
Para esto lo primero que hice fue descargar JsUnit:
después descomprimimos el "jsunit2_2.zip", ahora dentro de la carpeta descomprimida tenemos varios archivos y carpetas interesantes por ejemplo: tenemos una carpeta llamada "tests" con muchos ejemplos útiles que podemos correr, y tenemos el archivo llamado "testRunner" que es en dónde probaremos nuestro código.
"testRunner.html"
Carpeta "tests"
Después también encontré otra herramienta para pruebas unitarias que me ha gustado un poco más se llama Qunit, y es muy fácil de intalar solamente se tienen que descargar dos archivos uno .js y otro .css para poder ver el resultado de tus pruebas unitarias.
Así es como se ve:
Y en la siguiente entrada aplicaré estos conceptos a mi proyecto.
JsUnit:
http://www.jsunit.net/
Bibliografía:
http://es.wikipedia.org/wiki/Prueba_unitaria
http://msdn.microsoft.com/es-es/library/ms182517(v=vs.80).aspx
sábado, 9 de abril de 2011
Implementación de pruebas unitarias
Semana 11
Taller de Programación Orientado a Objetos
La prueba:
Y en mi proyecto hicé esta pequeña prueba que decia si el objeto devuelto era el esperado, como líneas, círculos...etc.
Este es el código:
Y esta es la prueba:
Podemos ver que todas pasaron a prueba sólo en el módulo 4 no dónde se esperaba un valor de retorno de false y llegó true.
Taller de Programación Orientado a Objetos
Para empezar les voy a mostrar un ejemplo de pruebas unitarias que lo que hace es verificar si el valor es un string o un número:
El código:
La prueba:
Y en mi proyecto hicé esta pequeña prueba que decia si el objeto devuelto era el esperado, como líneas, círculos...etc.
Este es el código:
Y esta es la prueba:
Podemos ver que todas pasaron a prueba sólo en el módulo 4 no dónde se esperaba un valor de retorno de false y llegó true.
Saludos.
Suscribirse a:
Entradas (Atom)