quarta-feira, 21 de maio de 2014

Design de interface de usuário


Design de interface de usuário ou engenharia de interface de usuário é o desenvolvimento de computadores, aplicações, máquinas, dispositivos de comunicação móveis,softwares e sítios web com o foco na experiência do usuário e interação.

Objetivo

O objetivo do design de interface de usuário é tornar a interação do usuário o mais simples e eficiente possível, em termos de realização dos objetivos do usuário - o que normalmente é chamado de design centrado no usuário. Um bom design de interface de usuário facilita a conclusão da tarefa manualmente sem chamar atenção desnecessária para si. O design gráfico pode ser utilizado para suportar sua usabilidade. O processo de design deve equilibrar funcionalidade técnica e elementos visuais (e.g., modelo mental) para criar um sistema que não é apenas operacional mas também útil e adaptável para alterar as necessidades do usuário.
O design de interface está envolvido em uma série ampla de projetos de sistemas de computador, para carros, à aviação comercial; todos esses projetos envolvem muitos das mesmas interações humanas básicas mas também exigem algumas habilidades e conhecimentos únicos1 . Como um resultado, os designers tendem a se especializar em determinados tipos de projetos e possuir habilidades centradas em torno de suas experiências, quer seja design de software, a pesquisa de usuário, design web ou design industrial.2

Processos

Há várias fases e processos no design de interface de usuário, algumas das quais são mais exigentes que outras, dependendo do projeto. (Obs.: para o restante desta seção, a palavra sistema é usada para denotar qualquer projeto, seja um site web, um aplicativo ou dispositivo.)

Acesso em: http://pt.wikipedia.org/wiki/Design_de_interface_de_usu%C3%A1rio
Postado por: Vagner de Souza da Silva

Diagrama de fluxo de dados


O diagrama de fluxos de dados (DFD) é uma representação gráfica do "fluxo" de dados através de um sistema de informação, modelando seus aspectos de processo. Ela fornece apenas uma visão do sistema, a visão estruturada das funções, ou seja, o fluxo dos dados. Frequentemente, eles são uma etapa preliminar usada para criar uma visão geral do sistema que pode posteriormente ser elaborado. Os DFDs também podem ser usados para a visualização do processamento de dados (design estruturado).
Um DFD mostra que tipos de informação entrará e sairá do sistema, para onde os dados virão e irão e onde os dados serão armazenados. Ele não mostra informação sobre a temporização dos processos ou informações se os processos irão operar em sequencia ou em paralelo (o que é mostrado em um fluxograma).
Se estivermos desenvolvendo um sistema no qual os relacionamentos entre os dados sejam mais importantes que as funções, podemos dar menos importância ao DFD e dedicar-nos aos diagramas de entidade-relacionamento (DER).
Um DFD é uma ferramenta de modelagem que nos permite imaginar um sistema como uma rede de processos funcionais, interligados por “dutos” e “tanques de armazenamento de dados". (Edward Yourdon)

Outros nomes para este diagrama

  • Diagrama de bolhas
  • DFD (abreviatura)
  • Modelo de processo
  • Diagrama de fluxo de trabalho
  • Modelo funcional

Componentes de um DFD

Dfd.JPG
O DFD pode ter vários níveis de detalhamento de acordo com a necessidade do sistema. O diagrama de contexto é uma representação macro do sistema. Em seguida, temos os DFDs de níveis. O nível mais alto é conhecido como DFD de nível 0 e está logo abaixo do diagrama de contexto. Neste nível as principais funções do sistemas são mostradas. Caso o processo não esteja claro o suficiente o mesmo será aperfeiçoado a cada nível.
Quando se diz que o DFD fornece apenas uma visão do sistema,é pelo fato de que através de sua representação gráfica não nos comprometemos com a sua implementação física.

O diagrama de fluxo de dados

Todo modelo funcional de um sistema pode ser visto como sendo formado por uma representação gráfica (uma rede de funções ou processos interligados), acompanhada da descrição de cada função e suas interfaces.
A representação gráfica do modelo funcional costuma ser expressa por meio de um diagrama denominado diagrama de fluxo de dados−DFD.
O conceito de função → Caixa Preta
X o------ Y = F(X) ------o Y
por exemplo:
Elevar o X o----- No X ao -----o Y Quadrado
Há ligações de entrada e de saída da caixa.
Conhecem-se os elementos de entrada da caixa.
Conhecem-se os elementos de saída da caixa.
Sabe-se o que a caixa faz com as entradas para obter as saídas.
Não é preciso saber como a caixa realiza suas operações, e nem a ordem.
Acesso em: http://pt.wikipedia.org/wiki/Diagrama_de_fluxo_de_dados
Postado por: Vagner de Souza da Silva

Projeto Orientado a Objetos

1. Projeto Orientado a Objetos

O Projeto Orientado a Objeto é desenvolvido adotando uma nova estratégia que procura analisar o sistema como se suas partes fossem coisas que estariam sendo interligadas por intermédio das funções que cada uma deveria desempenhar.
Essas coisas seriam os objetos que são desenvolvidos independentemente, mas que em um período mais avançado do projeto eles se ligariam e formariam o projeto como um todo. Para que o Projeto Orientado a Objeto seja relevante é necessário o pensamento em termos de Orientação a Objeto, seja desenvolvida desde o inicio do processo de desenvolvimento do software.
Pensando-se em termos de desenvolvimento de software orientado a objeto temos três etapas importantes, que irão contribuir para o sucesso na criação de um novo software, são elas:
A Analise Orientada a Objeto é a primeira desse processo e esta relacionada com analise dos requisitos que software vai ter, dividindo esses requisitos em objetos no qual os mesmos devem apresentar seus problemas.
O Projeto Orientado a Objeto é a fase em que se procura organizar melhor os objetos, de formar que se consiga solucionar seus problemas, para que se possa fazer a interligações entre os objetos que estão dispostos ao longo do projeto.
A Programação Orientada a Objetos é a fase de implementação desses objetos propriamente dita em que também é utilizada uma linguagem de programação orientada a objetos, como o JAVA.
Para que uma etapa seja finalizada e se de inicio a próxima etapa é necessário que a etapa passada seja, muito bem feita de forma que tudo que seja necessário para o software seja adicionado ao projeto, deixando o mesmo mais completo conforme cada etapa vai sendo concluída.
Quando se pensa em aspectos ligados a manutenção do software este processo se torna simples, pois é possível fazer uma alteração em alguma parte do objeto sem afetar os outros objetos que fazem parte do sistema, podendo assim ser acrescentado novas características aos objetos e também se pode criar novos objetos para serem interligados ao sistema e poderem desempenhar novas funções.
Uma importante vantagem de sistemas desenvolvidos com aspectos orientados a objetos é o fato de se poderem reutilizar partes do mesmo sistema para a criação ou aperfeiçoamento de outras partes do sistema.

1.1. Objetos e classes de objetos

Se tratando do desenvolvimento de sistemas orientados a objetos, temos é claro os objetos que nada mais é do que o encapsulamento de suas características, ou seja, dentro de um objeto existem atributos que irão descrever as características do mesmo alem de apresentar as funcionalidades que o objeto pode desempenhar.
Podemos pegar como exemplo um objeto carro que apresentam em sua estrutura algumas características como, o seu comprimento, largura, altura, cor, peso, etc e algumas funcionalidades como a possibilidade de se locomover, de parar, de virar para o lado esquerdo e direto, etc. Essas características não estão estampadas no objeto carro mais sim estão encapsuladas internamente a esse objeto.
Quando se cria um objeto de um determinado tipo suas características estão sendo criadas conforme um modelo pré-definido que são chamadas de classes de objetos. É nessas classes que são descritas todas as características que um objeto dessa classe deve ter.
A classe de objeto seria como um protótipo de um objeto, que teria a função de descrever todos os requisitos que os desenvolvedores acharam necessários para o desenvolvimento desse objeto.
Como foi citado anteriormente o desenvolvimento orientado a objeto apresentada a vantagem de se poder utilizar códigos que estão presentes em outras classes de objetos sem a necessidade de re-escrever novamente um código que já existe. Neste caso podemos usar o conceito de herança que está presente nesse tipo de desenvolvimento.
A herança nada mais é do que a possibilidade de se estar utilizando de classes já prontas para se desenvolver uma classe que apresente as mesmas características da classe pronta e mais alguns atributos e funcionalidades exclusivas dessa nova classe.
Um exemplo muito comum é a classe de objeto Funcionário que apresenta as mesmas características que um objeto da classe Pessoa tem, mas também possui outras características que é exclusiva do objeto Funcionário.

1.2. Objetos concorrentes

Os objetos dentro de um sistema podem ser executados ao mesmo tempo para que os mesmo possam vir a desenvolver atividades diferentes dentro do software, ou seja, enquanto um objeto realiza um calculo, por exemplo, os outros podem estar obtendo informações do ambiente ou estarem até se comunicando com o usuário propriamente dito.
A capacidade de se poder executar mais de uma tarefa ao mesmo tempo permite que o software não se prenda na realização de uma única tarefa o que poderia acarretar um baixo rendimento do sistema podendo levar o software a sua completa inutilidade por falta de produtividade.
Existem dois tipos de implementação de objetos simultâneos, são eles:
Os servidores que podem realizar tarefas das mais variadas características permitindo que vários processos ou objetos sejam executados ao mesmo tempo, no caso desse tipo de implementação não é possível haver o controle sobre o tempo que é necessário para executar uma determinada tarefa, pois isso vai depender da quantidade e complexidade dos processos que o servidor vai estar trabalhando durante um determinado período, ou seja, pode haver momento em que o servidor esta mais sobre carregado do que em outros momentos, causando essa variação no tempo de execução de tarefas.
O outro tipo de implementação de objetos simultâneos é os objetos ativos que apresentam essa simultaneidade na realização de tarefas internas do sistema, ou seja, existem mais tarefas especificas do sistema que devem estar sendo executadas ao mesmo tempo.
Podemos citar o caso do transponder de um avião, que precisa estar constantemente buscando a posição da aeronave e alem disso precisa estar se comunicando com o piloto e realizando as tarefas que o piloto lhe ordenou.
Na linguagem JAVA temos o thread que realizam essa função dentro do sistema. Para se estar utilizando desse beneficio temos que herdar a classe Thread para a classe que necessitamos que fosse executada simultaneamente com outras classes e objetos.

1.3. Processo de Projeto Orientado a Objeto

Para que se possa realizar o desenvolvimento de um sistema trabalhando com Orientação a Objeto é preciso que após a Analise Orientada a Objeto esteja concluída já se inicie o processo de Projeto Orientado a Objeto, onde o mesmo deve ser desenvolvido seguindo etapas pré-definidas, são elas:
· Compreender e definir o contexto e os modos de utilização do sistema
· Projetar a arquitetura do sistema
· Identificar os principais objetos do sistema
· Descrever os modelos de projeto
· Especificar as interfaces dos objetos
Essas etapas não podem ser vistas como estágios, ou seja, para que se possa progredir para outra etapa não é necessário que a etapa passada esteja completamente concluída. É possível que essas etapas sejam realizadas concorrentemente de modo que todas ou parte delas sejam desenvolvidas em conjunto com outras partes.
Para demonstrar o Projeto Orientado a Objetos estaremos citando como exemplo um sistema de mapeamento meteorológico e como parte fundamental do desenvolvimento orientado a objetos temos a analise orientada a objeto citada logo abaixo.
O nosso sistema de mapeamento meteorológico necessita gerar mapas meteorológicos frequentemente, através da coleta de dados de estações meteorológicas remotas. Essas informações devem ser transmitidas aos computadores que solicitam a analise do tempo no caso. Esse sistema deve analisar os dados obtidos de várias estações meteorológicas antes de enviar o resultado para o usuário que solicitou o serviço, alem de ter que armazenar as informações obtidas em seu banco de dados.
Podemos perceber que só lendo a analise desenvolvida sobre esse sistema notamos que existe nesse sistema uma sequência a ser seguida até que o processo seja totalmente concluído, verificando isso podemos desenvolver esse software na forma de camada, onde cada camada de ser concluída para que o processo passe para a próxima camada.
A primeira camada após a solicitação da informação pelo usuário seria a coleta dos dados da estação meteorológica, depois será a analise desses dados entre dados obtidos em outras estações e dados gravados pelo sistema, o próximo passo seria o armazenamento dos dados e por fim a organização dos dados para serem enviados para o usuário.

1.4. Contexto do sistema e modelos de uso

Para que seja possível trabalhar com um Processo de Software Orientado a Objeto é necessário que seja definido a forma e o estilo de comunicação com o ambiente externo ao software, ou seja, é preciso definir como o usuário vai se comunicar com o sistema e quais as funcionalidades que o sistema deve oferecer para o usuário.
Conhecendo essas informações é possível definir dois tipos de relação entre o ambiente e o sistema, veja eles:
O primeiro trata o sistema como um modelo estático onde são descritos todos os outros subsistemas que envolvem o sistema propriamente dito, de forma que é possível ter mais detalhes sobre as características que cada subsistema apresenta, podem assim ter uma visão mais ampla do que pode ser oferecido para o usuário.
O segundo diz respeito a o sistema como um modelo dinâmico onde são realmente citadas todas as formas de comunicação entre o usuário e o sistema em si, como no exemplo da estação meteorológica temos as seguintes funcionalidades que podem ser controladas pelo usuário:
O usuário poderá iniciar, desativar, relatar, calibrar e testar o sistema, cada uma dessas operações fornecidas pelo sistema ao usuário desenvolvem tarefas especificas que são realizadas por diversos subsistemas que estão presentes dentro do sistema de mapeamento meteorológico.

1.5. Projeto de Arquitetura

Após realizar a forma de comunicação do sistema com o usuário fica fácil começar a representar as camadas que foram citadas lá no inicio do Projeto, demonstrando o desenvolvimento do projeto de arquitetura do software, ou seja, é possível que se possa ter uma idéia mais verdadeira em relação à estrutura que o sistema esta se moldando a cada processo que e concluído.
Já definimos conceitos sobre a camada de interface com o usuário, a camada de coleta de dados e a camada de instrumento que são capazes de realizar a coleta das informações.
A arquitetura em si deve ser desenvolvida tentando descrever o sistema da forma mais simples possível, não havendo mais do que sete entidades fundamentais relacionadas incluídas no modelo de arquitetura, ou seja, devemos procurar dividir o problema em no máximo sete camadas.
                  
                  1.6. Identificação de Objetos

Conforme os estágios do desenvolvimento do sistema vão evoluindo vai surgindo a necessidade da implantação de novos objetos que teriam a função de atribuir novas funcionalidades ao sistema ou teriam a função de prever e solucionar alguns erros que por ventura podem vir a ocorrer no sistema.
Mas até o momento estamos utilizados o termo objeto que não deve ser caracterizado dessa forma, mas sim como resultado de classes, pois são nelas que são definidas atributos e funcionalidades para o objeto.
Voltando para a identificação de classes de objetos podemos citar varias formas de se identificar em um sistema a necessidade de se criar novas classes de objetos, como:
A utilização gramatical, utilização de entidades tangíveis, utilização de uma abordagem comportamental do sistema e uma analise baseada em cenários criados. Cada forma de analise procura identificar as classes de objetos que podem ser inseridas no sistema, para que o mesmo possa desenvolver sua tarefa de forma eficaz.

                  1.7. Modelos de Objetos

Os modelos de objetos mostram os objetos ou classes de objetos contidos em um sistema e quando apropriado as diferentes maneiras e tipos de relações entre os mesmos. Os modelos são essencialmente o próprio projeto em si, pois é aqui que traçamos uma ponte entre o que é necessário no sistema e a implementação dessas necessidades no sistema. Os modelos devem ser abstratos de modo que em hipótese alguma detalhes desnecessários não ocultem uma relação entre os objetos e os requisitos do sistema. Mas em controversa eles devem incluir detalhes suficientes para que os programadores possam tomar as devidas decisões de implementações quando necessárias.
Uma etapa importante no processo de desenvolvimento do projeto é decidir quais modelos são mais viáveis e úteis para o sistema alem do nível de detalhes que iram possuir. Para tomada dessa decisão deve-se levar em conta o tipo de sistema que deverá ser produzido, pois diferentes tipos de sistemas necessitam de diferentes modelos de projeto. Existem poucos sistemas que necessitam de todos os modelos, e minimizar o número de modelos economiza custos de implementação alem do tempo gasto para essa implementação.
Para descrever um projeto orientado a objetos existem dois tipos de modelos que devem ser produzidos que são os estáticos e os dinâmicos que já vimos a definições dos mesmos em tópicos anteriores.
Para gerar a documentação dos projetos usa-se a UML que fornece um grande numero de modelos estáticos e dinâmicos. Booch et al. (1999) propõem nove tipos de diferentes diagramas para representar esses modelos, mas nesse momento abordaremos apenas três:

1.7.1. Modelos de Subsistemas

Mostram os objetos logicamente agrupados em subsistemas, que são apresentados em forma de diagrama de classe em que cada subsistema é abordado como um pacote. É um os modelos estáticos mais usados, pois mostra como os objetos podem ser organizados em grupos e mostram também as diferentes formas de relações entre subsistemas diferentes.

1.7.2. Modelos de Seqüência

Mostram a seqüência das interações dos objetos, são apresentadas em forma de diagrama de seqüência, é um dos modelos dinâmicos mais úteis, pois documenta, para cada interação a seqüência de interações de objetos que iram acontecer.
As características básicas desse modelo são:
· Os objetos são organizados horizontalmente com uma linha vertical ligada a cada objeto.
· O tempo é representado verticalmente, de modo que a progressão se da para baixo, dando uma visão de cima para baixo conforme as relações acontecem, possibilitando uma fácil interpretação do modelo.
· As interações entre os objetos se dão por setas rotuladas que ligam as linhas verticais, onde diferentes tipos de setas representam diferentes tipos de interações, onde pode haver objetos concorrentes ou ativos, lembrando que a cada interação a linha do tempo abaixa.
· A cada interação o objeto passa para o próximo o titulo de controlador do sistema, que é obtido quando o mesmo esta efetuando seu trabalho, quando terminado o trabalho ele passa para o próximo o resultado junto com o titulo de controlador, que é representado por um retângulo fino anexado na linha do tempo.

1.7.3. Modelos de Máquinas de Estado

Mostram como objetos individuais mudam seu estado em resposta aos eventos de interação. Eles são representados em UML com o uso de um diagrama statechart, são modelos dinâmicos e funcionam da seguinte maneira:
Um objeto tem seu estado inicial definido pelo usuário conforme a sua necessidade, quando um objeto interage com outro esse objeto vai efetuar a solicitação que lhe foi pedida, essa tarefa é composta por varias interações entre objetos, e esse modelo tem por objetivo descrever essas interações. Exemplo, se o usuário pede uma coleta de dados, quais serão as interações necessárias para concluir essa coleta, o statechart mostra todas essas interações interligadas, onde cada solicitação tem suas interações independentes das outras.

                 1.8. Especificação de Interface entre Objetos

No projeto orientado a objetos, uma parte bastante importante é a definição das interfaces que irá completar os objetos. Essas interfaces servem para fazer com que os objetos que possuem as mesmas ações, sejam devidamente implementadas, ou seja, suponhamos que uma classe motorAutomovel tem uma ação de ligar(); só que o motorEletrico também tem a função de ligar(); daí é que provém a necessidade de se criar uma interface para que ambos tenham a obrigação de ser implementado.
Um exemplo mais utilizado é as interfaces em linguagem JAVA. Como no JAVA os objetos não aceitam a herança múltipla, esse fator é contornado com as interfaces, que um objeto pode implementar quantas interfaces for necessário. As interfaces têm a característica de poder ser personalizado de acordo com a necessidade que o objeto necessita, mas lembrando que a implementação dos métodos no devido objeto é obrigatório.
Para vermos como uma interface faz uma grande influência no objeto seguiremos o exemplo de uma fila e uma lista de estrutura de dados, ambas estáticas. A forma de declaração é simples, que nada mais é que um array[ ] do tipo de dados que é a estrutura e um ponteiro que marca o final da estrutura, o fator que muda em ambas é os tipos de implementação dos métodos, ou seja, os métodos possui os mesmos nomes e tipos, mas o que muda é algumas maneiras que estão contidas no interior desse método. Outro exemplo bem prático é os objetos avião e ave, ambos voam, mas voam de maneiras diferentes, é aí que há necessidade de uma implementação de uma interface.
Sua representação pode ser muito simples, pode ser feita em UML, como um diagrama de classe, a única diferença é que o nome deverá ser precedido do prefixo interface, e não constará atributos em seu escopo. Outro método de representar uma interface é escrevendo ela de modo comum. Sua declaração é bem simples onde deverá ser especificado interface precedido do seu nome definido pela equipe de desenvolvimento, e logo a baixo a assinatura dos métodos que será só descrito o escopo, sem que eles possuam blocos de instruções definidos.
Por base podemos inferir que uma classe ao implementar uma interface, automaticamente ela deverá descrever todos os métodos de maneira personalizada. Vejamos um exemplo dos dois modos de como declarar uma interface e sua aplicação.

                 1.9. Evolução do Projeto
       
              Toda vez que se pensa em desenvolver um projeto de software, sempre há complicações quanto à introdução de novos campos em determinadas áreas do projeto. No projeto orientado a objeto, essa dificuldade já não é tão dificultada assim, e quando há uma inserção de um novo campo ou método no projeto, há uma grande facilidade de se lidar com isso sem que esta inserção afete parte do programa. Suponhamos que estamos desenvolvendo um projeto orientado a objetos, e o objeto do tipo Pessoa que estamos definindo precisa inserir o campo dataNascimento, sem muita complicação automaticamente no objeto do tipo Funcionárioserá incluído o campo dataNascimento, devido à interligação que um objeto tem com outro. Percebe-se pelo exemplo a robustez deste projeto, pois o projeto não foi afetado em nenhuma parte devido à inserção desse campo.

      Acesso em: http://es1uenp.blogspot.com.br/2011/10/projeto-orientado-objetos.html

     Postado por: Vagner de Souza da Silva

Introdução à garantia de qualidade de software e ferramentas para teste

Atualmente, muito se fala sobre qualidade de software, os desenvolvedores por vezes não sabem se estão no caminho certo. Para esclarecer um pouco sobre este assunto, neste artigo vamos tratar alguns pontos principais sobre este tema.
Qualidade de Software

A história do teste de software começa há muito tempo, mas foi em 1957 que o conceito de teste se tornou o processo de detecção de erros e não de verificar se o software funciona, e foi em 1979 que Myers produziu os primeiros trabalhos complexos sobre o processo de teste. Nesta época já se dizia que o teste deveria ser a intenção de encontrar erros. Com o passar dos anos, os projetos foram tendo mais e mais problemas devido à complexidade dos sistemas, segundo Bartié “Mais de 30% dos projetos são cancelados antes de serem finalizados e mais de 70% dos projetos falham nas entregas de funcionalidade”. Estas falhas criaram um ambiente caótico e problemático para os gestores, desta forma, criou-se a necessidade de implementação de processos de qualidade, que busquem estabelecer procedimentos que sirvam de garantia e gerenciamento de qualidade. Assim surgiram modelos como o CMM (Capability Maturity Model), que foi definido pelo Instituto de Engenharia de Software (SEI), descrevendo uma estrutura de trabalho. Esta estrutura possui itens necessários para tornar o processo eficiente e controlado.

O modelo é dividido em cinco níveis do inicial ao otimizado, os níveis são sequenciais, desta forma, uma empresa para atingir o ultimo nível, deve ter passado por todos os níveis anteriores.

O nível dois do CMM já define o processo gerencial de qualidade de software, o que demanda processos de testagem.

Os testes devem provar que algo não funciona, e são essenciais para o sucesso do processo de qualidade de software.

“ Os testes unitários podem resolver entre 30% a 50% dos defeitos dos programas, os testes de sistemas podem remover entre 30% a 50% dos defeitos remanescentes, desse modo, os sistemas podem ir para produção ainda com aproximadamente 49% dos defeitos. Por último, as revisões de códigos podem reduzir entre 30% e 30% desses defeitos.” Myers in Bastos, 2002.

A realização de testes desde o início do desenvolvimento é algo aconselhado não só pelas metodologias ágeis, mas como pode ser visto em Myers, indicado para a garantia de qualidade, visto que os testes são realizados do início ao final do processo de desenvolvimento.

O processo de teste atua dentro de uma visão de qualidade como o PDCA no momento de check, mas em desenvolvimento, é possível realizar testes em todos os processos, do fazer (testes unitários) até o planejamento.

PDCA

A realização de testes de software pode ser feito de forma manual ou automatizada, esta última indica a utilização de ferramentas de teste. As ferramentas de teste permitem ao testador automatizar parte do processo de teste, facilitando a retestagem para validação dos testes.

“A atividade de teste, como a de desenvolvimento, gera grande número de informações e necessita de várias repetições, além de requerer coordenação e comunicação entre as equipes. As ferramentas de teste podem aliviar o fardo da produção e da execução de teste, da geração de informação e da comunicação.” Bastos, 2002.

Como exemplo temos:

Para os testes de caixa branca, de codificação, as ferramentas XUnit's como o JUnit, NUnit, PHPUnit entre outros. Estas ferramentas permitem ao desenvolvedor/testador criar testes de validação dos códigos, verificando as funcionalidades e retornos das unidades do sistema.
Mais sobre testes unitários em PHP pode ser visto em: Qualidade em desenvolvimento Web: PHP com teste unitário.

E sobre testes unitários em Java, pode ser visto em: Introdução ao desenvolvimento guiado por teste (TDD) com JUnit e Testes Unitários.

Outro teste essencial para garantia dos requisitos não funcionais é o teste de performance e stress, que tem como função validar o limite da aplicação, entre eles o limite de usuários simultâneos, limite de dados do sistema, etc. Existem diversas ferramentas que possibilitam os testes de performance, entre elas temos o JMeter, ferramenta livre, da fundação Apache que permite a criação de um conjunto de testes, além de poder ser integrado a IDE's e outras ferramentas de teste.

Para mais informações sobre JMeter, acesse: Usando o JMeter para teste de performance.
Também são necessários os testes funcionais, que garantem que certas funcionalidades estão de acordo com os requisitos do projeto. Os testes funcionais podem ser exploratórios, manuais e automatizados. Existe diversas ferramentas para automação de testes funcionais, e uma das ferramentas livres mais utilizadas para este fim é o Selenium.

Para mais informações sobre o selenium veja: Instalando o Selenium IDE no Firefox e Dicas para começar a utilizar o Selenium IDE.

Outro ponto fundamental nos dias atuais, principalmente depois que a Symantec apresentou o relatório que o Brasil é o 4º pais com pior segurança de informação, são os testes de segurança. Existem diversas formas de analisar a segurança de um programa, verificando estouro de buffer, analisando ataques de SQL, entre outros.

Para informações sobre ferramentas de teste de segurança, acesse:

Este artigo é apenas uma explicação básica sobre as ferramentas e o teste de software, é indicado que vocês leiam o artigo Engenharia de Software - Introdução a Teste de Software que trata sobre introdução a teste de software e os artigos indicados no decorrer do artigo.





Acesso em: http://www.devmedia.com.br/introducao-a-garantia-de-qualidade-de-software-e-ferramentas-para-teste/28027

Postado por: Vagner de Souza da Silva

O que é Gerência de Configuração?

1. Introdução

Mudanças durante o desenvolvimento são inevitáveis; o entendimento dos usuários sobre suas necessidades muda, o ambiente no qual o sistema vai operar muda, a legislação muda, os requisitos mudam. Com tantas mudanças assim, é necessária alguma forma de gerenciamento para que o desenvolvimento não fique caótico.
Gerência de Configuração de Software (GCS) é um conjunto de atividades de apoio que permite a absorção controlada das mudanças inerentes ao desenvolvimento de software, mantendo a estabilidade na evolução do projeto.
A GCS responde às seguintes questões básicas, que depois são desmembradas em outras questões mais específicas:
  1. Quais mudanças aconteceram no sistema?
  2. Por que essas mudanças aconteceram?
  3. O sistema continua íntegro mesmo depois das mudanças?

2. Definições

Para entender melhor a forma como a GCS funciona, são necessárias algumas definições. A primeira delas é a respeito do que é uma configuração:
Configuração de um sistema é uma coleção de versões específicas de itens de configuração (hardware, firmware ou software) que são combinados de acordo com procedimentos específicos de construção para servir a uma finalidade particular.
Então, o que seria exatamente "gerenciar" a configuração?
GCS é a disciplina de identificar a configuração de um sistema em diferentes pontos no tempo com a finalidade de controlar sistematicamente as mudanças realizadas, mantendo a integridade e rastreabilidade da configuração através do ciclo de vida do sistema.
Em outras palavras, a configuração é o estado do conjunto de itens que formam o sistema em um determinado momento; e a GCS é o controle da evolução dessas configurações durante o ciclo de vida do projeto.
A GCS é extremamente útil e importante. Por isso, faz parte de modelos importantes de maturidade de processo de desenvolvimento tais como o CMMi, MPS-Br e o SPICE.
Segundo o CMMi, as atividades relacionadas à GCS são:
  • Identificação da configuração dos produtos de trabalho selecionados que compõem as baselines em um determinado ponto no tempo;
  • Controle das mudanças nos itens de configuração;
  • Construção ou fornecimento de especificações para construir produtos de trabalho a partir do sistema de gerenciamento de configuração;
  • Manutenção da integridade das baselines;
  • Fornecimento de dados precisos de status e configuração corrente a desenvolvedores, usuários finais e clientes.
Baseline é uma configuração formalmente aprovada para servir de referência para o desenvolvimento posterior do sistema.

3. GCS do Ponto de Vista das Ferramentas de Apoio

Do ponto de vista das ferramentas existentes, a GCS é formada pelas seguintes atividades:
Gerência de Configuração

Controle de Versão

É a espinha dorsal de toda a gerência de configuração, apoiando as atividades de controle de mudança e integração contínua. Fornece os seguintes serviços:
  • Identificação, armazenamento e gerenciamento dos itens de configuração e de suas versões durante todo o ciclo de vida do software;
  • Histórico de todas as alterações efetuadas nos itens de configuração;
  • Criação de rótulos e ramificações no projeto;
  • Recuperação de uma configuração em um determinado momento desejado do tempo.
Para uma visão mais detalhada do assunto, consulte o tutorial sobre controle de versão.

Controle de Mudança

Fornece um serviço complementar ao oferecido pelo sistema de controle de versão. O foco desse tipo de ferramenta é nos procedimentos pelos quais as mudanças de um ou mais itens de configuração são propostas, avaliadas, aceitas e aplicadas.
Oferece serviços para identificar, rastrear, analisar e controlar as mudanças nos itens de configuração.

Integração Contínua

Para as necessidades da GCS, bastaria um controle de construção de software que cuidasse da identificação, empacotamento e preparação de uma baseline para a entrega a um cliente externo ou interno, tornando-a uma release ou uma build respectivamente.
A idéia de utilizar uma integração contínua, entretanto, vai um pouco mais além. O objetivo é garantir que as mudanças no projeto são construídas, testadas e relatadas tão logo quanto possível depois de serem introduzidas.
Em projetos de software, a construção do software é feita pela recuperação da configuração correta no sistema de controle de versão e a construção dos arquivos executáveis e de instalação do produto. Este processo é executado geralmente após cada mudança publicada no sistema de controle de versão ou em intervalos de tempo pré-definidos.
Geralmente, são combinadas duas ferramentas separadas: uma que faz a construção do software e outra que monitora alterações no controle de versão e dispara a primeira para a construção.

4. Ferramentas de Apoio

Existem diversas ferramentas disponíveis para apoiar atividades de GCS. De acordo com a classificação utilizada neste artigo, alguns exemplos são:
Tipo de FerramentaOpen SourceComercial
Controle de Versão
Controle de Mudança
Integração Contínua
A quantidade de funcionalidades, a maturidade, a documentação e o suporte disponíveis, e a popularidade de cada ferramenta variam bastante. Embora as ferramentas comerciais geralmente apresentem mais funcionalidades e um maior grau de integração, o custo de licenciamento muitas vezes torna o seu uso proibitivo principalmente para micro e pequenas empresas de software.
As ferramentas open source, por outro lado, possuem diversas vantagens além do custo mais baixo de aquisição tais como qualidade, segurança, independência de fornecedor, possibilidade de adequação a necessidades específicas, estabilidade e suporte técnico. Estas características tornam a escolha por ferramentas open source uma solução extremamente interessante não só para micro e pequenas empresas.
A análise comparativa das diversas ferramentas listadas está fora do escopo deste artigo. Mas para não ficar no ar a questão de qual uma boa alternativa, deixamos aqui a nossa recomendação:
Escolha da Pronus
Controle de Versão Subversion é uma ferramenta open source de controle de versão centralizado que foi construída para substituir o CVS, mas seguindo o mesmo modelo de funcionamento.

O Mercurial representa a mais nova geração de ferramentas de controle de versão distribuído e possui uma interface de comandos que é uma evolução dos comandos do Subversion.
Controle de Mudança Trac é uma ferramenta open source de controle de mudanças em projetos de software além de oferecer serviços adicionais de integração com o Subversion, documentação e acompanhamento do projeto, e relatórios informativos.

Veja o artigo sobre o Trac para mais informações sobre a ferramenta.
Integração Contínua Jenkins|Jenkins é uma ferramenta para integração contínua que gerencia os passos de construção, teste automatizados.
As ferramentas sugeridas formam uma solução integrada que atende plenamente às necessidades GCS.

5. Considerações Finais

A preocupação com a melhoria do processo de desenvolvimento vem sendo impulsionada por exigências do mercado por mais qualidade e da produtividade do desenvolvimento. Muitas empresas têm revisto seus processos e procurado se capacitar no mercado cada vez mais competitivo.
A Gerência de Configuração é essencial para manter o desenvolvimento de software controlável. Contudo, ainda é grande o número de empresas que ainda não utilizam nenhum tipo de GCS ou que utilizam apenas o controle de versão nos seus projetos. As causas para essa situação são o desconhecimento da amplitude e importância da GCS e o desconhecimento das ferramentas de apoio existentes.
Gerência de Configuração é uma atividade que deve ser usada em todos os projetos de desenvolvimento de software. A existência de várias opções de ferramentas open source torna a implantação da GCS mais fácil principalmente para micro e pequenas empresas. Porém, é necessário algum esforço para a adequação ao processo e treinamento específicos.

Acesso em: http://www.pronus.eng.br/artigos_tutoriais/gerencia_configuracao/gerencia_configuracao.php?pagNum=0

Postado por: Vagner de Souza da Silva