<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2772591731357338249</id><updated>2011-07-07T20:55:12.656-07:00</updated><category term='NUnit'/><category term='Processo de software'/><category term='Carreira'/><category term='.NET Architects'/><category term='Codificação'/><category term='DNAD 2009'/><category term='Arquitetura'/><category term='Testes de Software'/><title type='text'>Renato Duran</title><subtitle type='html'>Dot Net, Engenharia de Software e a vida como ela é.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://renatoduran.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://renatoduran.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Renato Duran</name><uri>http://www.blogger.com/profile/11442773657891638830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_FRaNOpqsAnc/Sj_FUFU31zI/AAAAAAAAFJ0/yAFagIfaKf4/S220/DSC02486.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2772591731357338249.post-3542416605751483746</id><published>2009-07-27T18:47:00.000-07:00</published><updated>2009-07-27T19:10:31.153-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Codificação'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura'/><category scheme='http://www.blogger.com/atom/ns#' term='Processo de software'/><category scheme='http://www.blogger.com/atom/ns#' term='Testes de Software'/><title type='text'>Da necessidade ao sistema - parte 1</title><content type='html'>&lt;div align="justify"&gt;Existem diversas abordagens de processos de software disponíveis no mercado: &lt;a href="http://en.wikipedia.org/wiki/RUP"&gt;RUP&lt;/a&gt; (Rational Unified Process - derivado do &lt;a href="http://en.wikipedia.org/wiki/Unified_Process"&gt;UP&lt;/a&gt; - Unified Process), &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Solutions_Framework"&gt;MSF&lt;/a&gt; (Microsoft Solution Framework), &lt;a href="http://en.wikipedia.org/wiki/Extreme_programming"&gt;XP&lt;/a&gt; (eXtreme Programming), &lt;a href="http://en.wikipedia.org/wiki/Essential_Unified_Process"&gt;essUP&lt;/a&gt; (Essential Unified Process, de um dos criadores da &lt;a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language"&gt;UML&lt;/a&gt; - Unified Modeling Language - &lt;a href="http://en.wikipedia.org/wiki/Ivar_Jacobson"&gt;Ivar Jacobson&lt;/a&gt;), dentre diversas outras. Umas têm abordagens mais formais, outras menos formais.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Independente do(s) paradigma(s) utilizado(s), o nosso objetivo como profissionais de sistemas de TI é sempre o mesmo: desenvolver software com qualidade, que atenda às reais necessidades dos nossos clientes. Esse é o mantra e parece simples, mas não é. Desenvolver software é uma tarefa árdua e, no final das contas, todos os processos / métodos acabam tendo fundamentos muito parecidos para que se consiga atingir esse objetivo.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Escreverei uma série de posts, mostrando um exemplo de um ciclo de vida completo de desenvolvimento de um sistema, desde a necessidade de negócio até parte do sistema pronto. Mostrarei nos posts subsequentes atividades que cobrem todo o ciclo de vida: entendimento do processo de negócio, identificação dos requisitos, definição e refinamento da arquitetura, análise, codificação e planejamento e execução de testes. &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Seguirei práticas presentes em vários dos métodos citados no início do post, mas não seguirei nenhum à risca. Na minha visão, todos esses paradigmas são frameworks que compilam um conjunto de boas práticas, e que se mostraram eficazes em projetos de software bem sucedidos. Portanto, não importa qual o processo que se siga, o que importa é que se desenvolva um conjunto de atividades que agregue valor ao projeto.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Alguns pontos chaves que utilizarei:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Desenvolvimento iterativo e incremental;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Foco na arquitetura do projeto;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Preocupação em acomodar mudanças; e,&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Testes planejados desde o início do projeto.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;Todos esses pontos chaves estão presentes na maioria dos processos existentes no mercado. Eles serão as premissas que utilizarei no decorrer do projeto.&lt;/p&gt;&lt;p align="justify"&gt;No próximo post comentarei sobre a necessidade de negócio que utilizarei como base para desenvolvimento do sistema.&lt;/p&gt;&lt;p align="justify"&gt;Até lá.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2772591731357338249-3542416605751483746?l=renatoduran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://renatoduran.blogspot.com/feeds/3542416605751483746/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://renatoduran.blogspot.com/2009/07/da-necessidade-ao-sistema-parte-1.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/3542416605751483746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/3542416605751483746'/><link rel='alternate' type='text/html' href='http://renatoduran.blogspot.com/2009/07/da-necessidade-ao-sistema-parte-1.html' title='Da necessidade ao sistema - parte 1'/><author><name>Renato Duran</name><uri>http://www.blogger.com/profile/11442773657891638830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_FRaNOpqsAnc/Sj_FUFU31zI/AAAAAAAAFJ0/yAFagIfaKf4/S220/DSC02486.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2772591731357338249.post-2973975890050071490</id><published>2009-07-20T16:42:00.000-07:00</published><updated>2009-07-20T16:50:58.637-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Carreira'/><title type='text'>O que nos torna bons profissionais?</title><content type='html'>&lt;div align="justify"&gt;Costumo me fazer essa pergunta com freqüência, como forma de reflexão sobre minha carreira. Sempre tive uma coisa muito clara para mim: um ponto crucial para ter uma boa vida pessoal e profissional é ter EQUILÍBRIO. A natureza é assim: tende ao equilíbrio e, quando não há, ocorrem os desastres naturais como furacões, terremotos, maremotos e por aí vai. Quando não temos equilíbrio em nossas vidas, os problemas pessoais e profissionais se afloram.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Mas quero neste post focar no lado profissional. Para encarar o mercado de trabalho, que está cada vez mais competitivo e agressivo, as pessoas precisam encontrar o ponto de equilíbrio entre duas coisas: o lado “técnico”, referente ao conhecimento necessário para realizar o seu trabalho; e o lado pessoal / político.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Não adianta nada conhecermos muito dos assuntos da nossa área, se não soubermos equilibrar esse conhecimento com o lado pessoal no ambiente de trabalho.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;E é justamente no ponto do lado pessoal que quero colocar uma reflexão. Imagine que você é o gerente de um departamento. Que tipo de profissional você prefere ter na sua equipe: uma pessoa tecnicamente ótima e pessoalmente intragável, ou uma pessoa tecnicamente ruim e com bom relacionamento interpessoal? O ponto chave é o EQUILÍBRIO.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Já vi os dois cenários nas empresas em que trabalhei e nenhum deles, em minha opinião, é o ideal. É preciso ser um bom técnico (ou pelo menos ter boa capacidade de aprendizado e disposição para isso), uma vez que precisamos de conhecimento para executar nosso trabalho. Por outro lado, é preciso ser uma pessoa íntegra, que tenha bom relacionamento interpessoal no ambiente de trabalho, pois, caso contrário, essa pessoa provavelmente trará algum tipo de problema para a empresa.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Tenho a tendência a preferir uma pessoa educada, que se relaciona bem com os outros, de caráter e ética, em detrimento a um bom técnico. O nível técnico a gente melhora com treinamentos, palestras, leitura, grupos de estudo etc. Já a ética, caráter e educação vêm de berço. É booleano: ou a pessoa tem, ou não tem. Estes, eu prefiro que trabalhem longe de mim.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2772591731357338249-2973975890050071490?l=renatoduran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://renatoduran.blogspot.com/feeds/2973975890050071490/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://renatoduran.blogspot.com/2009/07/o-que-nos-torna-bons-profissionais.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/2973975890050071490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/2973975890050071490'/><link rel='alternate' type='text/html' href='http://renatoduran.blogspot.com/2009/07/o-que-nos-torna-bons-profissionais.html' title='O que nos torna bons profissionais?'/><author><name>Renato Duran</name><uri>http://www.blogger.com/profile/11442773657891638830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_FRaNOpqsAnc/Sj_FUFU31zI/AAAAAAAAFJ0/yAFagIfaKf4/S220/DSC02486.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2772591731357338249.post-3838023169306373217</id><published>2009-07-13T15:58:00.000-07:00</published><updated>2009-07-13T17:43:57.238-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testes de Software'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><title type='text'>Utilizando o NUnit - Parte 2</title><content type='html'>&lt;strong&gt;Introdução&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Neste post, continuarei a demonstrar alguns recursos da ferramenta de testes NUnit, conforme prometido na &lt;a href="http://renatoduran.blogspot.com/2009/07/utilizando-o-nunit.html"&gt;Parte 1&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vimos como instalar e configurar um projeto de testes para ser executado no NUnit, através de um exemplo simples. Agora, nosso objetivo é explorar mais dois recursos interessantes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Execução de testes que devem retornar uma Exception; e,&lt;/li&gt;&lt;li&gt;Configuração do &lt;strong&gt;Setup&lt;/strong&gt; de uma classe de testes.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Execução de testes que devem retornar uma Exception &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Imaginem o seguinte cenário: um usuário tenta cadastrar um novo Cliente, sem informar o RG. Como regra de negócio, o RG é uma informação obrigatória, portanto, ao tentar executar essa operação, o sistema deve retornar uma Exception. &lt;/p&gt;&lt;p&gt;O primeiro passo para implementarmos essa regra, é alterar a operação &lt;strong&gt;gravar&lt;/strong&gt; da nossa classe &lt;strong&gt;Cliente&lt;/strong&gt; para ficar assim:&lt;/p&gt;&lt;p&gt;23 public void gravar()&lt;br /&gt;24 {&lt;br /&gt;25 if (this.RG.Trim().Equals(""))&lt;br /&gt;26 throw new ArgumentException("RG é uma informação obrigatória.");&lt;br /&gt;27&lt;br /&gt;28 // código para gravação do Cliente...&lt;br /&gt;29 }&lt;/p&gt;&lt;p&gt;Reparem que, se o atributo RG não vier preenchido, uma nova Exception do tipo &lt;strong&gt;System.ArgumentException&lt;/strong&gt; é disparada. Notem também que aqui poderíamos criar uma Exception customizada, mas foge do propósito deste post.&lt;/p&gt;&lt;p&gt;Agora, para conseguirmos testar esse comportamento no NUnit, vamos criar mais um caso de teste na nossa classe &lt;strong&gt;TestesCliente&lt;/strong&gt;. O nome deste caso de teste será: &lt;strong&gt;gravarClienteSemInformarRG&lt;/strong&gt;, onde criaremos um objeto Cliente, informaremos o Nome, não informaremos o RG e esperaremos como retorno a Exception, conforme implementada na classe Cliente. Segue o código do caso de teste:&lt;/p&gt;&lt;p&gt;21 [Test]&lt;br /&gt;22 public void gravarClienteSemInformarRG()&lt;br /&gt;23 {&lt;br /&gt;24 Cliente.Cliente cliente = new Cliente.Cliente("Renato", "");&lt;br /&gt;25 cliente.gravar();&lt;br /&gt;26 }&lt;/p&gt;&lt;p&gt;Lembrando que, para que o teste apareça na IDE do NUnit, é preciso que o método esteja com o atributo [Test] configurado.&lt;/p&gt;&lt;p&gt;Agora, executando o método no NUnit, temos o seguinte resultado:&lt;/p&gt;&lt;p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 202px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5358087873230514402" border="0" alt="" src="http://1.bp.blogspot.com/_FRaNOpqsAnc/SlvAiEc7qOI/AAAAAAAAFMY/6cdyzDRrIoA/s320/UtilizandoONUnitParte2Figura1.jpg" /&gt;&lt;/p&gt;&lt;p align="center"&gt;Figura 1: Execução do teste&lt;br /&gt;&lt;strong&gt;gravarClienteSemInformarRG&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;O teste falhou. E qual a causa da falha? Simples: temos que dizer no método de teste que esperamos uma Exception! Para isso, basta incluir o atributo &lt;strong&gt;ExpectedException&lt;/strong&gt; passando o nome da Exception esperada como parâmetro ("System.ArgumentException") no método de testes:&lt;/p&gt;&lt;p align="justify"&gt;19 [Test]&lt;br /&gt;20 [ExpectedException("System.ArgumentException")]&lt;br /&gt;21 public void gravarClienteSemInformarRG()&lt;br /&gt;22 {&lt;br /&gt;23 Cliente.Cliente cliente = new Cliente.Cliente("Renato", "");&lt;br /&gt;24 cliente.gravar();&lt;br /&gt;25 }&lt;/p&gt;&lt;p align="justify"&gt;Execute novamente e veja que o teste passa, pois o método &lt;strong&gt;gravar&lt;/strong&gt; retorna uma Exception e é exatamente isso que queremos!&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Configuração do &lt;span style="color:#ff0000;"&gt;Setup&lt;/span&gt; de uma classe de testes&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;Agora, suponhamos que eu quero criar um teste para pesquisar um cliente válido pelo seu nome. Para conseguirmos executar este teste com sucesso, precisamos que o Cliente já exista. Neste exemplo, não estou utilizando nenhum banco de dados para armazenar as informações, mas, se estivesse, seria necessário ter um registro válido no banco de dados para que o teste seja executado.&lt;/p&gt;&lt;p align="justify"&gt;Como resolvemos isso? A primeira idéia seria criar o registro no banco de dados e executar o teste da pesquisa. Isso funciona, mas tem um problema: se alguém apagar o registro do banco de dados, o teste para de funcionar.&lt;/p&gt;&lt;p align="justify"&gt;Para contornar isso, uma boa prática nestes cenários é criar uma massa de dados no início da execução de um teste e excluí-la no final. Ou seja, os testes devem ser consistentes, independente dos registros que já existirem na base de dados.&lt;/p&gt;&lt;p align="justify"&gt;No NUnit isso é resolvido criando-se um método com o atributo &lt;strong&gt;Setup &lt;/strong&gt;(que será executado no início da chamada de cada método de teste) e outro método com o atributo &lt;strong&gt;TearDown&lt;/strong&gt; (que será executado no fim de cada método de teste). A seguir, demonstrarei o uso do &lt;strong&gt;Setup&lt;/strong&gt; (o &lt;strong&gt;TearDown&lt;/strong&gt; segue a mesma lógica).&lt;/p&gt;&lt;p align="justify"&gt;No meu exemplo, criarei um método com o atributo &lt;strong&gt;Setup&lt;/strong&gt; que será responsável por gravar um Cliente. Primeiro, criarei um atributo privado do tipo Cliente no escopo da classe de teste:&lt;/p&gt;&lt;p align="justify"&gt;12 private Cliente.Cliente cliente;&lt;/p&gt;&lt;p align="justify"&gt;Em seguida, criarei o método de &lt;strong&gt;Setup&lt;/strong&gt;:&lt;/p&gt;&lt;p align="justify"&gt;37 [SetUp]&lt;br /&gt;38 public void Inicializar()&lt;br /&gt;39 {&lt;br /&gt;40 cliente = new Cliente.Cliente("Renato", "12345");&lt;br /&gt;41 cliente.gravar();&lt;br /&gt;42 }&lt;/p&gt;&lt;p align="justify"&gt;Criarei agora o método &lt;strong&gt;pesquisarPorNomeValido&lt;/strong&gt; na classe de teste, onde chamarei a operação &lt;strong&gt;pesquisarPorNome&lt;/strong&gt;, da classe Cliente, passando no parâmetro &lt;strong&gt;nome&lt;/strong&gt; a string "Renato", que foi o objeto criado no método &lt;strong&gt;Inicializar&lt;/strong&gt;.&lt;/p&gt;&lt;p align="justify"&gt;29 [Test]&lt;br /&gt;30 public void pesquisarPorNomeValido()&lt;br /&gt;31 {&lt;br /&gt;32 cliente = cliente.pesquisarPorNome("Renato");&lt;br /&gt;33&lt;br /&gt;34 Assert.AreEqual("12345", cliente.RG);&lt;br /&gt;35 }&lt;/p&gt;&lt;p align="justify"&gt;Por fim, o método pesquisarPorNome, da classe Cliente, ficará assim:&lt;/p&gt;&lt;p align="justify"&gt;37 public Cliente pesquisarPorNome(string nome)&lt;br /&gt;38 {&lt;br /&gt;39 if (nome.Equals(this.Nome))&lt;br /&gt;40 return this;&lt;br /&gt;41 else&lt;br /&gt;42 return null;&lt;br /&gt;43 }&lt;/p&gt;&lt;p align="justify"&gt;Compilem o programa, executem o teste &lt;strong&gt;pesquisarPorNomeValido&lt;/strong&gt; no NUnit e vejam que tudo funciona!&lt;/p&gt;&lt;p align="justify"&gt;Explicando o código acima: no método &lt;strong&gt;Inicializar&lt;/strong&gt;, coloquei o atributo &lt;strong&gt;Setup&lt;/strong&gt;, que será executado sempre no início da chamada de todos os métodos de teste. Neste método, criei um novo objeto Cliente, de nome "Renato" e RG "12345". Reparem que não alterei minha classe "Cliente", logo o método &lt;strong&gt;gravar&lt;/strong&gt; continua não fazendo nada (apenas validando se o RG foi informado). Neste ponto poderíamos, por exemplo, fazer a gravação dessas informações no banco de dados.&lt;/p&gt;&lt;p align="justify"&gt;Após executar o método Inicializar, o método &lt;strong&gt;pesquisarPorNomeValido&lt;/strong&gt; utiliza o mesmo objeto cliente (que foi criado pelo método de &lt;strong&gt;Setup&lt;/strong&gt;), efetua a pesquisa pelo nome "Renato" e compara se o RG do cliente é igual a "12345". Como as strings conferem, então o teste é executado com sucesso. &lt;/p&gt;&lt;p align="justify"&gt;Se no parâmetro nome for informado qualquer coisa diferente de "Renato", o teste falhará. O mesmo é válido se a comparação for feita com qualquer outra string diferente de "12345".&lt;/p&gt;&lt;p align="justify"&gt;Abaixo segue o código fonte completo do exemplo.&lt;/p&gt;&lt;p align="justify"&gt;Classe &lt;strong&gt;Cliente&lt;/strong&gt;:&lt;/p&gt;&lt;p align="justify"&gt;1 using System;&lt;br /&gt;2 using System.Collections.Generic;&lt;br /&gt;3 using System.Linq;&lt;br /&gt;4 using System.Text;&lt;br /&gt;5&lt;br /&gt;6 namespace Cliente&lt;br /&gt;7 {&lt;br /&gt;8 public class Cliente&lt;br /&gt;9 {&lt;br /&gt;10 public Cliente() : this(null, null)&lt;br /&gt;11 {&lt;br /&gt;12 }&lt;br /&gt;13&lt;br /&gt;14 public Cliente(string nome, string rg)&lt;br /&gt;15 {&lt;br /&gt;16 this.Nome = nome;&lt;br /&gt;17 this.RG = rg;&lt;br /&gt;18 }&lt;br /&gt;19&lt;br /&gt;20 public string Nome { get; set; }&lt;br /&gt;21 public string RG { get; set; }&lt;br /&gt;22&lt;br /&gt;23 public void gravar()&lt;br /&gt;24 {&lt;br /&gt;25 if (this.RG.Trim().Equals(""))&lt;br /&gt;26 throw new ArgumentException("RG é uma informação obrigatória.");&lt;br /&gt;27&lt;br /&gt;28 // código para gravação do Cliente...&lt;br /&gt;29 }&lt;br /&gt;30&lt;br /&gt;31 public IList&lt;cliente&gt; pesquisar()&lt;br /&gt;32 {&lt;br /&gt;33 // código para pesquisa de Clientes...&lt;br /&gt;34 return null;&lt;br /&gt;35 }&lt;br /&gt;36&lt;br /&gt;37 public Cliente pesquisarPorNome(string nome)&lt;br /&gt;38 {&lt;br /&gt;39 if (nome.Equals(this.Nome))&lt;br /&gt;40 return this;&lt;br /&gt;41 else&lt;br /&gt;42 return null;&lt;br /&gt;43 }&lt;br /&gt;44&lt;br /&gt;45 public void excluir()&lt;br /&gt;46 {&lt;br /&gt;47 // código para exclusão do Cliente...&lt;br /&gt;48 }&lt;br /&gt;49 }&lt;br /&gt;50 } &lt;/p&gt;&lt;p align="justify"&gt;Classe &lt;strong&gt;TestesCliente&lt;/strong&gt;:&lt;/p&gt;&lt;p align="justify"&gt;1 using System;&lt;br /&gt;2 using System.Collections.Generic;&lt;br /&gt;3 using System.Linq;&lt;br /&gt;4 using System.Text;&lt;br /&gt;5 using NUnit.Framework;&lt;br /&gt;6&lt;br /&gt;7 namespace TestesCliente&lt;br /&gt;8 {&lt;br /&gt;9 [TestFixture]&lt;br /&gt;10 public class TestesCliente&lt;br /&gt;11 {&lt;br /&gt;12 private Cliente.Cliente cliente;&lt;br /&gt;13&lt;br /&gt;14 [Test]&lt;br /&gt;15 public void gravarCliente()&lt;br /&gt;16 {&lt;br /&gt;17 Cliente.Cliente cliente = new Cliente.Cliente("Renato", "12345");&lt;br /&gt;18 cliente.gravar();&lt;br /&gt;19 }&lt;br /&gt;20&lt;br /&gt;21 [Test]&lt;br /&gt;22 [ExpectedException("System.ArgumentException")]&lt;br /&gt;23 public void gravarClienteSemInformarRG()&lt;br /&gt;24 {&lt;br /&gt;25 Cliente.Cliente cliente = new Cliente.Cliente("Renato", "");&lt;br /&gt;26 cliente.gravar();&lt;br /&gt;27 }&lt;br /&gt;28&lt;br /&gt;29 [Test]&lt;br /&gt;30 public void pesquisarPorNomeValido()&lt;br /&gt;31 {&lt;br /&gt;32 cliente.pesquisarPorNome("Renato");&lt;br /&gt;33&lt;br /&gt;34 Assert.AreEqual("12345", cliente.RG);&lt;br /&gt;35 }&lt;br /&gt;36&lt;br /&gt;37 [SetUp]&lt;br /&gt;38 public void Inicializar()&lt;br /&gt;39 {&lt;br /&gt;40 cliente = new Cliente.Cliente("Renato", "12345");&lt;br /&gt;41 cliente.gravar();&lt;br /&gt;42 }&lt;br /&gt;43 }&lt;br /&gt;44 }&lt;br /&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;Com esses recursos, conseguimos resolver entre 80 e 90% das situações de testes do cotidiano. Existem ainda alguns outros recursos que podem ser testados, como o próprio atributo &lt;strong&gt;TearDown&lt;/strong&gt;, para executar rotinas após a execução dos métodos de teste (por exemplo, limpar os registros de teste da base de dados).&lt;/p&gt;&lt;p align="justify"&gt;Até a próxima.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2772591731357338249-3838023169306373217?l=renatoduran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://renatoduran.blogspot.com/feeds/3838023169306373217/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://renatoduran.blogspot.com/2009/07/utilizando-o-nunit-parte-2.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/3838023169306373217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/3838023169306373217'/><link rel='alternate' type='text/html' href='http://renatoduran.blogspot.com/2009/07/utilizando-o-nunit-parte-2.html' title='Utilizando o NUnit - Parte 2'/><author><name>Renato Duran</name><uri>http://www.blogger.com/profile/11442773657891638830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_FRaNOpqsAnc/Sj_FUFU31zI/AAAAAAAAFJ0/yAFagIfaKf4/S220/DSC02486.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FRaNOpqsAnc/SlvAiEc7qOI/AAAAAAAAFMY/6cdyzDRrIoA/s72-c/UtilizandoONUnitParte2Figura1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2772591731357338249.post-1418073383501604091</id><published>2009-07-06T10:56:00.000-07:00</published><updated>2011-02-07T16:32:51.895-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testes de Software'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><title type='text'>Utilizando o NUnit - Parte 1</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;Introdução&lt;br /&gt;&lt;/strong&gt;Neste post demonstrarei como utilizar o &lt;a href="http://www.nunit.org/"&gt;NUnit&lt;/a&gt; para geração de testes unitários para a plataforma .Net. O NUnit é uma ferramenta muito útil e de fácil utilização, mas antes de descrever o seu funcionamento, comentarei um pouco a respeito de Testes de Software.&lt;br /&gt;Desenvolver software é uma tarefa complexa e, para desenvolver um software com qualidade, é preciso estar atento a diversos fatores como: conseguir capturar requisitos que reflitam a necessidade de negócio, elaborar uma arquitetura flexível e escalável, utilizar um processo que suporte facilmente mudanças e por último, porém não menos importante, é preciso ter um processo de Testes muito bem definido.&lt;br /&gt;O objetivo deste post não é discutir se &lt;a href="http://en.wikipedia.org/wiki/Rup"&gt;RUP&lt;/a&gt; (Rational Unified Process) é melhor que &lt;a href="http://en.wikipedia.org/wiki/Extreme_Programming"&gt;XP&lt;/a&gt; (eXtreme Programming), ou se XP é melhor que &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Solutions_Framework"&gt;MSF&lt;/a&gt; (Microsoft Solution Framework), ou se o &lt;a href="http://en.wikipedia.org/wiki/Pmbok"&gt;PMBoK&lt;/a&gt; (Project Management Body of Knowledge) é melhor ou pior que &lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)"&gt;Scrum&lt;/a&gt;. Até mesmo porque cada método / prática têm o seu lugar em contextos específicos. O ponto que quero enfatizar é a suma importância de ter um processo de Testes bem definido, como ponto chave para o desenvolvimento de software com qualidade. Discussões mais, digamos, calorosas sobre processos ficarão para outros posts. :-)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Processo de Teste&lt;/strong&gt;&lt;br /&gt;Também não é objetivo deste post entrar em detalhes teóricos de Testes de Software. Farei apenas um apanhado geral do processo e dos tipos de teste que podem ser aplicados no desenvolvimento de um software.&lt;br /&gt;Um modelo bastante utilizado para planejamento e execução de testes é o chamado “&lt;a href="http://en.wikipedia.org/wiki/V-Model_(software_development)"&gt;V Model&lt;/a&gt;” (modelo em “V”). O “V” é para ilustrar como o processo é organizado (ver figura 1). A idéia do modelo é que, à medida que se avança nas atividades do desenvolvimento de um software, planejamos um tipo de teste específico. Seguindo a figura, uma vez que tem-se os requisitos (ou parte deles) definidos, podemos planejar os testes de Aceite (realizados pelo Cliente para validação do software) e de Sistema (realizados internamente, comparando o software desenvolvido com os requisitos definidos). Ao definir os componentes, pode-se planejar os testes de Integração (que focam no funcionamento integrado dos módulos que compõe o software) e, uma vez definidas as classes, procedures e scripts de banco de dados, é possível planejar os testes Unitários (que focam nas unidades de software a serem testadas). Neste post, comentarei sobre o NUnit que, como mencionado, é uma ferramenta utilizada para execução de testes Unitários.&lt;br /&gt;Existem ainda outras abordagens para o processo de software e de testes, como o &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; (Test Driven Development). Em posts futuros, comentarei também sobre isso. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 252px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5355428086635643442" border="0" alt="" src="http://2.bp.blogspot.com/_FRaNOpqsAnc/SlJNeHQRQjI/AAAAAAAAFMA/I2FXueO5Pbs/s320/UtilizandoONUnitFigura1.jpg" /&gt; &lt;p align="center"&gt;Figura 1: V-Model&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Instalando o NUnit &lt;/strong&gt;&lt;br /&gt;Voltando para o foco principal do post: o NUnit é uma ferramenta “open source”, escrita em C# e pode ser encontrada no link: &lt;a href="http://www.nunit.org/"&gt;http://www.nunit.org/&lt;/a&gt;. Baixem o instalador através da opção “Download” do site. A versão utilizada neste post é a 2.5.0.9122. Execute o instalador e observe que o NUnit aparecerá no diretório “C:\Arquivos de Programas\NUnit 2.5”, caso as opções padrão não tenham sido alteradas na instalação. Um link para a IDE do NUnit será adicionado no menu “Iniciar à Todos os Programas à NUnit 2.5 à NUnit”. É esta IDE que utilizaremos para execução dos nossos testes unitários (ver figura 2). &lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://2.bp.blogspot.com/_FRaNOpqsAnc/SlJN5DKNYcI/AAAAAAAAFMI/U7g96Aa6Yv0/s1600-h/UtilizandoONUnitFigura2.jpg"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 206px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5355428549392949698" border="0" alt="" src="http://2.bp.blogspot.com/_FRaNOpqsAnc/SlJN5DKNYcI/AAAAAAAAFMI/U7g96Aa6Yv0/s320/UtilizandoONUnitFigura2.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;Figura 2 – IDE do NUnit&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Criando um projeto de exemplo&lt;/strong&gt;&lt;br /&gt;Neste exemplo, utilizaremos o Visual Studio 2008 como IDE de desenvolvimento, mas as versões 2003 e 2005 também podem ser utilizadas. Crie uma solution em branco e adicione um novo projeto do tipo Class Library. No meu caso, utilizei a linguagem C#.&lt;br /&gt;Neste projeto, modifique o nome da classe “Class1” para “Cliente”, crie dois atributos e as operações básicas de CRUD (“Create” – gravação, “Read” – leitura, “Update” – atualização e “Delete” – exclusão). Veja o código abaixo. Essa será a classe que testaremos, utilizando o NUnit. Notem que não estou preocupado com o conteúdo de cada método.&lt;br /&gt;&lt;br /&gt;1 using System;&lt;br /&gt;2 using System.Collections.Generic;&lt;br /&gt;3 using System.Linq;&lt;br /&gt;4 using System.Text;&lt;br /&gt;5&lt;br /&gt;6 namespace Cliente&lt;br /&gt;7 {&lt;br /&gt;8 public class Cliente&lt;br /&gt;9 {&lt;br /&gt;10 public Cliente(string nome, string rg)&lt;br /&gt;11 {&lt;br /&gt;12 this.Nome = nome;&lt;br /&gt;13 this.RG = rg;&lt;br /&gt;14 }&lt;br /&gt;15&lt;br /&gt;16 public string Nome { get; set; }&lt;br /&gt;17 public string RG { get; set; }&lt;br /&gt;18&lt;br /&gt;19 public void gravar()&lt;br /&gt;20 {&lt;br /&gt;21 // código para gravação do Cliente...&lt;br /&gt;22 }&lt;br /&gt;23&lt;br /&gt;24 public IList&lt;cliente&gt; pesquisar()&lt;br /&gt;25 {&lt;br /&gt;26 // código para pesquisa de Clientes...&lt;br /&gt;27 return null;&lt;br /&gt;28 }&lt;br /&gt;29&lt;br /&gt;30 public IList&lt;cliente&gt; pesquisarPorNome(string nome)&lt;br /&gt;31 {&lt;br /&gt;32 // código para pesquisa de Clientes, dado o nome...&lt;br /&gt;33 return null;&lt;br /&gt;34 }&lt;br /&gt;35&lt;br /&gt;36 public void excluir()&lt;br /&gt;37 {&lt;br /&gt;38 // código para exclusão do Cliente...&lt;br /&gt;39 }&lt;br /&gt;40 }&lt;br /&gt;41 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Criando um projeto de Testes para ser executado no NUnit &lt;/strong&gt;&lt;br /&gt;Adicione a solution do Visual Studio um novo projeto do tipo “Class Library” e dê o nome TestesCliente. Adicione uma referência ao projeto “Cliente”, clicando com o botão direito no nome do projeto e escolhendo a opção “Add reference...”. Na guia “Projects”, selecione o projeto “Cliente” e clique em “Ok”.&lt;br /&gt;Criaremos agora um caso de teste neste novo projeto, para testar a inclusão de um novo cliente. Para isso, crie um método que instancie um novo objeto Cliente, atribuindo valores às propriedades Nome e RG e, em seguida, chame a operação gravar, conforme código abaixo.&lt;br /&gt;&lt;br /&gt;1 using System;&lt;br /&gt;2 using System.Collections.Generic;&lt;br /&gt;3 using System.Linq;&lt;br /&gt;4 using System.Text;&lt;br /&gt;5&lt;br /&gt;6 namespace TestesCliente&lt;br /&gt;7 {&lt;br /&gt;8 public class TestesCliente&lt;br /&gt;9 {&lt;br /&gt;10 public void gravarCliente()&lt;br /&gt;11 {&lt;br /&gt;12 Cliente.Cliente cliente = new Cliente.Cliente("Renato", "12345");&lt;br /&gt;13 cliente.gravar();&lt;br /&gt;14 }&lt;br /&gt;15 }&lt;br /&gt;16 }&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;Agora, para que essa classe seja testável pelo NUnit, precisamos fazer algumas configurações: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;div align="justify"&gt;Adicione uma referência à biblioteca do NUnit: clique com o botão direito no projeto TestesCliente à “Add Reference...” à “Browse” à nunit.framework.dll (no meu caso, a DLL encontra-se em “c:\arquivos de programas\NUnit 2.5\bin\net-2.0\tests”); &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Adicione a referência ao NUnit na classe (“using NUnit.Framework;” no topo do código); &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Adicione o atributo “TestFixture” à classe “TestesCliente”; &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Adicione o atributo “Test” ao método “gravarCliente”; e, &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Compile a solution. &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p align="justify"&gt;Pronto! A classe está pronta para ser testada no NUnit! Veja como ficou o código final, depois dessa configuração:&lt;br /&gt;&lt;br /&gt;1 using System;&lt;br /&gt;2 using System.Collections.Generic;&lt;br /&gt;3 using System.Linq;&lt;br /&gt;4 using System.Text;&lt;br /&gt;5 using NUnit.Framework;&lt;br /&gt;6&lt;br /&gt;7 namespace TestesCliente&lt;br /&gt;8 {&lt;br /&gt;9 [TestFixture]&lt;br /&gt;10 public class TestesCliente&lt;br /&gt;11 {&lt;br /&gt;12 [Test]&lt;br /&gt;13 public void gravarCliente()&lt;br /&gt;14 {&lt;br /&gt;15 Cliente.Cliente cliente = new Cliente.Cliente("Renato", "12345");&lt;br /&gt;16 cliente.gravar();&lt;br /&gt;17 }&lt;br /&gt;18 }&lt;br /&gt;19 }&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Executando os testes via interface gráfica do NUnit &lt;/strong&gt;&lt;br /&gt;Nesta seção, veremos como executar os testes pela interface gráfica do NUnit.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Abra o aplicativo NUnit (pode ser através do atalho do menu iniciar, ou através do diretório de instalação, ambos citados na seção “Instalando o NUnit”); &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;No menu “File”, selecione a opção “Open Project...”; &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Localize o seu projeto “TestesCliente” (pode ser a DLL ou o projeto do Visual Studio); &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Repare que o método “gravarCliente” aparece na árvore de testes. Opcionalmente, selecione a opção do menu “View” à “Tree” à “Show CheckBoxes”; &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Selecione o checkbox do método “gravarCliente”; &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Clique na opção “Run”; &lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Repare que seu teste foi executado com sucesso. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p align="justify"&gt;Veja na figura 3 a execução do teste “gravarCliente”. &lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://3.bp.blogspot.com/_FRaNOpqsAnc/SlJPX6CzwiI/AAAAAAAAFMQ/BytLmnYu6Kk/s1600-h/UtilizandoONUnitFigura3.jpg"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 206px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5355430179033563682" border="0" alt="" src="http://3.bp.blogspot.com/_FRaNOpqsAnc/SlJPX6CzwiI/AAAAAAAAFMQ/BytLmnYu6Kk/s320/UtilizandoONUnitFigura3.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;Figura 3: execução do teste “gravarCliente”.&lt;br /&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;br /&gt;É muito fácil utilizar o NUnit para execução de testes unitários. É interessante observar também a facilidade da ferramenta referente aos testes de regressão: caso uma funcionalidade seja alterada, é importante que todos os métodos já existentes sejam testados novamente. Com o NUnit, basta selecionar todos os métodos e executar os testes. Muito simples e extremamente útil para produzirmos software de melhor qualidade.&lt;br /&gt;Para complementar este meu exemplo, sugiro que sejam adicionados outros casos de teste, para testar os demais métodos da classe Cliente.&lt;br /&gt;Outros pontos que explorarei no próximo post:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Execução de testes que devem retornar uma Exception; &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Configuração do Setup de uma classe de teste. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;Até lá! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2772591731357338249-1418073383501604091?l=renatoduran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://renatoduran.blogspot.com/feeds/1418073383501604091/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://renatoduran.blogspot.com/2009/07/utilizando-o-nunit.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/1418073383501604091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/1418073383501604091'/><link rel='alternate' type='text/html' href='http://renatoduran.blogspot.com/2009/07/utilizando-o-nunit.html' title='Utilizando o NUnit - Parte 1'/><author><name>Renato Duran</name><uri>http://www.blogger.com/profile/11442773657891638830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_FRaNOpqsAnc/Sj_FUFU31zI/AAAAAAAAFJ0/yAFagIfaKf4/S220/DSC02486.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FRaNOpqsAnc/SlJNeHQRQjI/AAAAAAAAFMA/I2FXueO5Pbs/s72-c/UtilizandoONUnitFigura1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2772591731357338249.post-6170151561447879718</id><published>2009-06-29T14:29:00.000-07:00</published><updated>2009-06-29T14:49:42.052-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DNAD 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Architects'/><title type='text'>Resumo evento DNAD 2009</title><content type='html'>Neste meu segundo post, faço um resumo do evento DNAD 2009 (.Net Architects Day 2009), que ocorreu no último sábado, 27/06/2009.&lt;br /&gt;&lt;br /&gt;Este foi o primeiro evento do grupo de discussão &lt;a href="http://www.dotnetarchitects.net/"&gt;.Net Architects&lt;/a&gt; e foi um sucesso. A organização do evento foi impecável, todos foram muito assíduos e as palestras foram excelentes. Tanto a comissão organizadora, quanto os palestrantes estão de parabéns.&lt;br /&gt;&lt;br /&gt;Na primeira palestra, &lt;a href="http://unplugged.giggio.net/"&gt;Giovanni Bassi&lt;/a&gt; nos apresentou os principais conceitos de &lt;a href="http://domaindrivendesign.org/"&gt;DDD (Domain Driven Design)&lt;/a&gt;. Em seguida, &lt;a href="http://reverb.leandrodaniel.com/"&gt;Leandro Daniel&lt;/a&gt; palestrou sobre o &lt;a href="http://msdn.microsoft.com/en-us/library/cc468366.aspx"&gt;Unit Application Block&lt;/a&gt;, que é um framework para injeção de dependências, presente na Enterprise Library da Microsoft.&lt;br /&gt;&lt;br /&gt;A primeira palestra da parte da tarde foi do &lt;a href="http://www.cavalcante.net/"&gt;Victor Cavalcante&lt;/a&gt;, sobre &lt;a href="http://www.asp.net/mvc/"&gt;Asp .Net MVC&lt;/a&gt;. Nessa palestra houveram algumas discussões interessantes sobre Web Forms X Asp .Net MVC.&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://programandoem.net/"&gt;Juliano Oliveira&lt;/a&gt; falou sobre &lt;a href="https://www.hibernate.org/343.html"&gt;NHibernate&lt;/a&gt;. Aliás, foi o tema que particularmente mais me interessou, pois estou trabalhando bastante com este &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;ORM (Object Relational Mapping)&lt;/a&gt;. Foi bastante enfatizada a questão da produtividade que o NHibernate (e os demais frameworks ORM) trazem no desenvolvimento de um software.&lt;br /&gt;&lt;br /&gt;Após a palestra do Juliano, fizemos um coffee-break que, diga-se de passagem, estava muito bom! Muitos salgados, doces e sucos. Genial!&lt;br /&gt;&lt;br /&gt;Por fim, &lt;a href="http://www.aniche.com.br/blog/"&gt;Mauricio Aniche&lt;/a&gt; palestrou sobre Testes e sua importância dentro do contexto de desenvolvimento de software.&lt;br /&gt;&lt;br /&gt;O evento foi filmado e seu conteúdo será publicado em breve. Assim que tiver disponível, colocarei o link aqui.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2772591731357338249-6170151561447879718?l=renatoduran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://renatoduran.blogspot.com/feeds/6170151561447879718/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://renatoduran.blogspot.com/2009/06/resumo-evento-dnad-2009.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/6170151561447879718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/6170151561447879718'/><link rel='alternate' type='text/html' href='http://renatoduran.blogspot.com/2009/06/resumo-evento-dnad-2009.html' title='Resumo evento DNAD 2009'/><author><name>Renato Duran</name><uri>http://www.blogger.com/profile/11442773657891638830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_FRaNOpqsAnc/Sj_FUFU31zI/AAAAAAAAFJ0/yAFagIfaKf4/S220/DSC02486.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2772591731357338249.post-7212455193251189932</id><published>2009-06-22T10:35:00.000-07:00</published><updated>2009-06-29T14:51:28.630-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Architects'/><title type='text'>Evento DNAD 2009 (.NET Architects Day)</title><content type='html'>Este meu primeiro post no blog é para comunicar que no próximo dia 27/06/2009 (sábado), ocorrerá o primeiro DNAD (.NET Architects Day).&lt;br /&gt;&lt;br /&gt;Este é o primeiro evento promovido pelo grupo de discussão .NET Architects, que tem por objetivo discutir questões de arquitetura e engenharia de software na plataforma .NET.&lt;br /&gt;&lt;br /&gt;O evento conterá palestras com os seguintes temas: DDD (Domain Driven Design), Asp .Net MVC (Model View Controller), Injeção de Dependência com Unity, NHibernate e Testes. As palestras serão ministradas por membros do grupo de discussão.&lt;br /&gt;&lt;br /&gt;Para acessar o site do grupo, se cadastrar e poder participar das discussões e eventos, &lt;a href="http://www.dotnetarchitects.net/"&gt;clique aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O site do evento DNAD 2009 pode ser conferido &lt;a href="http://www.dotnetarchitects.net/page/NET-Architects-Day-2009.aspx"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para os que forem, até lá! Para os que não forem, fiquem atentos às discussões e encontros presenciais promovidos pelo grupo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2772591731357338249-7212455193251189932?l=renatoduran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://renatoduran.blogspot.com/feeds/7212455193251189932/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://renatoduran.blogspot.com/2009/06/evento-dnad-2009-net-architects-day.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/7212455193251189932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2772591731357338249/posts/default/7212455193251189932'/><link rel='alternate' type='text/html' href='http://renatoduran.blogspot.com/2009/06/evento-dnad-2009-net-architects-day.html' title='Evento DNAD 2009 (.NET Architects Day)'/><author><name>Renato Duran</name><uri>http://www.blogger.com/profile/11442773657891638830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_FRaNOpqsAnc/Sj_FUFU31zI/AAAAAAAAFJ0/yAFagIfaKf4/S220/DSC02486.JPG'/></author><thr:total>0</thr:total></entry></feed>
