XP
Eu não escrevo testes Porque o sistema em que trabalho é legado e não tem testesI don’t write test because I’ve been working in a system that doesn’t have test
0Acho que todas as pessoas que se envolvem em projetos já iniciados já pensaram da mesma maneira do titulo. O raciocínio é simples, você entra num projeto que já estava em desenvolvimento e sua equipe não escreve testes, você como uma pessoa que sabe trabalhar em equipe vai seguir o modelo de desenvolvimento certo? Errado, na maioria dos projetos que conheço nada lhe impede de criar seus testes na maquina local. Qual a sua experiência? Você é realmente proibido de escrever os testes ou está dando desculpas?
Agora, que podemos escrever nossos testes por onde vamos começar? Afinal de contas estamos falando de um sistema que já está sendo desenvolvido desde o ultimo ano, não podemos simplesmente resolver testar o sistema todo certo? Não queremos que os outros desenvolvedores pensem que estamos perdendo tempo. Existem algumas maneiras de começar a escrever testes em sistemas legados,vamos ver algumas.
- Escrever testes sempre que bugs forem descobertos
- Escrever testes para novas funcionalidades
- Escrever testes para entender o funcionamento de um componente
Outra dica relevante para os aventureiros é testar pequenas funcionalidades, é melhor e mais fácil começar testando pequenas coisas (métodos simples) do que componentes completos.
No final de tudo você pode até conseguir mostrar a relevância de testes quando algum membro da sua equipe estiver vendo você programar (isso aconteceu comigo) não consegui evangelizar o cara, mas ao menos ele viu valor nos testes unitários.
A mensagem principal do post é que não devemos diminuir nossos padrões de qualidade por causa do código legado, o código legado pode sempre ser refatorado.
XP, design incremental
1Fala Galera, Como todos já escutaram falar muitas das metodologias ágeis como XP são baseadas na idéia de design incremental. Utilizando o design incremental podemos fornecer software em curtos espaços de tempo (release) e receber a opinião do cliente rapidamente. A grande parte dos livros de metodologias ágeis retrata mais ou menos o que eu disse acima, sendo assim a maioria dos desenvolvedores tem uma visão distorcida do design incremental. Vou mostrar um caso abaixo e duas abordagens diferentes de design incremental.
Caso:
Você está trabalhando em um sistema de cadastro de aplicações de T.I em educação, sendo assim o cliente informa que o mais importante é o cadastro de aplicação. Nós desenvolvedores sabemos que também é necessário trabalhar no controle de acesso. Logo antes do projeto iniciar o cliente informa que na verdade muitos outros cadastros serão desenvolvidos, o sistema vai trabalhar com todo e qualquer tipo de contribuição acadêmica, mas o mais importante continua sendo o cadastro de aplicação de T.I em educação.
Solução1 :
O desenvolvimento começa pelo cadastro de contribuição de T.I em educação, após 1 mês os desenvolvedores possuem este módulo funcionando perfeitamente utilizando técnicas AJAX, validação client-side e controle de modificações de registros. Após isso a equipe trabalha no controle de acesso e fornece apenas o cadastro de usuário com todas as validações necessárias para este tipo de cadastrado e sendo assim o release está terminado e o cliente pode testar a aplicação.
Solução 2 :
A equipe sabe que deve trabalhar no cadastro de aplicação de T.I em educação, para isso desenvolve o cadastro da maneira mais simples possível, o cadastro não possui nenhuma validação e nenhum código Ajax. Simplesmente client-side e Server-side. Após isso um controle de acesso básico é criado apenas como login e senha para que a validação de usuário possa ser habilitada. Nesta versão liberada pela equipe o usuário não tem mensagens legais e nenhum tipo de validação, ele simplesmente pode observar o comportamento seco da aplicação.A solução 2 é duas semanas mais rápida que a solução 1, sendo assim o usuário testa a aplicação e libera seu feedback. O usuário escolhe se é mais importante continuar com a construção simples(esqueleto) ou é o momento certo de aplicar css, realizar validações e habilitar mensagens de erro.
Conclusão:
O ponto comum entre as duas soluções é a vontade de ser ágil, no entanto a solução 2 oferece ainda mais poder de escolha para o cliente, ele que deve determinar se um css é mais importante que mais funcionalidades.Não considero a primeira solução errada, mas acho que a segunda solução tem uma “cara” mais XP. Espero que tenham entendido o ponto deste post, até mais..
Nunit, usando SetUp e teardown
0Fala galera,
Desculpe pela ausência nas ultimas duas semanas, eu gastei grande parte do tempo configurando meu novo PC com o Windows 7 além de estudar para as provas da faculdade.Hoje vamos falar de um assunto que deveria ser debatido mais vezes nos blogs e grupos de discussão, estou falando dos testes unitários.Estou trabalhando num projeto com ASP.NET MVC, como você pode imaginar estou utilizando testes unitários(MVC+Testes unitários = agilidade). Eu estou usando um FakeController que pode ser obtido no blog do Stephen Walther. O código fornecido trabalha com um método SetUp que inicializa o FakeControllerContext no controller que está sendo testado. O método SetUp no NUnit é disparado antes da execução de cada teste, então a cada novo teste um novo FakeControllerContext é criado.Até ai não existe problema, A situação fica complicada quando é necessário compartilhar dados entre testes distintos usando como exemplo o objeto applicationContext.Para resolver este problema você precisa realizar apenas uma pequena alteração no método setUp, as mesmas mudanças explicadas para o SetUp são validas. Vamos olhar um exemplo que deixa a ordem de execução mais clara.
1: [TestFixtureSetUp]
2: public void ClassSetUp()
3: {
4: //A lista de produtos e o gerente de produtos podem ser utilizados para todos os métodos
5: // sendo assim, não é necessário inicializar os membros antes de cada método
6: gerenteProduto = new GerenteProdutos();
7: produtos = new List<Produto>();
8: produtos.Add(new Produto() { Nome = "Iphone", Preco = 300 });
9: produtos.Add(new Produto() { Nome = "PSP", Preco = 180 });
10: produtos.Add(new Produto() { Nome = "VSTS", Preco = 500 });
11:
12:
13:
14: }
15: [SetUp]
16: public void SetUp()
17: {
18: // esta variável deve ser inicializada antes de cada execução - exemplo simples para explicação
19: ssomatorio = 0;
20: }
21:
22: [Test]
23: public void TestSomaValorDosProdutos()
24: {
25: ssomatorio = gerenteProduto.SomaValorDosProdutos(produtos);
26: Assert.AreEqual(980, ssomatorio);
27: }
28:
29: [Test]
30: public void TestSomatorioDosProdutosComTaxas()
31: {
32: ssomatorio = gerenteProduto.SomatorioDosProdutosComTaxas(produtos);
33: Assert.AreEqual(1078, ssomatorio);
34: }
Como você pode ver no exemplo o atributo [TestFixtureSetUp] indica que um método será executado apenas uma vez, durante a inicialização da classe. O atributo [SetUp] indica que um método será executa antes de cada teste.
Espero que você escreva muitos testes e que os atributos SetUp e TearDown sejam úteis.
código fonte completoHello folks,
Sorry for being absent the last two weeks, I spent so much time configuring my new PC and the windows 7 besides being studying for college exams. Today let’s talk about a subject that I think that should be discussed, this post talks about NUnit and some tips for this tool. I’m working on an ASP.NET MVC project, so you can realize that I’m working with Unit tests, if you do you are right. I’ve been using a fakeController context to test the UI layer. You can get this code at Stephen Walther’s blog. In this code you have a setup method that sets the fakecontext in the current controller. The setup method in NUnit is called before each test runs, so each new test uses a new fakeContext, there is no problem in this approach. The situation gets worse when you want to test values stored in the applicationContext, for instance if you need to test the session[“index”], To solve this issue you just have to make a little change in your SetUp method, you should execute it before each class Am I right? So if you agree you just have to change the attribute setup to TestFixtureSetUp, you can make the same change to TearDown. Let’s look an example that show what is the execution order in Nunit.
1: [TestFixtureSetUp]
2: public void ClassSetUp()
3: {
4:
5: //the listOfProduct and the ProductManager are available for all methods, so they don't need
6: //to be initialed before each method execution
7: productManager = new ProductManager();
8: productNames = new List<Product>();
9: productNames.Add(new Product() { Name = "Iphone", Price = 300 });
10: productNames.Add(new Product() { Name = "PSP", Price = 180 });
11: productNames.Add(new Product() { Name = "VSTS", Price = 500 });
12:
13:
14:
15: }
16: [SetUp]
17: public void SetUp()
18: {
19: // the variable sum must be initialed before each method -poor example just to show the execution
20: sum = 0;
21: }
22:
23: [Test]
24: public void TestSumOfAllProducts()
25: {
26: sum = productManager.SumProductsValues(productNames);
27: Assert.AreEqual(980, sum);
28: }
29:
30: [Test]
31: public void TestSumOfAllProductsWithTaxes()
32: {
33: sum = productManager.SumProductsValuesWithTaxes(productNames);
34: Assert.AreEqual(1078, sum);
35: }
You can see in the example that the attribute [TestFixtureSetUp] indicates that a method will execute before the class and the attribute [SetUp] indicates that a method will execute before each test runs. You can do the same thing when working with tearDown.
I hope you write tests and that setUp and TearDown methods help you!
Comentários segundo Code Complete(Parte 2)
0Fala galera, voltando aos comentários segundo Code complete uma questão que o livro faz questão de enfatizar é o estilo do comentário. Como estilo você pode entender a maneira(layout) pelo qual os comentários são feitos. O estilo é importante para que comentar seja uma atividade sustentável no desenvolvimento. Caso o estilo seja inadequado a equipe não vai comentar, ou pior vai deixar os comentários obsoletos.Segue abaixo alguns estilos:
1: /**********************************
2: * Nome: FazAlgumaCoisa
3: * Proposito: Executa uma ação desconhecida
4: * Algoritmo: instancia uma classe x e executa x.FazAlgumaCoisa();
5: *
6: * input: -
7: * output: -
8: *
9: * Histórico de modificação: -
10: *
11: * Autor:Higor Ramos
12: * Data: 10/09/2009
13: * Telefone:(555)222-2255
14: * Cor dos olhos:preto
15: * Tipo sangue: A+
16: * Carro Favorito: Pontiac Aztek
17: * **********************************/
18: public void FazAlgumaCoisa()
19: {
20:
21: }
Não preciso falar que o estilo acima é loucura.. Não existe nada sobre o que está sendo feito
1: /// <summary>
2: /// Função que executa uma execução randômica,
3: /// usada quando é necessário gerar uma sequencia
4: /// desconhecida
5: /// </summary>
6: public void FazAlgumaCoisa()
7: {
8:
9: }
O estilo acima é simples e funcional
Agora que você tem um estilo pode comentar cada variável certo? não! calma.. Um bom início é comentar apenas os membros públicos, pois assim podemos fornecer informações aos usuários da classe e o desenvolvimento não fica “pesado”.
Você pode estar esperando ainda mais dos comentários certo? bem, eles ainda podem oferecer mais! Os comentários possibilitam a geração de documentação automática, para isso basta seguir um padrão(sustentável) e utilizar uma ferramenta como o Ndoc ou SandCastle. Eu gosto bastante da idéia de gerar documentação com os comentários, isso permite que eu crie uma documentação sempre atualizada pois sabemos que quanto mais perto do código a documentação mais chances da mesma estar atualizada.Para os praticantes do XP isso ainda pode ser uma boa prática, pois geramos uma documentação simples e sem perda de tempo.
Conclusão
O code complete deixa bem claro através de pesquisas e links que comentar pode ser uma boa prática. Mais uma vez afirmo que comentar não é desculpa para escrever código ruim. Eu uso comentários para descrever interfaces públicas, gerar documentação, reportar contratos e exceções que podem ser geradas.
Indico a leitura do capitulo sobre comentários do code complete, espero que o post ajude a usar comentários de uma maneira inteligente e funcional.
Testes unitários ASP.NET MVC
0Fala Galera, ontem estava trabalhando em um dos meus projetos pessoais e me encontrei meio perdido, fiquei uns 10 minutos debuggando.. isso porque? bem neste projeto desenvolvemos usando testes unitários, testes são realmente uma ferramente essencial quando estamos falando de refatorações ou até mudanças comportamentais no código.
Eu participo de um grupo de arquitetura que está rolando uma thread sobre testes unitários, acho que a principal pergunta quando falamos de testes é sobre como vamos escrever testes, que comportamentos devemos testar.. Eu já pesquisei bastante sobre testes unitários e achei poucas dicas sobre como escrever testes, depois de um tempo aprendi que este conhecimento é obtido praticando! sim, praticando!
Meu início com os testes unitários não foi facil, eu escrevia testes me baseando no comportamento default esperado com o uso da função testada, acho que no início está é uma maneira eficiente de escrever testes. Depoisde um tempo vi que testes podem fazer mais, podem validar contratos definidos pelos métodos, sendo assim comecei a testar condições comuns que poderiam fazer o método quebrar, foi então que aprendi que testes podem esperar uma exceção.Hoje eu uso testes de maneira muito mais eficiente se comparado quando comecei, e olha que isso tem mais ou menos 1 ano.
Como foi dito no início do post, eu uso testes unitários no meu projeto. Este projeto usa ASP.NET MVC, no MVC é realmente muito mais facil de testar a execução das páginas pois na verdade testamos os controller(no WebForm é melhor usar o selenium). No ASP.NET MVC, é necessário usar objetos Fake para testar os controller de maneira simples, código para fazer é simples e já foi desenvolvido pelo stephenwalther. O código pode ser acessado aqui no meu projeto(Test->WebUI->FakeObjects), nesta pasta estão os arquivos necessários e aqui um exemplo de uso.
É isso galera, espero que a dica seja boa.. uma maneira facil de testar usando asp.net mvc
Refatoração para padrões
0
Fala galera, como mencionei em uns posts anteriores estou comprei o livro refatoração para padrões. Ontem iniciei a leitura e acho que já valeu a pena! Sinceramente esperava um “guia” de refatorações envolvendo padrões, algo similar ao livro de Refatoração do Fowler, mas achei muito mais.
O livro foi escrito pelo Joshua Kerievsky, o cara é evangelista de programação extrema e padrões, sendo assim ele responde uma pergunta que eu vinha me fazendo.
“A programação extrema prega o projeto no momento certo e com a solução mais simples para um dado problema. Os padrões são soluções extensíveis e reutilizáveis e adicionam um pouco de complexidade ao projeto. Como deve ser a utilização de padrões em projetos que seguem o XP?”
A capa do livro responde minha pergunta.
“Refatoração para padrões”
Como?
“O autor prega que durante uma refatoração é um bom momento para inserir ou projetar em direção aos padrões”
Seguindo o método acima conseguimos resolver dois problemas recorrentes no desenvolvimento de software, o primeiro deles o excesso de “projeto” no início do desenvolvimento, este seria o grande investimento em soluções super extensíveis que podem não ser usadas(YAGNI). O segundo problema ainda pode ser pior que o primeiro, esse acontece quando nenhum investimento no projeto foi feito.
O livro é de grande serventia para aqueles que usam XP como metodologia ou ainda todos aqueles que se preocupam com o momento certo de inserir um padrão de projeto no código.
Estimating using points per Hour
0Hi Folks, I spent some time on the weekends thinking about the extreme programming estimation. This year I’ll be the coach of extreme programming process so I have to think as some practices and rules of XP can be used in my dev team.
The first think I thought was how we could estimate our activities. I read in one book that I don’t remember but I think that is the Kent’s book that one good way to estimate is using points. Points are related with hours or as Kent said the XP perfect day. One unit of time which can be used is the perfect day. The perfect day is one working day of a par of developers which everything that they do is code their functionality. For instance it could be a day that the developers don’t answer the phone, don’t change code or don’t do something else.
I think One day is more that I need. So we’ll estimate using hours, I think 2 hours is the minimum quantity of time which one developer can use. Remembering using XP the developers have to write tests and code. And they also have to improve their code that is called refactor.
After we decide what unit of work we will use we have to define how we can estimate; now we now that the minimum unit of time is 1points which has 2 hours of perfect development. But our team has 3 programmers with different levels of knowledge, so how we can estimate? One developer could estimate 3 points and other could estimate 1 point. To solve this problem I think that would better if we estimate using the perfect working hour of the best developer. So if developer one were the best and he said that the functionality would spend 2 points we would have to relate the velocity of the developer 1 and the developer 2. Sample:
2 hours of work of the best developer are equals of 3 hours of the developer 2. So we know that the developers work six hours per day. So we can say that
1 day of development of the best developer has 3 points
1 day of development of the developer 2 has 2 points
So per day they have 5 points of working and using this method both can estimate something without worry about the production’s time of each developer.
This is the first solution that we will use. Any news I tell you.
Tests X documentation
0Hi folks,
Last week I made a post about good practices X "difficulties to develop". In this last post I inquire about documentation in software development. I read one interesting phrase in a software book, this phrase means “Only code reflects code”. Calm down I’m not saying that you can’t write documentation, I’m saying that almost ever documentation I see don’t reflect code.
How I said in my last post I’m thinking in use other ways for make people understand my code. If you read my blog you now I like Extreme programming, and this approach suggests using automated tests. I come up with to use just tests to help people to understand my code.So, and you what do you think? Do you agree?
Xispeiro
0
Fala galera, já mencionei aqui no blog que sou fã da programação extrema. Estou lendo um ‘novo’ livro sobre XP e foi desenvolvido por um brasileiro! O nome do livro é extreme programming . Estou no início do livro, mas estou gostando. A cada leitura sobre o assunto gosto mais do que vejo. Então está ai mais uma opção de leitura. ps: já viu que lá vem post sobre XP.. Grande Abraço..
KISS versus KICK
0- Aplicar padrões complexos cedo demais:Padrões de projeto são excelentes soluções para os problemas encontrados no desenvolvimento,mas será que o padrão é realmente necessário? pode ser que o problema possa ser resolvido de maneira mais simples então porque usar um padrão?
- Criar Arquiteturas em excesso para suportar requisitos futuros.O ego dos desenvolvedores pode falar mais alto que sua razão,Se isso acontecer eles irão construir o “Sistema final”.Ou então criar uma arquitetura paralela visando um possível requisito.Todas essas praticas podem deixar o código complexo visando algo que pode nunca ser usado.M.Fowler criou o principio YAGNI(you ain’t gonna need it – você não vai precisar disso).Fowler diz que a probabilidade de errar é a mesma de acertar,portanto não vale a pena apostar e sacrificar o simplicidade do código.
- Desenvolver uma infra-estrutura complexa: É um erro comum entre as equipes de desenvolvimento utilizarem os recursos iniciais para desenvolver uma infra-estrutura como bibliotecas, frameworks ou um sistema de tratamento de erros. Ao invés disso é mais interessante que as equipes invistam em funcionalidades para o usuário.Neste problema podemos aplicar o YAGNI, dessa maneira vamos criar infra-estrutura quando for realmente necessário