sábado, 3 de abril de 2010

SUnit

Smalltalk Smalltalk possui um ótimo arcabouço de teste unitário chamado SUnit – Smalltalk Unit Test Suite. Porém sua documentação é um tanto fraca.

Segue aqui um pequeno tutorial de uso do SUnit. Veja que não é necessariamente a forma correta de usá-lo. Usaremos GNU Smalltalk.

Imagine que queremos implementar um método em Integer que retorna se o número é primo ou não. Podemos primeiro criar um test case para verificar seu funcionamento.

Para isso, crie um arquivo test-is-prime.st e defina a seguinte classe:
TestCase subclass: #TestIsPrime
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Unit Test'
!


A classe TestIsPrime é filha de TestCase e, para nosso fim atual, não precisará de atributos.

Precisaremos de um método de classe que execute os testes, para que não precisemos criar uma TestSuite:
!TestIsPrime class methodsFor: 'running'!

run
(self testSelectors) do: [ :test |
self run: test.
].
!
!


Podemos agora criar a categoria accessing para os testes:
!TestIsPrime methodsFor: 'accessing'!


O primeiro teste pode ser para determinar se números negativos retornam um erro quando se tenta determinar sua primalidade:
testNegative
self should: [ -1 isPrime ] raise: ArithmeticError.
!


Não esqueça de indentar!
[update 2010-04-04]
A indentação aqui tem objetivo exclusivo de manter a clareza do código.
[/update]


O método #should:raise: executa um bloco e asserta que uma exceção será levantada, neste caso ArithmeticError.

Podemos fazer o mesmo para zero:
testZero
self should: [ 0 isPrime ] raise: ArithmeticError.
!


Já para o número um, é preciso assertar que ele não é primo, ou seja, retorne falso:
testOne
self shouldnt: [ 1 isPrime ].
!


O método #shouldnt: executa um bloco esperando pelo retorno falso.

Mas quando chegarmos ao dois, ele é primo:
testTwo
self should: [ 2 isPrime ].
!


O método #should: executa um bloco esperando pelo retorno verdadeiro.

Você pode fazer isso indefinidamente se quiser:
testSomeOtherValues
self should: [ 3 isPrime ].
self shouldnt: [ 4 isPrime ].
self should: [ 5 isPrime ].
self shouldnt: [ 6 isPrime ].
self should: [ 7 isPrime ].
self shouldnt: [ 8 isPrime ].
self shouldnt: [ 9 isPrime ].
self shouldnt: [ 10 isPrime ].
self should: [ 11 isPrime ].
!


Quando cançar, encerre a lista de métodos da categoria com a linha:
!


Ou, se preferir ser mais explícito:
!!


No final, adicione uma linha para executar os testes:
TestIsPrime run.


Para rodar os testes, copie a imagem contendo seu código para, por exemplo, test.im e acrescente o SUnit com o seguinte comando:
bash$ gst-load -I test.im SUnit


Agora, com a imagem preparada, você pode executar os testes:
bash$ gst-sunit -I test.im -f test-is-prime.st


Se tudo correr bem, nada acontecerá, caso contrário você poderá receber uma mensagem do tipo:
TestIsPrime>>#testSomeOtherValues ..
FAILURE: Assertion failed


Onde TestIsPrime>>#testSomeOtherValues significa que falhou o teste contido no método #testSomeOtherValues da classe TestIsPrime.

[]’s
Cacilhας, La Batalema
blog comments powered by Disqus