2013-02-05 13 views
5

sto creando una suite di test per la mia applicazione Android e avere questo metodo di configurazioneesecuzione Android test setup() viene chiamato più volte

private static final String TAG_NAME = "TESTING_SUITE"; 
     public TestingMusicDAO musicDAO; 
     public List<Song> songs; 
     public Instrumentation instr; 
     MusicService musicService; 
    @Override 
    public void setUp() throws Exception { 
     instr = this.getInstrumentation(); 
     Log.d(TAG_NAME, "Setting up testing songs"); 
     musicDAO = new TestingMusicDAO(instr.getContext()); 
     musicService = new MusicServiceImpl(musicDAO); 
     musicDAO.getAllSongsFromFile(); 
     songs = musicDAO.getAllSongs(); 
     for(Song song : songs) 
      Log.d(TAG_NAME, song.toString()); 
    } 

E poi questi test che vengono creati da uno strumento di pitone da un file di testo

public void test1() { 
    List<Song> testPlaylist; 
    String testArtist = ("The Beatles"); 
    String actualArtist = ("TheBeatles"); 
    testPlaylist = testingPlaySongsByKeyword(testArtist); 
    if(testPlaylist.isEmpty()){ 
     fail("No Songs Were Found"); 
    } else { 
     for(Song loopsongs : testPlaylist){ 
      if (!(loopsongs.getArtist().equals(actualArtist))){ 
       fail("Song Doesnt Contain the artist" + actualArtist + "... Contains ->" + loopsongs.getArtist()); 
      } 
     } 
    } 
} 

e ogni volta che uno di questi viene chiamato, la musica viene rigenerata. Come posso impedire che il metodo di installazione venga chiamato

risposta

5

Non è così. Il design di JUnit è che setUp() e tearDown() vengono eseguiti una volta per prova. Se vuoi farlo per classe, fallo nel costruttore. Assicurati di non modificare nulla all'interno delle classi. La ragione per farlo una volta per test è assicurarsi che tutti i test inizino con gli stessi dati.

+0

Quindi vorrei creare un costruttore della classe di test? –

+0

THAT è l'unica funzione che so che sarebbe stata eseguita una sola volta. Stai meglio scrivendo i test come si aspetta jUnit- alla fine sarà meno doloroso. –

+0

Va bene, solo lentamente, generato un database per ciascun test –

0

Ho avuto lo stesso problema di base. Voglio essere in grado di testare la struttura del mio database, quindi lo creo nel metodo setUp e lo elimini nel tearDown. Utilizzando il costruttore non risolverebbe il mio bisogno di eliminare il database vengono eseguite una volta che tutti i miei test, quindi ho usato un po 'di logica da rientro:

static int testsExecutedSoFar = 0; 
static boolean isFirstRun = true; 

@Override 
protected void setUp() throws Exception { 
    if(isFirstRun){ 
     createDb(); 
     isFirstRun = false; 
    }  
} 

@Override 
protected void tearDown() throws Exception{ 
    testsExecutedSoFar++; 
    if (testsExecutedSoFar == totalNumberOfTestCases()) 
     deleteDb();  
} 

private int totalNumberOfTestCases() { 
    return countTestCases()+1; //have to add one for testandroidtestcasesetupproperly added by AndroidTestCase 
} 

I campi devono essere statico poiché JUnit crea una nuova istanza della classe per ogni corsa. La magia 1 doveva essere aggiunta poiché AndroidTestCase aggiunge il proprio test (testandroidtestcasesetroproply) alla suite di test ma non conta al numero restituito da countTestCases().

Un po 'brutto, ma ha funzionato.

1

È possibile utilizzare le annotazioni @BeforeClass e @AfterClass da JUnit.

@BeforeClass 
public static void test_setUp_Once(){ 
    // Code which you want to be executed only once 
    createDb(); 
} 

@AfterClass 
public static void test_tearDown_Once(){ 
    // Code which you want to be executed only once 
    deleteDb(); 
} 

Nota: è necessario dichiarare questi metodi static per funzionare correttamente.

Problemi correlati