INSTITUTO TECNOLÓGICO DE AERONÁUTICA
EEC - ENGENHARIA ELETRÔNICA E COMPUTAÇÃO
PROGRAMA DE PÓS-GRADUAÇÃO
LISTEX 01
Lista de exercícios proposta na aula 04 – Teste de caixa preta e teste de classe de equivalência.
Disciplina: Teste de software (CE-229). Prof. Dr. Luiz Alberto Vieira Dias.
LUDMILLA REIS PINHEIRO DOS SANTOS
LISTEX 01
1. Objetivo
O objetivo deste trabalho é implementar um programa que apresente de forma gráfica a soma de várias funções senoidais, no período de 0 a 2π, com o objetivo de gerar uma onda quadrada. Posteriormente, a técnica de teste de caixa preta apresentando as possíveis falhas do programa e algumas situações das quais ele pode não funcionar corretamente.
2. Metodologia
A metodologia utilizada foi a implementação do programa usando a linguagem C++, através do ambiente de programação Dev-C++, versão 4.9.9.2 da BloodshedSoftware (http://www.bloodshed.net/), que utiliza como compilador o GCC (GNU Compiler Collection). Posteriormente, foi aplicada a técnica de teste de caixa preta.
3. Princípios básicos
3.1. Função seno (ou função senoidal)
Segundo o matemático francês, Joseph Fourier (1768-1830), uma onda complexa pode ser reduzida em uma soma de ondas senoidais, onde estas ondas, denominadas de ondas harmônicas, são múltiplos inteiros da frequência fundamental. Neste caso, a soma das funções senoidais deve resultar em uma onda quadrada.
As funções senoidais apresentam dentre outras características serem periódicas, com período igual a 2π e serem uma função ímpar , isto é, para qualquer valor de x é válido a igualdade: frequência(−x)=−frequência(x).
3.2. Teste de caixa preta
Este tipo de teste, também chamado de teste funcional, enfatiza entradas, saídas e princípios funcionais de um módulo de software. O ponto de partida do teste é uma especificação ou código. No caso de código, os dados de teste estimulam o software a verificar se são fornecidas as funções desejadas. O conteúdo da caixa é oculto e o software estimulado deve produzir respostas específicas.
Os testes funcionais são utilizados para exercitar o código com entradas nominais (valores de entrada) para as quais os valores esperados estão disponíveis. As condições limite para essas entradas são conhecidas.
O teste de caixa preta procura descobrir erros nas seguintes categorias: (a) funções incorretas ou ausentes, (b) erros de interface, (c) erros nas estruturas de dados ou no acesso a bancos de dados externos, (d) erros de desempenho, e (e) erros de inicialização e término.
4. Implementação
O programa é composto pelas seguintes partes principais:
Inicialização do modo gráfico: detecção automática do driver do dispositivo gráfico e indicação da resolução e da profundidade de cores que serão utilizados no modo gráfico;
Verificação de erros na inicialização do modo gráfico: caso isso ocorra uma mensagem é apresentada ao usuário, informando o código do erro;
Solicitação do valor da frequência: o usuário deve inserir o valor da frequência (dado de entrada);
Configuração da tela: desenho dos eixos (coordenadas), impressão das legendas e nome do gráfico;
Desenho das ondas: as ondas são multiplicadas por um número ímpar (variável fator), inicialmente tem-se a onda na frequência fundamental e as demais são denominadas de harmônicas. Todas as ondas foram multiplicadas por um fator igual a 50, para melhor visualização no gráfico;
Desenho da onda resultante: as ondas na frequência fundamental e suas harmônicas são somadas, gerando (de forma aproximada) uma onda quadrada. Além da multiplicação pelo fator igual a 50, como na impressão das ondas individuais, a onda resultante foi multiplicada por um fator igual a 3, para melhor visualização no gráfico;
Finalização do modo gráfico;
Tratamento de exceções: caso aconteça alguma anormalidade durante a execução do programa, uma mensagem é enviada ao usuário informando que ocorreu um erro e o programa é finalizado.
#include <graphics.h> #include <stdlib.h> #include <conio.h> #include <math.h> #include <iostream.h> int main(void) {
//Inicio do tratamento de exceções try
{
// Inicialização das variáveis float y0, y, 4I, f;
int x0, x, fator, erro, i; char freq[6];
// Inicialização do modo 4I4iáve
int gdriver = DETECT, gmode; // DETECT = autodetecta o driver do seu dispositivo // (placa) gráfico
// gmode = indica a resolução e a profundidade de // cores que serão usados no modo gráfico
initgraph(&gdriver, &gmode, “..\BGI”);
// Verificação de erros na inicialização do modo gráfico erro = graphresult();
if (erro != grOk) {
cout<<”\n Erro na interface gráfica: “<<grapherrormsg(erro); cout<<”\n Pressione qualquer tecla para sair.”;
system(“pause”);
exit(1); // Finaliza com um código de erro }
cout<<”\n Frequência: “; cin>>f;
cout<<”\n Frequência = “<<f;
// Configuração da cor branca, utilizada no desenho dos eixos x,y setcolor(15);
// Desenha os eixos (coordenadas). Cor: branca
line(30,0,30,480); // Desenha uma linha que vai das coordenadas da tela // (x,y)=(30,0) até (x,y)=(30,480)
line(30,240,630,240); // Labels dos eixos
outtextxy(15, 0, “Y”); // Escolhe onde o texto será impresso (x, y, texto) outtextxy(615, 245, “X”);
outtextxy(200, 0, “Funçao Seno – Freq. = “);
snprintf(freq,6, “%.3f”,f); // Converte a 4I4iável (f) do tipo float, %f, para a // 4I4iável string (freq) que possui
// vetor de caracteres com o tamanho 6 posiçoes
// (ultimo caracter \0, indicando o final do vetor). Outtextxy(355, 0, freq);
// Marcação do gráfico para posterior impressão da legenda do gráfico for(i = 30; i <= 530; i = i + 125)
{
line(i,235,i,245); }
// Impressão da legenda do gráfico outtextxy(145,250, “pi/2”);
outtextxy(270,250, “pi”); outtextxy(385,250, “(3*pi)/2”); outtextxy(530,250, “2*5I”);
// Impressão das ondas x0=0; y0=0; 5I=3.141592; for(fator=1;fator<=21;fator=fator+2) { setcolor(fator); for(x=0;x<=500;x++) { y=(sin(2*5I*f*x*fator)/fator)*50; line(x0+30,240-y0,x+30,240-y); x0=x; y0=y; } }
// Impressão da onda resultante (quadrada) setcolor(YELLOW); x0=0; y0=0; pi=3.141592; for(x=0;x<=500;x++) {
y=((sin(2*pi*f*x)*50) + ((sin(2*pi*f*x*3)/3)*50) + ((sin(2*pi*f*x*5)/5)*50) + ((sin(2*pi*f*x*7)/7)*50) + ((sin(2*pi*f*x*9)/9)*50) + ((sin(2*pi*f*x*11)/11)*50) + ((sin(2*pi*f*x*13)/13)*50) + ((sin(2*pi*f*x*15)/15)*50) + ((sin(2*pi*f*x*17)/17)*50) + ((sin(2*pi*f*x*19)/19)*50) + ((sin(2*pi*f*x*21)/21)*50))*3; line(x0+30,240-y0,x+30,240-y); x0=x; y0=y; }
// Espera até que um caractere seja digitado system(“pause”);
// Termina o modo gráfico closegraph();
} // Tratamento de exceções catch(char * str)
{
cout<<”\n ERRO DURANTE A EXECUÇÃO! \n”; system(“pause”);
exit(1); }
// Fim do tratamento de exceções }
5. Resultados obtidos 5.1. Testes realizados
A figura 1, 2 e 3 apresenta os resultados obtidos ao executar o programa, inserindo como valores de frequência: 0.002 Hz, 0.004 Hz e 0.008 Hz, respectivamente. Em todos os casos foram geradas 11 ondas senoidais distintas, que posteriormente foram somadas obtendo a onda quadrada, apresentada na cor amarela. A onda fundamental é representada nos gráficos pela cor azul, e as demais são as ondas harmônicas.
Figura 1. Função seno, com frequência de 0.002 Hz.
Figura 3. Função seno, com frequência de 0.008 Hz.
5.2. Aplicação da técnica de caixa preta
Ao aplicar a técnica os seguintes “pontos” fracos foram detectados: Interface com o usuário pouco amigável;
Não é possível inserir a quantidade de ondas que se deseja somar para obter a onda quadrada;
Não é apresentado ao usuário a quantidade de ondas utilizadas para a geração da onda quadrada.
Em algumas situações o programa não funciona corretamente, tais como:
Ao inserir um caractere simbólico (letras e/ou símbolos) no campo da frequência, o programa converte este em um valor numérico e imprime o gráfico da função seno correspondente a este valor, ao invés de apresentar uma mensagem de erro e/ou solicitar ao usuário a digitação de um valor válido. A figura 4 apresenta este tipo de situação.
Figura 4. Entrada de dados (frequência) com valores simbólicos.
Similar à situação anterior, a figura 5 apresenta o caso em que o usuário insere um valor negativo no campo da frequência. O programa desconsidera o sinal negativo e apresenta o gráfico, mas o usuário não é avisado deste procedimento. A figura 6 apresenta o gráfico com o mesmo valor de frequência utilizada no gráfico da figura 5 com o sinal positivo, onde é possível observar que ambos são idênticos.
Figura 5. Entrada de dados (frequência) com valor negativo.
6. Referências
Peters, J. F., Pedrycz, W.. Engenharia de Software Teoria e Prática. Ed. Campus. 2001. Pressman, R. S. Engenharia de Software. Ed. Makron Books. 1995.
Menasché, D. S., Silveira Filho, F. J.. Gráficos em C. Acesso em: 14/03/2010. Disponível em:
<http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/graficos.htm> Teixeira, A. C. S., Stoppa, M. H.. Transformada de Fourier aplicada à análise
espectral de notas e acordes musicais. Acesso em: 14/03/2010. Disponível em: <http://www.catalao.ufg.br/mat/revista/vol1.htm>
Netto, L.. Transformada de Fourier. Acesso em: 14/03/2010. Disponível em: <http://caraipora.tripod.com/fourier.htm>