2013-02-05 44 views
5

tôi đang tạo ra một bộ kiểm tra cho các ứng dụng Android của tôi và có phương pháp thiết lập nàyChạy Android thử nghiệm thiết lập() được gọi nhiều lần

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

Và sau đó có những thử nghiệm đó được tạo ra bởi một công cụ trăn từ một tệp văn bản

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

và mỗi lần một trong số này được gọi là bản nhạcDAO được tạo lại. Làm cách nào tôi có thể dừng phương thức thiết lập để được gọi là

Trả lời

5

Bạn không. Thiết kế của JUnit là setUp()tearDown() được thực hiện một lần cho mỗi thử nghiệm. Nếu bạn muốn nó được thực hiện trên mỗi lớp, hãy thực hiện nó trong hàm tạo. Chỉ cần chắc chắn rằng bạn không thay đổi bất cứ điều gì bên trong các lớp học. Lý do để thực hiện nó một lần cho mỗi bài kiểm tra là đảm bảo tất cả các bài kiểm tra bắt đầu với cùng một dữ liệu.

+0

Vì vậy, tôi sẽ tạo một hàm tạo của lớp thử nghiệm? –

+0

Đó là hàm duy nhất tôi biết về điều đó sẽ chỉ chạy một lần. Tốt hơn là bạn nên viết các bài kiểm tra theo cách mà jUnit mong đợi, mặc dù nó sẽ ít đau đớn hơn khi kết thúc. –

+0

Alright chỉ làm chậm cơ sở dữ liệu cho mỗi thử nghiệm –

0

Tôi có cùng một vấn đề cơ bản. Tôi muốn có thể kiểm tra cấu trúc cơ sở dữ liệu của mình, vì vậy tôi tạo nó trong phương thức setUp và xóa nó trong tearDown. Sử dụng các nhà xây dựng sẽ không giải quyết nhu cầu của tôi để xóa cơ sở dữ liệu một lần tất cả các bài kiểm tra của tôi được thực hiện, vì vậy tôi đã sử dụng một số logic reentrant:

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 
} 

Các trường phải tĩnh kể từ JUnit tạo ra một thể hiện mới của lớp cho mỗi lần chạy. Phép thuật 1 đã được thêm vào kể từ khi AndroidTestCase thêm thử nghiệm riêng của nó (testandroidtestcasesetupproperly) vào bộ thử nghiệm nhưng nó không được tính vào số được trả về bởi countTestCases().

Một chút về mặt xấu xí, nhưng nó đã thực hiện thủ thuật.

1

Bạn có thể sử dụng các chú thích @BeforeClass@AfterClass từ 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(); 
} 

Lưu ý: Bạn cần khai báo các phương thức này static để hoạt động bình thường.

Các vấn đề liên quan