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 SUnitAgora, com a imagem preparada, você pode executar os testes:
bash$ gst-sunit -I test.im -f test-is-prime.stSe tudo correr bem, nada acontecerá, caso contrário você poderá receber uma mensagem do tipo:
TestIsPrime>>#testSomeOtherValues ..
FAILURE: Assertion failedOnde
TestIsPrime>>#testSomeOtherValues significa que falhou o teste contido no método #testSomeOtherValues da classe TestIsPrime.[]’s
Cacilhας, La Batalema
CC-BY: Os textos deste blog podem ser reporduzidos contanto que sejam informados autor e origem.