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()あり、テストごとに1回tearDown()行われます。クラスごとに実行する場合は、コンストラクターで実行します。クラス内で何も変更しないようにしてください。テストごとに 1 回実行する理由は、すべてのテストが同じデータで開始されるようにするためです。

于 2013-02-05T21:37:24.680 に答える
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() によって返される数にはカウントされません。

少し醜い面がありますが、うまくいきました。

于 2014-01-18T16:08:51.630 に答える