Archive

Tag Archives: Tests

If you have ever been in an Agile project, or something that looks like it, you should have heard about the concept of spikes.

For those who haven’t, spikes are the agile response to reducing technical risk in a project. In case you are not sure how to build something or fear that some piece of functionality might take much more than expected, and you have to gain more confidence about it, it’s time to run a spike. Usually timeboxed, spikes are technical investigations with the objective of clarifying a certain aspect of the project.

In my current team, we are developing a few tools that are quite specific to our context and were not sure on how to solve a few issues, so we have been quite frequently playing spike cards.

This is all not new and I’m sure most of you have done that before. If you did the way I used to do, you would write a spike card, something as “investigate technology X for problem Y“, would spend 2 days doing it and would have a response for it in your head once you were finished.

In our current context, team members were rotating quite quickly, so we were worried that any knowledge we would get from spikes could have been lost if it was just…let’s say.. in our heads.

Not wanting jut to write the findings up, as we first thought about doing, we decided to tackle the problem with the golden hammer of agile development: tests!

So, instead of writing tests to decide how we should write our code, we started writing tests to state the assumptions we had about the things we were investigating, being able to verify them (or not) and have an executable documentation to show to other people.

For example, here is some code we wrote to investigate how ActiveRecord would work in different situations:

it 'should execute specific migration' do
  CreateProducts.migrate(:up)
  table_exists?("products", @db_name).should be_true
  table_exists?("items", @db_name).should be_false
 end
it 'should execute migrations to a specific version' do
  ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths, 02) { |migration| true }
  table_exists?("products", @db_name).should be_true
  table_exists?("items", @db_name).should be_true
  table_exists?("customers", @db_name).should be_false
 end
it 'should not execute following migrations if one of them fails' do
  begin
    ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths, nil) { |migration| true }
  rescue StandardError => e
      puts "Error: #{e.inspect}"
  end
  table_exists?("invalid", @db_name).should be_true
  m = ActiveRecord::Migrator.new(:up, ActiveRecord::Migrator.migrations_paths, nil)
  m.current_version.should == 3
  table_exists?("products", @db_name).should be_true
  table_exists?("items", @db_name).should be_true
  table_exists?("customers", @db_name).should be_true
  table_exists?("another_table", @db_name).should be_false
 end

We have used this technique just a few times and I won’t guarantee it will always be the best option, but so far the result for us is having code that can be executed, demonstrated and easily extended by others, making it easier to transfer knowledge between our team.

Para os que não sabem, atualmente eu estou em Bangalore, na Índia, participando do treinamento que a Thoughtworks oferece aos seus novos graduates, a ThoughtWorks University.

Bom, ontem, depois de assistir a uma sessão opcional do curso, apresentada pela Liz Keogh, eu finalmente posso dizer que entendo o que é Behaviour Driven Development, o famoso BDD. Essa é uma das buzzwords do mundo do software que circula ha algum tempo, mas devo confessar que nunca consegui parar para verificar o que era, e sempre imaginei que fosse mais uma metodologia ágil, tipo o FDD.

Acontece que o Behaviour Driven Development é algo talvez até mais simples, mas nao por isso menos interessante :-) .

BDD nada mais é do que uma “otimização” do desenvolvimento orientado a testes, que tem como sua principal característica, e ainda mais importante, benefício, o fato de codificar as aplicações em uma linguagem voltada para o que é mais importante e muitas vezes esquecido, o resultado que a aplicação tem para o cliente.

Olhando por aí, uma justificativa interessante que eu achei foi a seguinte, no blog do Dan North:

As a final thought, while I was thinking about this I realised the term “behaviour-driven” contrasts with “test-driven” in a similar way. My goal as a developer is to deliver a system that behaves in a particular way. Whether or not it has tests is an interesting metric, but not the core purpose. “Test-driven” development will cause me to have lots of tests, but it won’t necessarily get me nearer the goal of delivering business value through software. So you can use goal-oriented vocabulary in your development process as well as your code to help maintain perspective on what you are trying to achieve.

Já que todos (todos?) concordamos que entregar valor de negócio para o que cliente é o que realmente importa no desenvolvimento de uma aplicação, porque não desenvolver essa aplicação de acordo com a linguagem do cliente, de forma que até ele possa entender (mesmo que em um nível básico) o que a aplicação está fazendo, e para que serve aquele código.

É claro que não é só esse o benefício, já que muitos de vcs devem estar pensando: para que diabos o meu cliente que ver o código-fonte do software?

Mas desenvolver código-fonte de acordo com a linguagem do negócio também auxilia o desenvolvedor a entender e discutir as funcionalidades que ele está desenvolvendo, e realmente saber qual é o objetivo de ele sentar na frente do computador 8 horas por dia, o que invariavelmente resulta em código de melhor qualidade.

Comentários?

Um abraço.

Ha alguns dias (ou seriam semanas?) atras, foi enviada uma noticia para uma das listas de e-mail das quais eu participo, sobre a criacao de uma fabrica de testes no Parana. So essa noticia ja eh impactante para mim (como foi para os outros membros da lista), mas alem disso ha algum tempo vem exisitindo uma tendencia de criacao de empresas especializadas em testes, tanto que eu acho interessante comentar isso por aqui.

Primeiramente, eu acredito que pelo conteudo de um meu outro post, vcs ja devem saber qual vai ser a minha opiniao a respeito da existencia de equipes especializadas em teste de software. Primeiro a gente tinha analistas especializados, agora a gente tem testadores especializados, e inclusive empresas responsaveis soh por desenvolver testes, as “fabricas” (argh) de testes. Qual sera o proximo passo? Especialistas em testes unitarios? Especialistas em analise de software usando diagramas de sequencia UML?

Pra comecar, o proprio fato de existirem especialistas em cada area, cada um tratando do seu nicho, soh traz maleficios para uma equipe, se eh que se pode chamar de equipe um grupo de pessoas onde cada uma trabalha em uma tarefa separada sem existir um foco no resultado final, que eh software rodando para o cliente. Alias, o final dessa frase eh que faz toda a diferenca, na minha opiniao. Conforme foi escrito pelo Goldratt no livro “A Meta”, “Diga-me como serei medido que eu te direi como me comportarei“. Essa afirmacao resume tudo, pq eh claro que se existir um cargo que eh medido pelos seus diagramas, teremos como resultado diagramas extremamente requintados, e se tivermos um que for medido pelos testes que gera, o que teremos? Testes, testes e mais testes, necessarios ou nao.

Mas esse eh soh o primeiro dos problemas da fabrica de testes. Eu considero particularmente a realizacao de testes umas das principais contribuicoes do movimento agil para o desenvolvimento de software, principalmente quando se falar em TDD. Mas essa validade acaba e comeca a contar pontos negativos quando os testes nao sao mais utilizados para guiar nem para verificar o desenvolvimento de software, e sim para serem criados apos o desenvolvimento e darem uma “cara” de seriedade para o codigo sendo desenvolvido.

Alias, acho que esse eh o principal motivo da existencia das equipes de testes. A impressao de seriedade que a empresa quer passar para o cliente, dizendo que seu software eh testado por uma equipe especializada, sendo que essa equipe certificou que o software esta funcionando corretamente. No meu ponto de vista, a palavra “certificou” diz tudo sobre as intencoes que existem por tras disso :-). Primeiro vem o CMM, depois o MpsBr, e agora os softwares saem certificados por testadores especializados.

Quero deixar claro aqui que eu nao sou contra a existencia de especialistas, e muito menos contra a existencia de testes. Acho que os especialistas sao necessarios, e todo mundo tem um assunto no qual tem mais interesse e torna-se por isso mais experiente, e tambem acho que todas equipes precisam de especialistas . O que eu nao concordo eh com a existencia de especialistas que fazem somente uma coisa, e nao estao inseridos dentro de uma equipe multidisciplinar que conta com diversos especialistas em diversas areas. Em relacao aos testes, conforme eu falei antes, acho eles vitais quando inseridos dentro do ciclo de desenvolvimento do software, na forma de testes unitarios, de aceitacao e de qualquer outro tipo que se quiser fazer. O que eu nao entendo eh desenvolver milhares de linhas de codigo e passar para uma empresa testar, e dai depois de tres semanas voltar um relatorio com milhares de erros, quando os desenvolvedores que trabalharam naquele codigo ja estao preocupados com outra coisa.

Eh tao dificil assim fazer o mais simples?

Follow

Get every new post delivered to your Inbox.

Join 835 other followers