BeyondClick

Desenvolvimento de sistemas além do Click…

Verifique o que estou fazendo, não como!

beginners, developer, and test

A Engenharia de Software tem uma disciplina chamada Verificação e Validação de Software. Sua intenção é responder as perguntas: Estamos contruindo o produto corretamente?(Verificação) e Estamos contruindo o produto correto?(Validação). Textos como: Growing Object-Oriented Software, Guided by Tests, ou o texto do Scott Ambler, que apresenta várias técnicas de teste, The Full Life Cycle Object-Oriented Testing (FLOOT) Method é reforçado que o objetivo dos testes é verificar se o software está se comportando conforme o esperado.

Influenciado por essa linha de pensamento, eu tenho, um certo, nojinho de testes que quebram quando o comportamento não foi alterado, mas a implementação mudou.

Sobre testes que testam implementação

Recentemente, passei pela seguinte situaçõa:

Modelo

Temos 3(três) classes: A, B e C.

Classe A é antecessora de B. Isto é, B herda de A suas propriedades. Classe B tem uma associação com muitos objetos da classe C.

Em Ruby, fica assim:

class A; end

class B < A
  has_many :c
end

class C; end

O Teste

describe B
  it { should have_many :c }
end

A mudança

A associação subiu na hierárquia, indo de B para A.

Antes

class A; end

class B < A
  has_many :c
end

Depois

class A
  has_many :c
end

class B < A; end

Na minha opinião, o teste não tem motivo para quebrar, uma vez que não há mudança no comportamento de B.

Evoluindo a análise, esse matcher, do RSpec, parece não ser feito para esse propósito.

Penso que a utilidade dele, é testar uma gem, por exemplo, que crie uma associação. E, por isso precise verificar se a associação está presente.

Me pergunto: Por que testar a implementação, ao invés do comportamento?

Qual a opinião de vocês sobre o assunto?