2013-02-05 54 views
5

我创建一个测试套件,我的Android应用程序,并使用这种设置方法运行Android的测试设置()方法被调用多次

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

然后具有由蟒蛇工具从创建这些测试文本文件

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

并且每当其中一个被称为musicDAO被重新生成时。我怎样才能阻止设置方法被调用

回答

5

你不知道。 JUnit的设计是setUp()tearDown()完成每个测试一次。如果您希望每个类都完成,请在构造函数中完成。只要确保你不会改变课堂内的任何东西。每次测试一次的原因是要确保所有测试都以相同的数据开始。

+0

所以我会创建一个测试类的构造函数? –

+0

这是我知道的唯一功能将只运行一次。你最好是按照jUnit期望的方式编写测试,但最终会变得不那么痛苦。 –

+0

好吧只是痛苦地缓慢地为每个测试生成一个数据库 –

0

我有同样的基本问题。我希望能够测试我的数据库的结构,所以我在setUp方法中创建它并在tearDown中将其删除。使用构造不会解决我需要删除一旦所有我的测试中执行的数据库,所以我用一些折返的逻辑:

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 
} 

的字段必须是静态的,因为JUnit的创建该类的一个新实例每次运行。由于AndroidTestCase将它自己的测试(testandroidtestcasesetupproperly)添加到测试套件中,所以必须添加魔术1,但它不计入countTestCases()返回的数字。

有点丑陋的一面,但它伎俩。

1

您可以使用JUnit的@BeforeClass@AfterClass注释。

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

注意:您需要先声明这些方法static才能正常工作。

相关问题