AnonimoVeneziano
25-01-2008, 13:11
Ho deciso di esercitarmi un po' stamattina prima di studiare (:muro:) in questo Test-driven programming che tanto è affascinante quanto sconosciuto alle mie meningi :D
Così ho deciso di creare l'infausta "NullSound" che manca per risolvere il bug del crash col device audio occupato.
Ecco cos'ho fatto.
Come fek mi ha insegnato ho creato due test paletto che segnano la fine del task (ammetto di averli scopiazzati un po' su quelli della NullAudio) :
TestEnvironment.java
public void testSoundCreationFromNullAudio()
{
AudioFactory audioFactory = new FailingAudioFactoryMock();
environment.createAudio(audioFactory);
Sound sound = environment.getAudio().createSound("diamond");
assertTrue(sound.isNull());
}
public void testSoundCreationFromNonNullAudio()
{
AudioFactory audioFactory = new MockAudioFactory();
environment.createAudio(audioFactory);
Sound sound = environment.getAudio().createSound("diamond");
assertFalse(sound.isNull());
}
Dopo aver constatato che fallissero (cum sommo gaudio :D ) ho proseguito cercando di pensare al design di quello che volevo fare (riprendendo un po' anche quella che è la NullAudio) e così ho creato un nuovo file di test per i test sulla NullSound aggiungendo questi test :
public class TestNullSound extends TestCase
{
public void testNullSound()
{
Sound sound = new NullSound();
assertTrue(sound.isNull());
}
public void testNullSoundPlayed()
{
Sound sound = new NullSound();
assertFalse(sound.wasPlayed());
sound.play();
assertTrue(sound.wasPlayed());
}
public void testNullSoundPlayedReset()
{
Sound sound = new NullSound();
sound.play();
sound.reset();
assertFalse(sound.wasPlayed());
}
public void testNullSoundPlayedFreeMemoryReset()
{
Sound sound = new NullSound();
sound.play();
sound.freeMemory();
assertFalse(sound.wasPlayed());
}
public void testReturnNullSoundNameNull()
{
Sound sound = new NullSound();
sound.getName().equals("null");
}
}
Ovviamente i test li ho aggiunti uno per uno e ho cercato di farli passare nel modo più semplice possibile (mi rendo conto che però questa cosa funzioni molto meglio in Pair, perchè se la stessa persona fa sia tests che implementazione un po' rimane influenzata ...)
Il risultato di tutta questa trafila di tests , oltre all'aggiunta della "isNull()" in Sound.java, OpenALSound.java, MockSound.java, è stata la creazione di una classe NullSound.java che ha questo codice :
public class NullSound implements Sound
{
private boolean wasPlayed = false;
public void freeMemory()
{
wasPlayed = false;
}
public Object getName()
{
return "null";
}
public void play()
{
wasPlayed = true;
}
public void reset()
{
wasPlayed = false;
}
public boolean wasPlayed()
{
return wasPlayed;
}
public boolean isNull()
{
return true;
}
}
Ho cercato , attraverso di i test, di creare un design per la NullSound che emulasse il più possibile il comportamento di una Sound non-null (mantenendo la variabile boolean wasPlayed per esempio), non so se questo è giusto come concetto, però almeno l'ho fatto attraverso i tests :D.
Alla fine ho scommentato i due tests finali che avevo creato e lanciandoli ho constatato che non fallivano ... questo immagino significhi che ho fatto qualcosa di ridondante , vero? :mbe:
Il risultato finale è comunque che il programma non crasha più.
Non ho committato, aspetto i commenti di chi è più esperto con il test-driven che mi dica se ho fatto cavolate :D
Ciao
Così ho deciso di creare l'infausta "NullSound" che manca per risolvere il bug del crash col device audio occupato.
Ecco cos'ho fatto.
Come fek mi ha insegnato ho creato due test paletto che segnano la fine del task (ammetto di averli scopiazzati un po' su quelli della NullAudio) :
TestEnvironment.java
public void testSoundCreationFromNullAudio()
{
AudioFactory audioFactory = new FailingAudioFactoryMock();
environment.createAudio(audioFactory);
Sound sound = environment.getAudio().createSound("diamond");
assertTrue(sound.isNull());
}
public void testSoundCreationFromNonNullAudio()
{
AudioFactory audioFactory = new MockAudioFactory();
environment.createAudio(audioFactory);
Sound sound = environment.getAudio().createSound("diamond");
assertFalse(sound.isNull());
}
Dopo aver constatato che fallissero (cum sommo gaudio :D ) ho proseguito cercando di pensare al design di quello che volevo fare (riprendendo un po' anche quella che è la NullAudio) e così ho creato un nuovo file di test per i test sulla NullSound aggiungendo questi test :
public class TestNullSound extends TestCase
{
public void testNullSound()
{
Sound sound = new NullSound();
assertTrue(sound.isNull());
}
public void testNullSoundPlayed()
{
Sound sound = new NullSound();
assertFalse(sound.wasPlayed());
sound.play();
assertTrue(sound.wasPlayed());
}
public void testNullSoundPlayedReset()
{
Sound sound = new NullSound();
sound.play();
sound.reset();
assertFalse(sound.wasPlayed());
}
public void testNullSoundPlayedFreeMemoryReset()
{
Sound sound = new NullSound();
sound.play();
sound.freeMemory();
assertFalse(sound.wasPlayed());
}
public void testReturnNullSoundNameNull()
{
Sound sound = new NullSound();
sound.getName().equals("null");
}
}
Ovviamente i test li ho aggiunti uno per uno e ho cercato di farli passare nel modo più semplice possibile (mi rendo conto che però questa cosa funzioni molto meglio in Pair, perchè se la stessa persona fa sia tests che implementazione un po' rimane influenzata ...)
Il risultato di tutta questa trafila di tests , oltre all'aggiunta della "isNull()" in Sound.java, OpenALSound.java, MockSound.java, è stata la creazione di una classe NullSound.java che ha questo codice :
public class NullSound implements Sound
{
private boolean wasPlayed = false;
public void freeMemory()
{
wasPlayed = false;
}
public Object getName()
{
return "null";
}
public void play()
{
wasPlayed = true;
}
public void reset()
{
wasPlayed = false;
}
public boolean wasPlayed()
{
return wasPlayed;
}
public boolean isNull()
{
return true;
}
}
Ho cercato , attraverso di i test, di creare un design per la NullSound che emulasse il più possibile il comportamento di una Sound non-null (mantenendo la variabile boolean wasPlayed per esempio), non so se questo è giusto come concetto, però almeno l'ho fatto attraverso i tests :D.
Alla fine ho scommentato i due tests finali che avevo creato e lanciandoli ho constatato che non fallivano ... questo immagino significhi che ho fatto qualcosa di ridondante , vero? :mbe:
Il risultato finale è comunque che il programma non crasha più.
Non ho committato, aspetto i commenti di chi è più esperto con il test-driven che mi dica se ho fatto cavolate :D
Ciao