2013-02-05 10 views
5

tworzę zestaw testowy dla mojego Android i mają tę metodę konfiguracjiRunning Android Testy setup() jest wywoływana wielokrotnie

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()); 
    } 

I wtedy te testy, które są tworzone przez narzędzie Pythona od A plik tekstowy

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()); 
      } 
     } 
    } 
} 

i za każdym razem, gdy jeden z nich zostanie nazwany, muzykaDAO zostanie zregenerowana. Jak zatrzymać metodę ustawiania przed nazwaniem

Odpowiedz

5

Nie. Projekt JUnit polega na tym, że setUp() i tearDown() są wykonywane po raz na test. Jeśli chcesz to zrobić na klasy, zrób to w konstruktorze. Tylko upewnij się, że nic nie zmieniasz w klasie. Powodem zrobienia tego raz na test jest upewnienie się, że wszystkie testy zaczynają się od tych samych danych.

+0

Więc chciałbym utworzyć konstruktora klasy testu? –

+0

To jedyna funkcja, o której wiem, że zostanie uruchomiona tylko raz. Lepiej pisać testy tak, jak tego oczekuje JUnit - w końcu będzie to mniej bolesne. –

+0

W porządku po prostu boleśnie wolno wygenerował bazę danych dla każdego testu –

0

Miałem ten sam podstawowy problem. Chcę móc przetestować strukturę mojej bazy danych, więc tworzę ją w metodzie setUp i usuwam ją w tearDown. Korzystanie z konstruktora nie rozwiąże moją potrzebę, aby usunąć raz wszystkie moje testy są wykonywane w bazie danych, więc użyłem pewnej logiki wielowejściowy:

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 
} 

Pola muszą być statyczne od JUnit tworzy nową instancję klasy dla każdy bieg. Magia 1 musiała zostać dodana, ponieważ AndroidTestCase dodaje własny test (testandroidtestcasesetupproperly) do zestawu testów, ale nie liczy się do liczby zwróconej przez countTestCases().

Trochę po brzydkiej stronie, ale udało się.

1

Można użyć adnotacji @BeforeClass i @AfterClass z 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(); 
} 

Uwaga: Musisz zadeklarować te metody, aby static działały poprawnie.