terça-feira, 28 de outubro de 2014

Test Driven Development (TDD) em PHP

Neste post vamos abordar o Test Driven Development (TDD) em PHP, que é um dos principios core do XP e está disponivel nativo para linguagem java no netbeans. Entretanto, para habilitar essa ferramenta para o PHP no ambiente Windows devemos fazer algumas configurações no ambiente que seguem:


  1. Instalar o NetBeans;
  2. Instalar o Xampp;
  3. Configurar o PHPUnit pelo pear no xampp com os seguintes comandos:
  4. Abrir o Shell;
  5. Digitar “pear config-set auto_discover 1”
  6. Digitar “pear install pear.phpunit.de/PHPUnit”
  7. Agora o PHPUnit já está configurado na pasta c:\xampp\php\
  8. Baixar o arquivo phpunit.phar em https://phar.phpunit.de/phpunit.phar
  9. Baixar o arquivo phpunit-skelgen.phar em https://phar.phpunit.de/phpunit-skelgen.phar
  10. Salvar os dois arquivos em c:\xampp\php\
  11. Para configurar o phpunit no netbeans faça o seguinte:
    1. Vá em ferramentas;
    2. Em opções aponte os arquivos conforme as imagens abaixo:



Agora o NetBeans já está configurado para aceitar projetos com a criação de classes de testes. A proxima etapa é criar um novo projeto PHP. Com o projeto criado deve-se criar a classe PHP que será desenvolvida a partir de testes. Agora deve-se criar os testes. Clique com o botão direito sobre a pasta “Arquivos de Código-Fonte” ir em “Ferramentas” e depois “Criar Testes”.


Deve-se criar uma pasta de testes dentro do projeto, onde serão geradas as classes de testes pelo skelgen, e durante o assistente de criação dos testes assinalar a opção de utilizar o PHPUnit.


O ultimo passo é criar a classe de testes, que é criada automaticamente clicando com o botão direito em cima do arquivo da classe PHP, que foi criada anteriormente e onde serão desenvolvidos os métodos,  ir em “Ferramentas” e depois “Criar Testes”.


Agora o arquivo o testes já foi criado, só tem que ter cuidado de sempre começar o método de testes começando com “testAlgumaCoisa”, segue abaixo uma sugestão de código para as classes onde estarão os métodos e onde estarão os testes:


Salario.php
<?php


/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/


/**
* Description of Salario
*
* @author GUSTAVO
*/
class Salario {
   //put your code here
   
   public function index($bonus = null){
       $salario =  1500.35;
       
       if($bonus){
           $salario += $bonus;
       }
       
       return $salario;
   }
   
   public function desconto($salario){
       
       $desconto = 8;
       
       if(($salario > 1317.07) and ($salario < 2195.13)){
           $desconto = 9;
       } elseif($salario > 2195.12){
           $desconto = 11;
       }
       
       return $desconto;
   }


   public function descontoINSS($salario) {
       
       if($salario > 4390.24){
           $salario = 4390.24;
       }
       
       $percentual = $this->desconto($salario);
       
       $desconto = $salario * $percentual / 100;
       
       return number_format($desconto, 2);
   }


}


SalarioTest.php
<?php
require_once "../Salario.php";


/**
* Generated by PHPUnit_SkeletonGenerator on 2014-10-21 at 14:01:05.
*/
class SalarioTest extends PHPUnit_Framework_TestCase
{


   /**
    * @covers Salario::index
    * @todo   Implement testIndex().
    */
   public function testIndex(){
       $salario = new Salario();
       $this->assertEquals(1500.35, $salario->index());
   }
   
   public function testIndexComBonus(){
       $salario = new Salario();
       $this->assertEquals(1550.35, $salario->index(50));
   }


   public function testDesconto(){
       $salario = new Salario();
       $this->assertEquals(11, $salario->desconto(10000));
   }
   
   public function testValorINSSMinimo(){
       $salario = new Salario();
       $this->assertEquals(80, $salario->descontoINSS(1000));
   }
   
   public function testValorINSSMedio(){
       $salario = new Salario();
       $this->assertEquals(180, $salario->descontoINSS(2000));
   }
   
   public function testValorINSSAlto(){
       $salario = new Salario();
       $this->assertEquals(440, $salario->descontoINSS(4000));
   }
   
   public function testValorINSSTeto(){
       $salario = new Salario();
       $this->assertEquals(482.93, $salario->descontoINSS(9390.24));
   }


}

quinta-feira, 16 de outubro de 2014

Resumindo o Disciplined Agile Delivery

Livro do Scott W. Ambler sobre a metodologia aplicada na IBM.



Essa metodologia de trabalho promove uma colaboração entre os desenvolvedores e os contratantes do software. Este método visa a adicionar valor à organização, mantendo a agilidade e se focando na qualidade do sistema a ser entregue (e.g., work smarter, not harder).

Não deveria ser uma surpresa que trabalhar em uma equipe unida e colaborativa que visa a produzir software em funcionamento obtém melhores resultados do que times que trabalham em locais separados onde se importam somente em sucesso individual ao invés do desempenho de equipe. Também não seria uma surpresa que reduzir documentação e a burocracia administrativa reduziria custos e diminuiria o tempo de entrega do produto.

Utilizar metodologias ágeis não é desculpa para ser indisciplinado. A execução destas novas metodologias, como XP, por exemplo, sempre demandaram uma abordagem disciplinada, e certamente muito mais do que as metodologias tradicionais como waterfall. Não se deve misturar o alto nível de burocracia e controle dos métodos tradicionais como sinal de disciplina.

Pessoas em Primeiro Lugar

O DAD promove uma busca para ajudar os times de desenvolvimento a melhorar sua efetividade, entretanto não prescreve procedimentos obrigatórios para se chegar neste objetivo.

Alguma documentação será exigida, mas raramente tanto quanto é exigida nos métodos tradicionais. A integração entre pessoas (clientes e desenvolvedores) dá oportunidades para sanar mal-entendidos e diminuir os defeitos dos sistemas a serem entregas, o que é tratado na cultura de prevenção de desperdícios da metodologia Lean. Pois quando criamos um documento raramente pomos no papel nosso completo entendimento do que estamos descrevendo, e inevitavelmente algum conhecimento é ‘deixado para traz’ eis o que o conhecimento tácito não é passado adiante.

Os membros de um time que aplica a metodologia DAD devem possuir os seguintes atributos:
  •   Disciplina para se comprometer apenas com o trabalho que conseguem realizar e trabalhar da melhor maneira possível para realizar o seu trabalho;
  • Organização para estimar e planejar o seu trabalho de uma maneira que possam realizar entregas constantes;
  • Autodidata para identificar o que melhor funciona para si e o que não funciona, tendo oportunidade de aprender e se ajustar.

Metodologias Ágeis

Times de desenvolvimento que buscam trabalhar de maneira iterativa tem mostrado que produzem soluções de maior qualidade, proporcionando um maior retorno do investimento, bem como a satisfação dos clientes e entregando as soluções mais rápido que as abordagens tradicionais, como a waterfall. A satisfação dos clientes está diretamente ligada a participação deles no projeto durante cada iteração, e em conjunto com eles melhorando os requisitos do software que será desenvolvido no final do projeto.

Processo Hibrido de Desenvolvimento

DAD é um conjunto de diversas estratégias e praticas de tanto de metodologias ágeis quanto dos métodos tradicionais. No DAD é utilizado o ciclo de vida do Scrum adotando entregas continuas de software bem como utilizando técnicas Lean de desenvolvimento. Muitas das praticas sugeridas pelo DAD são comumente discutidas na comunidade ágil, tais como integração contínua, reuniões diárias e refatoração bem como algumas praticam avançadas que são muito aplicadas, porém pouco discutidas por alguma razão. São, dentre outras, o levantamento inicial de requisitos, estudo da arquitetura a ser utilizada, e testes no final do ciclo de desenvolvimento.

Consciência Empresarial

Os times DAD trabalham dentro do seu ecossistema empresarial, assim como outros times, e visam a aproveitar as vantagens apresentadas a eles – personificando o clichê: “agir localmente e pensar globalmente”. Em outras palavras, os times DAD devem adotar como mentalidade ‘a empresa como um todo’.

Ter uma consciência empresarial é importante que os times busquem, como profissionais, o que é melhor para organização e não somente o que lhes interessa.

Foco no Risco e Valor

DAD adota um ciclo de vida voltado ao chamado foco no risco e valor, o que é muito comum nos métodos ágeis como Scrum e XP. Trabalhando com foco no risco e valor o time acaba produzindo material entregável em cada iteração, ou mais precisamente a partir da perspectiva do DAD, um material potencialmente consumível em cada iteração. Essas entregas representam aqueles que tem maior valor na perspectiva dos clientes. Deve ser considerado também o risco de entrega nos itens de alta prioridade e não somente os de maior valor. Sempre tomando cuidado com os três principais riscos:
1.       O risco de não entregar nada;
2.       O risco de entregar o software sem funcionalidade;
3.       O risco político de ter pouca visibilidade sobre o que o time esta produzindo.

Conclusão


Disciplined Agile Delivery (DAD) é um processo hibrido que combina as praticas e estratégias do Scrum, Extreme Programming (XP) e Agile Modeling (AM) e complementa com algumas outras, como Agile Data e Kanban, adotando um ciclo de vida de entrega total.

segunda-feira, 6 de outubro de 2014

Disciplined Agile Delivery – Scott W. Ambler

Essa postagem é uma introdução ao livro do Scott Ambler, que trata de DAD.

Scott Ambler percebeu que a realidade de muitas empresas era algo parecido com uma water-scrum-fall, na forma de que a maioria das empresas não aceitava iniciar seus projetos sem que antes tenham uma lenta fase de definição de requisitos, planejamento detalhado do projeto e até fazendo algum design. Essa abordagem não é de todo mal, ela permite que as empresas se beneficiem de práticas ágeis, como trabalho iterativo, desenvolvimento voltado a testes e entregas contínuas. Entretanto não é liberado todo o potencial da abordagem ágil. Empresas ágeis não somente criam os softwares de maneira mais eficiente, mas o mais importante é que entregam um software com grande valor de negocio.  

Porque Disciplined Agile Delivery?

Está constatado que métodos ágeis, como Scrum, funcionam muito bem para times de pequenos projetos, onde são trabalhados problemas com baixo risco ou consequências de falhas. Entretanto, esses métodos não trazem segurança para projetos de maior escala, e o resultado acaba sendo que as empresas investem muito esforço criando processos híbridos, combinando metodologias de diferentes fontes. O processo Disciplined Agile Delivery (DAD), como é descrito no livro do Scott Ambler, é uma abordagem hibrida, que busca técnicas do Scrum, Agile Modeling, EX, Unified Process e Kanban dentre outras metodologias. O processo do DAD inclui praticas que estão faltantes no Scrun e XP como modelagem e documentação. O mais importante é que o DAD permite que o processo seja ajustado efetivamente as necessidades da situação em que você se encontra. Descrevendo o que funciona e o que não funciona, e o mais importante porque, o DAD ajuda a aumentar as chances de adotar estratégias que vão funcionar para você.