Laboratório de Programação - Exercício 30

Documentos relacionados
Laboratório de Programação - Exercício 22

Gilberto A. S. Segundo. 24 de agosto de 2011

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

Material sobre Funções AEDS 1

Listas (cont.) K&R: Capitulo 6. Lista Simplesmente Ligada IAED, 2012/2013. Conjunto de nós. Cada nó contém. head NULL. typedef struct node {

Funções em C. Lucas Ferrari de Oliveira Professor Adjunto. Linguagem de Programação Estruturada I. Universidade Federal do Paraná

OProtocolo RPC é um dos protocolos de aplicação mais utilizados, pois permite

Laboratório de Programação - Exercício 25

Estruturas de Dados Aula 6: Cadeias de 28/03/2010

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Material preparado pela profa Silvana Maria Affonso de Lara

1 Exercícios com ponteiros

#define SIM 1 equivale a definição de constantes; a palavra SIM é substituída por 1 toda vez que é utilizada no programa.

Laboratório de Introdução à Ciência da Computação I Aula de Vetores e Matrizes

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Programação 2012/2013 1º Semestre MEEC Laboratório 2 Semana de 22 de Outubro de 2012

Introdução à Engenharia ENG1000

Outline. 33. Manipulação de arquivos DIM

ESTRUTURAS CONDICIONAIS. Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza

ponteiros INF Programação I Prof. Roberto Azevedo

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

No Windows há basicamente dois tipos de programas de usuário:

Guia Rápido: GCC, Makefile e Valgrind.

1ª versão. #include <stdio.h> #include <string.h> #include <stdlib.h> #define maxdiscos 1000

Analise o código abaixo:

Escreva a função e_caracter que verifica se um determinado caracter é um numero ou não. Escreva um Programa de teste da função.

Curso de C. Introdução by Arnaldo V. Moura e Daniel F. Ferber 3/10/ :43 AM

Message Passing Interface - MPI

ESCOLA SUPERIOR DE TECNOLOGIA DE TOMAR DEPARTAMENTO DE ENGENHARIA INFORMÁTICA 2005/ Valores

Programação II. Aula Teórica 4: memoria dinâmica / pre-processador. Marco Giunti. Departamento de Informática, UBI

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

CAP. IX - MANIPULAÇÃO DE ARQUIVOS Generalidades sobre Arquivos. 9.2 Abertura e Fechamento de Arquivos. Operações com arquivos:

UFSM Introdução ao Dev-C++ Profa. Patrícia Pitthan. Introdução ao Dev-C++

Curso de Linguagem C

Diagrama de Classes. Conceitos Básicos. prof. Robinson Vida Monday, April 20, 15

Linguagens de programação. Introdução ao C (continuação)

1 Exercícios com ponteiros

Algoritmos e Estruturas de Dados I. Funções. Pedro Olmo Stancioli Vaz de Melo

QUEBRA DE SENHAS MD5 UTILIZANDO MDCRACK E MPI

Sobre o Visual C

BCC202 - Estrutura de Dados I

Depuração e Teste de programas C C Depuração e teste de programas C

Tabela ASCII de caracteres de controle

Modularização: Funções em C

Conceitos Básicos sobre Programação Prática

Arquivos. Estruturas de Dados II Vanessa Braganholo

Aula 01. Prof. Diemesleno Souza Carvalho /

Computação 2. Aula 5. Profª. Fabiany defines vetor, strings e matriz por parâmetros de função

Linguagem C: diretivas, compilação separada. Prof. Críston Algoritmos e Programação

Programação: Vetores

Exercícios de Laboratório de ICC Engenharia Ambiental 2º Semestre de 2004

Manipulação de Arquivos

Sistemas Operacionais INF Prof. José Gonçalves

Computação II Orientação a Objetos

2º Roteiro de Laboratório Estruturas condicionais

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Overloading e Overriding - parte 1

Ambiente de Desenvolvimento

Laboratório 4 Correcção de erros sintácticos e tipos de dados primitivos

O que faz/o que é Como usar Como funciona Formato geral do Arquivo Submetido ao Lex ER estendidas Exemplos The Lex & YACC page:

Utiliza Expressões Regulares (ER) Estendidas para definir a especificação da análise léxica desejada

Threads em Ambiente LINUX. Estudo e testes com a biblioteca pthreads

C++ - Ponteiros (continuação) cout << \nquantas notas? ; cin >> tamanho; notas = new int[tamanho]; //aloca memória

Um processo sob UNIX ocupa uma área de memória formada basicamente por 3 partes:

Programação Imperativa. Lição n.º 16 A pilha de execução

Estruturas (Registros)

P2 Programação II Departamento de Informática/PUC-Rio

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano

Alocação Dinâmica em C

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

LP II Estrutura de Dados

Prova de Recuperação

Ambiente de Programação JAVA POO

PIP/CA - Programa Interdisciplinar de Pós-Graduação em Computação Aplicada da UNISINOS ALGORITMOS & ESTRUTURAS DE DADOS

Sub-rotinas. 2014/2 Programação Básica de Computadores (INF 09325) Freddy Brasileiro

Informática I. Aula 19. Aula 19-31/10/2007 1

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Curso de C: uma breve introdução

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

Exercícios em C 1 Saulo O. D. Luiz

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Alocação Dinâmica de Memória

2 Configuração do Ambiente de Desenvolvimento

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

ESTRUTURAS COMPOSTAS. Variáveis Compostas Unidimensionais VETOR. Baseado nos slides de Rosely Sanches e Simone Senger de Souza

1) Operadores de auto incremento ++ e auto decremento --

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

Estrutura de Dados. Cadeia de Caracteres. Roberto Araujo Ago/2013

Curso de C. Procedimentos e Funções. 6/4/200901/04/09 09:42 Copyright@Arnaldo V Moura, Daniel F Ferber 1

Arquivos em C Parte 2

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Capítulo 6: Arquivos

Revisão de Programação em C++ Leandro Tonietto Estruturas de Dados em C++ Segurança da Informação

Programação Básica. Estrutura de um algoritmo

Controlo de Execução. K&R: Capitulo 3

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Comunicação entre pai e filho

Programação. MEAer e LEE. Bertinho Andrade da Costa. Instituto Superior Técnico. Argumentos da linha de comando Funções recursivas

Transcrição:

Laboratório de Programação - Exercício 30 Testes automáticos João Araujo Ribeiro jaraujo@uerj.br Universidade do Estado do Rio de Janeiro Departamento de Engenharia de Sistemas e Computação João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 1 / 22

Resumo 1 Ex30 - Testes automáticos Trabalho extra João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 2 / 22

Exercício 30 - Testes automáticos Neste capítulo vamos apresentar um pequeno framework para testes, chamado minunit. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 3 / 22

c-skeleton/tests/minunit.h 1/2 1 #undef NDEBUG 2 #ifndef _minunit_h 3 #define _minunit_h 4 5 #include <stdio.h> 6 #include <dbg.h> 7 #include <stdlib.h> 8 9 #define mu_suite_start() char *message = NULL 10 11 #define mu_assert(test, message) if (!(test)) { log_err(message); return message; 12 #define mu_run_test(test) debug("\n-----%s", " " #test); \ 13 message = test(); tests_run++; if (message) return message; 14 15 #define RUN_TESTS(name) int main(int argc, char *argv[]) {\ 16 argc = 1; \ 17 debug("----- EXECUTANDO: %s", argv[0]);\ 18 printf("----\nexecutando: %s\n", argv[0]);\ 19 char *result = name();\ 20 if (result!= 0) {\ 21 printf("falhou: %s\n", result);\ João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 4 / 22

c-skeleton/tests/minunit.h 2/2 22 }\ 23 else {\ 24 printf("todos OS TESTES OK\n");\ 25 }\ 26 printf("tests run: %d\n", tests_run);\ 27 exit(result!= 0);\ 28 } 29 30 31 int tests_run; 32 33 #endif João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 5 / 22

Escrevendo o framework de testes Precisamos criar o framework, escrevendo uma unidade de testes vazia. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 6 / 22

c-skeleton/tests/libex29_tests.c 1/2 1 #include "minunit.h" 2 3 char *test_dlopen() 4 { 5 6 return NULL; 7 } 8 9 char *test_functions() 10 { 11 12 return NULL; 13 } 14 15 char *test_failures() 16 { 17 18 return NULL; 19 } 20 21 char *test_dlclose() 22 { João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 7 / 22

c-skeleton/tests/libex29_tests.c 2/2 23 24 return NULL; 25 } 26 27 char *all_tests() { 28 mu_suite_start(); 29 30 mu_run_test(test_dlopen); 31 mu_run_test(test_functions); 32 mu_run_test(test_failures); 33 mu_run_test(test_dlclose); 34 35 return NULL; 36 } 37 38 RUN_TESTS(all_tests); João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 8 / 22

RUN_TESTS O código anterior demonstra o uso da macro RUN_TESTS de minunit.h. Vamos analisar linha por linha. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 9 / 22

libex29_tests.c:1 #include "minunit.h" Inclui o framework minunit.h. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 10 / 22

libex29_tests.c:3-7 char *test_dlopen() { } return NULL; Um primeiro teste. Testes são estruturados de modo que não tenham argumentos e retornem um char * que é NULL quando tem sucesso. Isto é importante porque as outras macros serão usadas ára retornar uma mensagem de erro para o programa que executa os testes. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 11 / 22

libex29_tests.c:9-25 char *test_functions() { } return NULL; char *test_failures() { } return NULL; char *test_dlclose() { } return NULL; Mais testes como o primeiro. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 12 / 22

libex29_tests.c:27 char *all_tests() { A função que controla todos os outros testes. Ela tem a mesma forma que qualquer outro teste, mas vem congurada com outros atributos. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 13 / 22

libex29_tests.c:28 mu_suite_start(); Inicializa coisas comuns a todos os testes. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 14 / 22

libex29_tests.c:30-33 mu_run_test(test_dlopen); mu_run_test(test_functions); mu_run_test(test_failures); mu_run_test(test_dlclose); Aqui é para dizer qual teste executar. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 15 / 22

libex29_tests.c:35 return NULL; Após executar os testes, retornamos NULL como qualquer outro teste. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 16 / 22

libex29_tests.c:38 RUN_TESTS(all_tests); Finalmente, apenas usamos a macro RUN_TESTS para executar todos os testes. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 17 / 22

make clean $ make clean rm -rf build src/libex29.o tests/libex29_tests rm -f tests/tests.log find. -name "*.gc*" -exec rm {} \; rm -rf 'find. -name "*.dsym" -print' João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 18 / 22

Make $ make cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG -fpic -c -o src/libex29.o src/libex29.c src/libex29.c: In function `fail_on_purpose': src/libex29.c:40:33: warning: unused parameter `msg' [-Wunused-parameter] int fail_on_purpose(const char *msg) ^ ar rcs build/libyour_library.a src/libex29.o ranlib build/libyour_library.a cc -shared -o build/libyour_library.so src/libex29.o cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG build/libyour_library.a tests/libex29_tests.c -o test In file included from tests/libex29_tests.c:1:0: tests/libex29_tests.c: In function `main': tests/minunit.h:15:38: warning: parameter `argc' set but not used [-Wunused-but-set-parameter] #define RUN_TESTS(name) int main(int argc, char *argv[]) {\ ^ tests/libex29_tests.c:38:1: note: in expansion of macro `RUN_TESTS' RUN_TESTS(all_tests); ^ sh./tests/runtests.sh Executando a unidade de tests: ---- EXECUTANDO:./tests/libex29_tests TODOS OS TESTES OK Tests run: 4 tests/libex29_tests PASS João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 19 / 22

Como quebrar o código Abra o arquivo libex29.so e edite-o com um editor binário. Mude alguns bytes e então o feche. Tente ver se você consegue fazer a função dlopen carregá-lo mesmo estando corrompido. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 20 / 22

Trabalho extra Trabalho extra Você prestou atenção ao código ruim que usamos nas funções de libex29.c? Viu como, mesmo usando um loop for, as funções ainda testam nais com '\0'? Conserte-as para que as funções sempre peguem o tamanho das strings para manipulá-las. Pegue o diretório c-skeleton e crie um novo projeto para este exercício. Ponha o arquivo libex29.c no diretório src/. Mude o Makefile para que ele construa ele como build/libex29.so. Coloque o arquivo ex29.c e coloque-o como tests/ex29_tests.c para que ele possa funcionar como uma unidade de testes.faça tudo funcionar, o que quer dizer que você deve mudá-lo de modo que ele carregue o arquivo build/libex29.so e execute testes de maneira similar a que zemos na mão. Leia a documentação de dlopen e suas funções relacionadas. tente algumas das outras opções para dlopen. João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 21 / 22

Trabalho extra FIM João Araujo Ribeiro (UERJ) Laboratório de Programação LabProg 22 / 22