Cleaning database after testing on C#

Hi there.

Some times you need to test your queries to know that you are bring the correct data.

But it’s so boring to setup the data on the database and then clean-up everything else, then do it over and over again.

There must be a simpler way to do it! We may create the data on the test and delete it again.

What if the data is automatically removed?

In this case, I’m using Entity Framework and Microsoft’s Test Unit tools.

We can achieve it using transactions. We’ll be using .Net’s TransactionScope do do it.

First, we create a TransactionalTest class.



To test this class, I created a test case and then setup a Ordered Test list.


It worked for my needs (:

Delegate and Decorators

After reading Object on Rails and some blog posts (like Thoughtbot’s one) I started playing with the Ruby’s delegate lib.

Let’s suppose I want to decorate an object, to wrap some instance methods. An simple inheritance from SimpleDelegator would to it

But now, let’s suppose I want to decorate and object and it’s class, to wrap some instance methods AND some class methods.

Like this pseudo code (It won’t work)

#UPDATE

Now, I got some tested code, deployed as gem if you want.

Check it out https://github.com/bltavares/delegate-class

I also found it useful to wrap ActiveRecord models and use the rails methods that require it to be an instance of ActievRecord, like #form_for

After playing with DelegateClass, I ended up with this <https://gist.github.com/1680411> code.

It works but I still don’t know if there is a real reason to use it.

But I’m happily playing with delegates. Maybe it is useful to someone (:

Já conhece o Eufori?

Final de ano, correria e muito estudo.

Fiquei animado de escrever no blog e queria compartilhar com a internet uma das minhas atuais alegrias.

Eu sempre adorei esportes! Karate, bicicleta, skate, patins, judo, capoeira, parkour, natação e moto são umas das coisas que mais gosto(ei) de fazer.

Mas eu tinha(tenho) um grande problema de saber onde esta acontecendo passeios, competições, campeonatos e tudo mais. Diversas vezes tive amigos saindo para competir e só fiquei sabendo quando voltaram.

Como sempre estive em contato com organizadores, principalmente de moto, sei como é difícil ter um lugar para divulgar, em que a mídia está saturada de futebol o tempo todo.

O Eufori <http://www.eufori.com.br> foi a solução que encontrei para esses meus problemas. Tem sido bastante interessante fazer tudo isso e saber que posso ajudar mais apaixonados por esportes.

Fica o convite pessoal de usar o Eufori para todos que gostam de esportes, seja como atleta ou organizador, ou até mesmo para marcar o campeonato de StarCraftII na casa do amigo.

Toda sugestão é bem vinda (:

Atualizações no Cabinet

Olá pessoal,

Tem bastante tempo que não falo nada sobre o Cabinet.

Esse final de ano foi muito corrido e como o projeto é mais para brincadeira, não mexi muito nele.

No final do ano, dei uma refatorada no código e implementei algumas coisinhas de pouco em pouco. Dê uma olhada no commit <https://github.com/bltavares/CabiNet/commit/944692d23c3a7255a17702642c20710e520c3fe5>

Um dos professores pediu um trabalho simples, de um app de gerenciamento de estoque e que achei que ficou com um código simples. Resolvi colocar ela como exemplo do Cabinet. <https://github.com/bltavares/CabiNet/commit/944692d23c3a7255a17702642c20710e520c3fe5>

Não sei o futuro do Cabinet, agora que me formei no colégio técnico.

Quem sabe não acontece um outro release, depois de passar nos vestibulares?

Abraços (:

BDD vs TDD

No ultimo #DevDojo, apareceu uma discussão interessante entre as diferenças entro o BDD e o TDD.

A melhor técnica para entender melhor algo é realizando ela na pratica. Decidi aplicar as duas técnicas para resolver o mesmo problema.

O problema

O problema é bem simples.

Quero um objeto Calculadora que some, subtraia, multiplique e divida dois números. A única peculiaridade é que a divisão deve retornar números decimais e que lance uma exception na divisão por 0 e não Infinito, como ocorre com divisão de decimais.

O resultado pode ser visto aqui <https://github.com/bltavares/BDD-vs-TDD>.

As semelhanças

Ambas as técnicas geram confiança no desenvolvimento. O código se torna algo saudável de manter e de desenvolver novas funcionalidades.

Uma coisa interessante é a implementação feita pelo minitest do bdd.

Uma expectativa é um assert renomeado.

Então, eles são iguais?

As diferenças

Se vocês seguirem os commits de cada branch, com os testes e os códigos lado a lado, verá que a maior diferença entre as duas técnicas está na organização e expressividade.

Desenvolvendo em bdd, senti que entendia melhor o motivo de um método existir e o que ele deveria fazer. A forma que você se aproxima do problema e suas soluções parecem ficar mais claras.

O código se torna mais organizado, mostrando o comportamento dos objetos e não apenas um teste dele sobre uma condição específica.

O tdd é mais rápido, mas me senti em dúvida sobre como deveria nomear metodos de acordo com o nome do teste. Ele não tornou claro para mim qual a especificação do objeto eu estava demonstrando.

As ferramentas

Utilizei o testunit para o TDD e o RSpec para o bdd. Vou apontar algumas características que afetam os frames e não as técnicas.

O testunit possui implementado tanto um framework de bdd quanto de tdd, permitindo que o dev escolha qual ele irá usar.

Uma coisa MUITO bacana dele é que os testes rodam de forma aleatória cada vez que você testa. Isso garante que nenhum dos casos esteja afetando outro caso.

Ele é bastante rápido, mas a saida de erro dele não foi muito interessante.

Código

Teste errado

Instalando um novo tipo de output, consegui melhorar um pouco a saida de erro

Com a nova saida, e tudo ok.

Com o rspec, acho bem mais espressivo a saida em formato de documentação, além de que, com um describe apenas é possivel setar o metodo subject como a instancia da classe sobre teste.

Ao descrever uma classe, o metodo subject instancia ela por padrão para você


Código

Teste errado

Teste ok

Conclusão

Apesar que os testes em tdd sejam bem mais rápidos, acho que vale a pena utilizar o bdd.

A melhor expressividade que essa aproximação para testes oferece ajuda a pensasr no problema real e não apenas no código, facilitando a comunicação de requerimentos entre programadores-stackholders, e inclusive programadores-programadores.

As duas formas são muito boas e bastante parecidas, cabendo ao dev escolher qual encaixa melhor ao seu estilo.

Mas o mais importante que trago desta experiência é: TEST IT MOTHER FOCkA!

1.8.0 rc

E foi meu aniversário esse sábado. E como todo #dev de verdade, tive que ir programar.

Antes de sair para a festa decidi fazer uma pequena brincadeirinha. Estava levando o laptop para passar clips em um projetor no meio do salão e pensei em deixar quem não poderia ir participar da festa.

Comecei a codar um pequeno app em python para mostrar na tela twittes para mim com a hashtag #festa. Fail total!

Não estava acustumado com as novas bibliotecas do python3 e acabei usando ruby¹.

Queria agradecer todas as pessoas que puderam ir, ou que queriam ir, que eu conheci e papeie nesses ultimos 18 anos.

Obrigado galerinha do mau! (:

¹

How I’ve setup Git for continuous deployment on a PHP project

I’ve been amazed with git’s powers lately. After using svn, bzr and hg, I can understand why there is so much talking about git.

Let me talk about this php project. It’s been built by 3 dev and a designer, versioned under SVN.

WHAT?! Is it about GIT or SVN?

That’s one of the reasons I’ve been amazed with Git. I got a few problems with the integration, so there are some tips:

  • From time to time run ‘git fsck’ to check your expository’s health
  • Some times, ‘git commit —amend’ require you to rebase your project before commiting it to SVN.
  • Never use ‘git checkout —force’! I lost half of my code doing it ):
  • Listen to what Git says. Don’t skip the messages about what is happening. I broke all my object database once trying to pull changes from the SVN without reading the messages.

Let me introduce the problems that I solved with Git and RSync

After a lot of local testing, the team gave me the instruction to deploy the project every day at 5:00pm on the outside testing environment.

So, for 3 days at 5:00pm a had task to upload everything using FTP, change the configuration files and check the system. All those .snv folders, images and stuff were such slow.

It was boring!

I decided to give a try to Git-Svn and set up a deploy branch to let the configurations ready to deploy. The .svn folders were gone and the problem was solved, right?

No, it was slow still ):

On the other day, the project migrated to another host. I was now on beta stage. And now the server has ssh. I got a smile on my face (:

RSync: It’s really fast!

With the deploy branch set up with the correct configurations, some continuous merges and a small bash script, the continuous deployment was ready to go.

The rule: Master is good and always can be deployed.

The steps:

  1. ssh-copy-id user@host #we don’t want that boring password prompt
  2. write deploy.sh¹
  3. run it and be happy

Now, every change made on the project are almost instantly on production.

You should give a try to those “native” tools on *nix some times (:

¹

_CanHaz: ICanHaz for Underscore

Today I started a new project and wanted to use a js templater.

I’m already using Underscore.js and Jquery,  and I liked how ICanHaz.js handles the templates.

So I decided to create the _CanHaz.js, giving you the ability to handle templates like ICanHaz.js but using the Underscore template method.

You should check the documentation for the template method.

Improvements are welcome. (:

CoderWall Konami Code Bookmarklet

I really liked the new homepage of Cowerwall. And I wanted to make something funny on it.

So I’ve develop a small konami code easter egg to use on the new homepage of Cowerwall.

Just drag it to your bookmark bar and click when you visit coder wall:

CoderWall Bookmarklet

Enjoy (:

UPDATE: Now, Coderwall has a konami code bundled, so to activate this hack you should perform konamicode + Enter (:

CabiNet 0.0.1 Released

E depois de uma semana bem punk e sem possibilidade nenhuma de codar, consegui pegar o código dos servidores da escola.

Nessa versão temos:

  • Generate CREATE Query
  • Persistência dos campos que você definir
  • MaxLength e NotNull validations
  • Relationships (simples ainda, nada de queries complexas ainda)
  • Gerador das classes
  • e é claro, o CRUD

Quem quiser colaborar e até mesmo testar, fique a vontade