<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gustavo Dutra &#187; open-source</title>
	<atom:link href="http://gustavodutra.com/tag/open-source/feed/" rel="self" type="application/rss+xml" />
	<link>http://gustavodutra.com</link>
	<description>Um pouco de tudo, nada de pouco</description>
	<lastBuildDate>Thu, 29 Jul 2010 22:57:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Introdução a testes unitários com CakePHP e SimpleTest</title>
		<link>http://gustavodutra.com/post/377/introducao-a-testes-unitarios-com-cakephp-e-simpletest/</link>
		<comments>http://gustavodutra.com/post/377/introducao-a-testes-unitarios-com-cakephp-e-simpletest/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 16:22:50 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Unit Test]]></category>
		<category><![CDATA[aumentar produtivade]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[fdd]]></category>
		<category><![CDATA[feature driven development]]></category>
		<category><![CDATA[fixtures]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[open-source]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[simpletest]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste de software]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=377</guid>
		<description><![CDATA[Há tempos eu venho lendo sobre XP (eXtreme Programming), Scrum e Feature Driven Development (FDD). São metodologias ágeis de desenvolvimento de software. O engraçado é que praticamente, ao meu ver, fazem a mesma coisa, porém de forma diferente. E todas elas frizam a importância dos testes unitários e, mais especificadamente, testes unitários antes do desenvolvimento, [...]]]></description>
			<content:encoded><![CDATA[<p>Há tempos eu venho lendo sobre XP (eXtreme Programming), Scrum e Feature Driven Development (FDD). São metodologias ágeis de desenvolvimento de software. O engraçado é que praticamente, ao meu ver, fazem a mesma coisa, porém de forma diferente. E todas elas frizam a importância dos testes unitários e, mais especificadamente, testes unitários antes do desenvolvimento, o chamado TDD (Test Driven Development). Como nunca havia trabalhado desta forma, ainda não tinha uma opinião sobre isso. Apenas comentários e depoimentos de que usa. Somado a isso, veio aquele senso de desafio, de inovação e curiosidade.</p>
<p>Faz alguns meses, e decidimos, eu e o <a rel="nofollow" href="http://ezabka.wordpress.com">Emanuel Zabka</a>, implantar o TDD no desenvolvimento na empresa em que trabalhamos. Academicamente é falado muito em <em>refactoring</em> e <em>mudanças de requisitos</em>, mas na prática, eu nunca havia notado a quantidade de modificações que um mesmo código/classe/arquivo é modificado num curto período de tempo e a longo prazo.</p>
<p>Os testes me ajudaram a enxergar, não só as dependências do sistema, como também, <strong>acoplamentos desnecessários</strong>; a qualidade dos códigos; do design do projeto; e, consequentemente, diminuiu muito os bugs mais corriqueiros, como validação de campos. Mesmo tendo várias coisas boas, há coisas ruins, como aumento do tempo de desenvolvimento &#8211; o que, apesar de nunca ter medido, diminui o retrabalho e tempo utilizado no futuro em correções de bugs -, aumento da complexidade da arquitetura &#8211; a fim de manter uma maior coesão com baixo acoplamento, entre outros menos relevantes.<br />
<span id="more-377"></span></p>
<h2>Unit Test</h2>
<blockquote><p>
The basic concept of unit testing is write more code which will test the main code we’ve written, by “throwing” sample data at it and examining what it gets back.
</p></blockquote>
<p>Harry Fuecks</p>
<p>Enfim, uma boa definição de testes unitários é esta supracitada. São escritos mais códigos para testar o código principal, utilizando dados de testes para analisar o comportamento e o retorno do código sendo testado. </p>
<h2>CakePHP</h2>
<ul>
<li>Framework de desenvolvimento rápido pra Web com PHP</li>
<li>Utiliza padrões MVC e ORM</li>
<li>Extensível para desenvolvimento, manutenção e deploying.</li>
<li>OpenSource / Comunidade muito ativa e amigável   </li>
<li>Orientada a Objetos</li>
<li><a rel="nofollow" href="http://www.cakephp.org/pages/features" target="_blank">Mais detalhes sobre o CakePHP</a></li>
</ul>
<h2>SimpleTest</h2>
<ul>
<li>Praticamente mesma coisa que JUnit, JMock e PHPUnit.</li>
<li>Guiado através de asserções</li>
<li>Possibilidade navegação em requisições HTTP para testar interface gerada (HTML)   </li>
<li>OpenSource</li>
<li>Orientada a Objetos</li>
<li><a rel="nofollow" href="http://www.simpletest.org/en/overview.html" target="_blank">Mais detalhes sobre o SimpleTest</a></li>
</ul>
<h2>CakePHP e SimpleTest</h2>
<ul>
<li>Startup (criação do arquivo, casos de testes básicos) dos testes unitários automaticamente</li>
<li>Customizações no template de Report (Web com template padrão)</li>
<li>Rápida execução de testes individualizados</li>
<li>Rápida execução de grupos de testes (execução de vários testes unitários sequencialmente)</li>
<li>Pode-se usar Mock para objetos internos do CakePHP ou da aplicação</li>
<li>Pode-se testar aplicação toda (APP + Plugins)</li>
<li>Pode-se testar somente a aplicação (APP)</li>
<li>Pode-se testar plugins separadamente</li>
<li>Pode-se testar em modo batch</li>
<li><a rel="nofollow" href="http://book.cakephp.org/view/354/Preparing-for-testing" target="_blank">Integração dos dois frameworks</a></li>
</ul>
<h2>Convenções e Padrões</h2>
<p>Para o SimpleTest não há padronização no nome dos arquivos, mas o CakePHP estabelece um a partir da convenção das classes utilizados por ele. Ex: respectivamente as classes de controller e model de um Post:</p>
<dl>
<dt><strong>PostController</strong></dt>
<dd>tests/cases/controllers/post_controller.test.php</dd>
<dt><strong>Post</strong></dt>
<dd>tests/cases/models/post.test.php</dd>
</dl>
<ul>
<li>O nome da classe contida no arquivo é derivado a partir do nome do mesmo.</li>
<li>Esta classe deve extender a classe CakeTestCase ou CakeWebTestCase</li>
<li>A assinatura dos métodos que contém asserções (métodos de teste) devem iniciar com “test”, como em testPostControllerAddPost().</li>
<li>Métodos que são executados como eventos:
<dl>
<dt><strong>start()</strong></dt>
<dd>Primeiro método chamado. Executado quando se iniciam os testes</dd>
<dt><strong>end()</strong></dt>
<dd>Último método chamado. Executado quando se concluí todos os casos testes</dd>
<dt><strong>startCase()</strong></dt>
<dd>Executado antes do caso de teste começar a ser testado (lembrando que um teste pode ser composto de um ou mais casos de teste)</dd>
<dt><strong>endCase()</strong></dt>
<dd>Executado depois que o caso de teste foi testado por completo</dd>
<dt><strong>before($method)</strong></dt>
<dd>Anuncia o início de um método de teste</dd>
<dt><strong>after($method)</strong></dt>
<dd>Anuncia o término de um método de teste</dd>
<dt><strong>startTest($method)</strong></dt>
<dd>Executado antes de um caso de teste iniciar</dd>
<dt><strong>endTest($method)</strong></dt>
<dd>Executado depois que um caso de teste termina</dd>
</dl>
</li>
</ul>
<p><a rel="nofollow" href="http://book.cakephp.org/view/362/Creating-tests" target="_blank">Mais detalhes sobre as convenções</a></p>
<h2>Fixtures</h2>
<p>Fixtures são uma forma de utilizar dados de teste. São matrizes de dados que correspondem à registros em um banco de dados.<br />
Cada Model possui uma Fixture, que irá não só ter os dados como a representação dos campos que compõe a tabela do banco, pois a partir destes dados o framework irá:</p>
<ol>
<li>Criar uma tabela prefixada (por padrão) de “test_suite_” no banco de dados para cada fixture necessário (ou seja, cada model utilizado).</li>
<li>Inserir os dados de teste na tabela de teste</li>
<li>Executar os testes em cima destes registros</li>
<li>Remover os dados da tabela de teste</li>
<li>Remover a tabela no banco de dados.</li>
</ol>
<p>Ou seja, assim é garantido que os dados serão sempre os mesmos e que não comprometerá a base de dados atual com sujeira, podendo-se executar<br />
estes testes a qualquer momento atrás de problemas. Testes que envolvem banco de dados com índices únicos, chaves primárias ou outras constraints<br />
estão livres de erros (erros não propositais) durante os testes.</p>
<p><a rel="nofollow" href="http://book.cakephp.org/view/358/Preparing-test-data" target="_blank">Veja mais sobre Fixtures</a></p>
<h2>Asserções</h2>
<ul>
<li>assertTrue($x)</li>
<li>assertFalse($x)</li>
<li>assertNull($x)</li>
<li>assertEqual($x, $y)</li>
<li>assertIsA($object, ‘ClassName’)</li>
<li>assertIdentical($x, $y)</li>
<li>assertPattern(’/REGEX/’, $x)</li>
<li>expectError();</li>
</ul>
<p>Se você se interessou, para mais detalhes sobre os testes unitários no CakePHP, recomendo a leitura deste post da <a rel="nofollow" href="http://debuggable.com">Debuggable</a>: <a rel="nofollow" href="http://debuggable.com/posts/unit-testing-in-cakephp-part-1---introduction-to-unit-testing:48102610-c5d0-4398-a010-76974834cda3" target="_blank"><cite>Unit Testing in CakePHP Part 1 &#8211; Introduction to Unit Testing</cite></a></p>
<p>Agradecimentos especiais a <a rel="nofollow" href="http://twitter.com/wmute">André Leitzke</a> e <a rel="nofollow" href="http://vivids.com.br">Viviane de Souza</a> por terem me ajudado com a caracterização e descrição do framework!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/377/introducao-a-testes-unitarios-com-cakephp-e-simpletest/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Usando Screen e Vim para Pair Programming remoto</title>
		<link>http://gustavodutra.com/post/276/usando-screen-e-vim-para-pair-programming-remoto/</link>
		<comments>http://gustavodutra.com/post/276/usando-screen-e-vim-para-pair-programming-remoto/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 22:09:59 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[engenharia de software]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[open-source]]></category>
		<category><![CDATA[pair programming]]></category>
		<category><![CDATA[screen]]></category>
		<category><![CDATA[skype]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=276</guid>
		<description><![CDATA[Bem, é notável o crescimento das metodologias ágeis de desenvolvimento de software. Uma das práticas que me agrada muito, é a programação em pares (pair programming). É bem perceptível, a um longo prazo, a diferença que faz essa prática. Navegando pela internet, como um marujo sem rumo, encontrei um post falando sobre Remote Pair Programming. [...]]]></description>
			<content:encoded><![CDATA[<p>Bem, é notável o crescimento das <strong>metodologias ágeis de desenvolvimento de software</strong>. Uma das práticas que me agrada muito, é a programação em pares (<em>pair programming</em>). É bem perceptível, a um longo prazo, a diferença que faz essa prática. Navegando pela internet, como um marujo sem rumo, encontrei um post falando sobre <em>Remote Pair Programming</em>. Parece meio estranho, porque o XP (<a rel="nofollow" href="http://www.extremeprogramming.org/">eXtreme Programming</a>) faz alusão a uma dupla programar em um único computador, com um único teclado e um único mouse.<br />
<span id="more-276"></span><br />
Então, vamos tentar simular este ambiente utilizando 4 ferramentas simples:</p>
<ul>
<li>screen</li>
<li>ssh</li>
<li>vim</li>
<li>skype</li>
</ul>
<p>Destas, só o <em>skype</em> não é <em>open-source</em>. Mas é interessante manter uma conversa verbal, pois conversas escritas podem desviar o foco da programação, que é bem mais rápida e precisa do que a escrita, que pode deixar brechas para má interpretações. A conversa verbal consegue interromper o programador ao mesmo tempo em que escreve, corrigindo-o ou questionando-o.</p>
<p>Conectados no skype, basta decidir em qual máquina será o desenvolvimento. Esta, por sua vez, terá que ter um servidor <strong>ssh</strong>. Ela será o <em>host</em> da programação. Será necessário, também, nesta máquina, ter instalado o <em>screen</em>, que é um programa que possibilita criar &#8217;sessões&#8217; no terminal.</p>
<h2>Host</h2>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">screen</span> <span style="color: #660033;">-S</span> PairProgramming</pre></div></div>

<p>Parece que nada mudou, mas você está numa sessão do <strong>screen</strong> chamada <em>PairProgramming</em>.</p>
<p>Precione CTRL+a e digite:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">:multiuser on</pre></div></div>

<p>Pressione CTRL+a novamente e digite:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">:acladd usuarioclient</pre></div></div>

<p>Tudo que você ver nesta sessão, será visto pelo outro usuário (<em>usuarioclient</em>) que se conectará nela.</p>
<p>Então, abra o <strong>vim</strong>, pois será necessário um edito de textos de verdade <img src='http://gustavodutra.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , e se divirta:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">vim</span> <span style="color: #000000; font-weight: bold;">/</span>caminho<span style="color: #000000; font-weight: bold;">/</span>arquivo</pre></div></div>

<h2>Client</h2>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ssh</span> usuarioclient<span style="color: #000000; font-weight: bold;">@</span>host
<span style="color: #c20cb9; font-weight: bold;">screen</span> <span style="color: #660033;">-x</span> usuariohost<span style="color: #000000; font-weight: bold;">/</span>PairProgramming</pre></div></div>

<p>Pronto! Agora você está acessando a mesma seção! Tudo que o <em>usuáriohost</em> fizer, o <em>usuárioclient</em> enxergará e <strong>vice-versa</strong>.</p>
<p>Agora, basta descutir a tarefa via Skype e programar. As atualizações são em tempo real, ou seja, aparecem ao mesmo tempo que são escritos, digo&#8230; depende da conexão, mas não é um grande problema.</p>
<p>Caso seja necessário que o usuarioclient não possa modificar o código, apenas assitir e dar pitacos, o usuáriohost deve pressionar CTRL+A e digitar:</p>
<pre>:aclchg usuarioclient -w #</pre>
<p>Eu ainda vou programar assim, depois digo a experiência.</p>
<h2>Referências</h2>
<ul>
<li><a rel="nofollow" href="http://www.linux.com/archive/feature/56443">Linux.com</a></li>
<li><a rel="nofollow" href="http://haruska.com/2009/09/29/remote-pair-programming/">Jason Haruska</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/276/usando-screen-e-vim-para-pair-programming-remoto/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
