6

我正在为我的 android 应用程序创建一个测试套件并拥有这个 setUp 方法

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

然后让这些测试由 python 工具从文本文件中创建

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 都会重新生成。如何停止调用 setup 方法

4

3 回答 3

4

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

于 2013-02-05T21:37:24.680 回答
3

您可以使用@BeforeClass@AfterClass来自 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();
}

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

于 2016-04-06T10:19:52.317 回答
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 会为每次运行创建一个新的类实例。魔术 1 必须添加,因为 AndroidTestCase 将它自己的测试 (testandroidtestcasesetupproperly) 添加到测试套件,但它不计入 countTestCases() 返回的数字。

有点丑陋的一面,但它成功了。

于 2014-01-18T16:08:51.630 回答