Viene de Parte 1

[Update 12/Dec/2012 More on combinatorial testing with PICT here: Combinatorial Testing for taking real world desitions]

Los conjuntos anteriores son independientes, por lo cual deberíamos probar todas las combinaciones posibles; sin embargo las posibles combinaciones son aproximadamente 112 (4 valores posibles para el parámetro mode X 2 valores posibles para el parámetro dwDesiredAccess X 2 posibles valores para el parámetro dwCreationDisposition X 7 posibles valores para el parámetro filePath). 112 pruebas manuales pueden convertirse en 4 días laborales (si gastamos 15 minutos por cada caso de prueba y trabajamos 8 horas diarias), por lo cual es mala idea obtener las combinaciones de forma manual. La mejor opción es utilizar la herramienta PICT de Jacek Czerwonka para encontrar un número de combinaciones que tengan la cobertura más eficiente.  Esta herramienta requiere que pasemos como parámetro los datos de entrada en el siguiente formato:

filePath:              c:\tareas.txt, c:\taras.txt, NULL, c:\, c:\mi, c:\cadenade255.txt,cadenade257.txt

mode:                  r, r+, rb, rb+

dwDesiredAccess:          GENERIC_READ, GENERIC_READ | GENERIC_WRITE

dwCreationDisposition:               PEN_EXISTING, OPEN_ALWAYS

Este artículo no es un tutorial de PICT, por lo cual mostraré la salida que produce dicha herramienta sin entrar en detalles:

 

Como se aprecia en la tabla anterior, PICT nos generó 28 casos de prueba combinando las variables independientes en orden 2 de forma eficiente. Si lo hubiéramos hecho manualmente habrían sido 112 de orden 4 que alcanzaban una cobertura un poco mejor a la generada por PICT.  Tenga en cuenta: lo importante no es conocer una herramienta, sino saberla usar: sin el análisis de datos que hicimos al inicio, no hubiéramos podido definir buenos datos de entrada.

Pruebas Estructurales

De igual forma que definimos una estrategia para el diseño de pruebas funcionales, necesitamos definir una estrategia para las pruebas estructurales. Las pruebas estructurales son casi siempre de nivel unitario y perspectiva caja blanca, por lo cual debemos revisar el código para conocer lo que vamos a probar. El código del método LoadFile se muestra a continuación:

char* LoadFile(char filePath[MAX_PATH], char* mode, DWORD dwDesiredAccess, DWORD dwCreationDisposition)

{    

      if(filePath==NULL)

      {

            return NULL;

      }

      else

      {

            int l=strlen(filePath);

           

            if(lMAX_PATH)

            {

                  return NULL;

            }

            else

            {

                  HANDLE hFile=CreateFile(filePath, dwDesiredAccess, FILE_SHARE_READ, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL);

 

                  if(hFile==INVALID_HANDLE_VALUE)

                  {

                        return NULL;

                  }

                  else

                  {

                        LARGE_INTEGER size;

                        GetFileSizeEx(hFile, &size);

                        CloseHandle(hFile);

 

                        if(size.LowPart>MAX_FILE_SIZE)

                        {

                             return NULL;

                        }

                        else

                        {

                             char *fileContent=new char[size.LowPart];

 

                             if(fileContent==NULL)

                             {

                                   return NULL;

                             }

                             else

                             {                      

                                   FILE *fp=fopen(filePath, mode);

 

                                   if(fp==NULL)

                                   {

                                         return NULL;

                                   }

                                   else

                                   {

                                         int i=0;

 

                                         while(!feof(fp))

                                         {

                                               fileContent[i]=fgetc(fp);

                                               i++;

                                         }

 

                                         return fileContent;

                                   }

                             }                                                         

                        }

                  }

            }

      }

}

Continúa en Parte 3