Você está na página 1de 11

CAJA NEGRO Y BLANCA

En un documento en Word realice 3 ejemplos en los que la prueba de caja negra


pueda dar la impresin de que todo est bien, mientras que la prueba de caja
blanca pudiera descubrir errores. Enva tu archivo a travs de este medio.

Ejemplo 1: Tenemos un programita que te pide que ingreses un nmero entero del 1
al 12, y te devuelve el valor en el mes que le corresponde.

package Meses;
import java.util.Scanner;
public class Mes {
public void Mes(){
String mes = null;
Scanner ner = new Scanner (System.in);
System.out.println("Ingresar nmero entero del 1 al 12");
int numero = ner.nextInt();
numero = numero-1;
String arreglos2[] = new String[12];
arreglos2[0]= "Enero";
arreglos2[1]= "Febrero";
arreglos2[2]= "Marzo";
arreglos2[3]= "Abril";
arreglos2[4]= "Mayo";
arreglos2[5]= "Junio";
arreglos2[6]= "Julio";
arreglos2[7]= "Agosto";
arreglos2[8]= "Setiembre";

arreglos2[9]= "Octubre";
arreglos2[10]= "Noviembre";
arreglos2[11]= "Diciembre";
for(int j=0; j<arreglos2.length; j++){
if(numero ==j){
mes = arreglos2[j];
}
}
System.out.println("El nmero: "+(numero+1)+" para el mes: "+mes);
}
public static void main(String[] args) {
Mes mes = new Mes();
mes.Mes();
}
}
Aparentemente cuando ejecutamos el programa funciona con normalidad
Ingresamos un
entero
Ingresamos un
valor 0
Ingresamos
texto
Ingresamos
texto con
numero

Prueba

Esperado

Resultado

Enero

OK

0
hola
123dfg

Mensaje de
advertencia
Dato no
permitido
Dato no
permitido

null
Exception error
Exception error

Podemos probar cuantas combinaciones queremos, pero el programa solo


mostrara los datos vlidos en el rango del 1 al 12.

Pero si vamos con el anlisis del cdigo interno, podremos observar que no
hay control sobre los errores, sea de nmeros decimales, letras o valores
nulos, por ende utilizamos la tcnica de prueba de caja blanca para
resolverlos.

Cdigo corregido:

package Meses;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class Mes {
public void Mes(){
//Controlamos errores con el TRY CATCH
try{
String mes = null;
//Para el ingreso del numero
Scanner ner = new Scanner (System.in);
System.out.println("Ingresar nmero entero del 1 al 12");
int numero = ner.nextInt();
//Creamos un arreglo con los meses del ao
String arreglos2[] = new String[12];
//Damos valores al arreglo
arreglos2[0]= "Enero";
arreglos2[1]= "Febrero";
arreglos2[2]= "Marzo";
arreglos2[3]= "Abril";
arreglos2[4]= "Mayo";
arreglos2[5]= "Junio";
arreglos2[6]= "Julio";
arreglos2[7]= "Agosto";
arreglos2[8]= "Setiembre";
arreglos2[9]= "Octubre";
arreglos2[10]= "Noviembre";

arreglos2[11]= "Diciembre";
//Este if es importante para controlar que solo se ingresen numeros
//comprendidos entre 1 al 12
if(numero >=1 && numero<=12){
numero = numero-1;
for(int j=0; j<arreglos2.length; j++){
if(numero == j){
mes = arreglos2[j];
}
}
System.out.println("El nmero: "+(numero+1)+" para el mes: "+mes);
}
//De lo contrario daremos el mensaje
else{
System.out.println("Procure ingresar slo nmero enteros en el rango del 1 al 12");
}
//El catch controla excepcin, en caso se ingresan letras, numeros decimales
}catch(Exception ex){
JOptionPane.showMessageDialog(null, "Error, procure ingresar solo nmeros enteros:
"+ex);
}
}
public static void main(String[] args) {
//Mostramos los datos, creando el objeto
Mes mes = new Mes();
mes.Mes();
}
}

Ahora corregido con la tcnica de caja blanca, volvemos al test para ver si encontramos errores.

Prueba

Esperado

Resultado

12

Diciembre

OK

Ingresamos un
entero
Ingresamos un
valor 0
Ingresamos
texto
Ingresamos
texto con
numero

0
hola
123dfg

Mensaje de
advertencia
Dato no
permitido
Dato no
permitido

OK
OK
OK

Ejemplo 2: creamos un programa y una clase para realizar la conexin con una base
de datos, desde Java a MySQL.
El programa aparentemente funciona con normalidad, realiza la conexin a la base de
datos correctamente, veamos cmo:

package Conectar;
import java.sql.*;
import javax.swing.JOptionPane;
public class Conectar {
static Connection conn = null;
static String us = "root";
static String paw = "david";
static String bd = "ciudades";
static String url = "jdbc:mysql://localhost/ciudades";
public static Connection conectar(Connection conn) throws SQLException,
ClassNotFoundException{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,us,paw);
return conn;
}

public static void main(String[] args) throws SQLException, ClassNotFoundException {


Connection conec;
conec = Conectar.conectar(conn);
if(conec!=null){
JOptionPane.showMessageDialog(null, "La conexin fue realizada con exito");
}
else{
JOptionPane.showMessageDialog(null, "Error en los datos");
}
}
}
Si probamos el programa desde su interfaz notaremos que funciona con normalidad y
que realiza la conexin con xito, slo para casos en la que la configuracin de los
datos de la base de datos sea correcta.
Sin embargo si analizamos el cdigo, notaremos que no tiene control de errores
predeterminados por el usuario, haciendo la prueba de caja blanca corregimos varios
errores de control que no tena, esto es para que si un usuario tiene errores, tendr el
mensaje de que trata el error.
Cdigo corregido utilizando la tcnica de caja blanca:

package Conectar;
import java.sql.*;
import javax.swing.JOptionPane;
public class Comectar2 {
//Creamos una variable conn, lo usaremos en el mtodo estatico ENLACE
static Connection conn=null;
//Estos atributos representan las credenciales de la base de datos
//Nombre de base de datos, tu contrasea, usuario y url.
static String bd="ciudades";
static String pw="david";

static String usu="root";


static String url="jdbc:mysql://localhost/ciudades";
//Creamos un mtodo Statico llamado ENLACE, lo utilizaremos luego para realizar
//La conexin
public static Connection conectar(Connection conn)throws SQLException{
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,usu,pw);
}catch(ClassNotFoundException ex){
JOptionPane.showMessageDialog(null, ex, "Clase no encontrada"+ex.getMessage(),
JOptionPane.ERROR_MESSAGE); url=null;
}
//Esta clase lleva una variable y debe ser retornada
return conn;
}
public static void main(String[] args) throws SQLException, ClassNotFoundException {
try{
//Creamos una variable conec del tipo Connection
Connection conec;
//Llamamos al mtodo esttico conectar, le ponemos el parmetro conn
conec = Comectar2.conectar(conn);
//El if para saber si hay conexin
if(conec != null){
JOptionPane.showMessageDialog(null, "La conexin ha sido realizado con xito");
}
//Si fue incorrecto la operacin, entonces manda un mensaje
//Y muestra el error con la excepcin
}catch(SQLException ex){
JOptionPane.showMessageDialog(null, "Hubo un error en la conexin= " + ex);
}
}

Ejemplo 3: Un ejemplo sencillo de un programa que ingresa un usuario, la interfaz


normalmente recibe el usuario y contrasea correctamente, aparentemente el
programa es seguro en cuanto a ingresar los datos o almacenarlo.

Si vemos dentro del cdigo es algo


as:

Si realizamos pruebas de caja blanca, vemos el cdigo en s, veremos que no hay


garanta de seguridad, ya que los datos se almacenan en la misma clase, y cualquier
hacker puede ver los datos que se ingresan. Por ende en las mejoras que se le pueden
hacer es creando los mtodos para obtener los datos y mostrarlo, con los mtodos get
y set. Con ello obtenemos ms seguridad y optimizamos el cdigo para volver a
utilizarlo ms adelante, veamos el cdigo en ese caso:
La nueva clase, en donde almacenaremos los datos.

package Usuario;
public class Datos {
private String usuario;
private String password;
/**
* @return the usuario
*/
public String getUsuario() {
return usuario;
}
/**
* @param usuario the usuario to set
*/
public void setUsuario(String usuario) {
this.usuario = usuario;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
}

Y la manera enviamos los datos a la clase.

Cuando utilizamos clases, mtodos y atributos, ya estamos haciendo referencia al


modo de programacin orientado a objetos. Por lo tanto este ejemplo estaba en un
lenguaje estructurado, todo el proceso se haca en la misma clase, y por ende no daba
cabida para utilizar algunos cdigos en otras clases, por ende la mejora que se pudo
obtener es en la optimizacin del cdigo fuente y mejor seguridad en los datos.

Você também pode gostar