2017-02-01 5 views
0

Link to repoТестирование модулей не выполняется, когда тесты выполняются как заданные?

Я обучения Java Модульное тестирование, и написал несколько модульных тестов для некоторых алгоритмов.

При запуске модульных тестов по отдельности, они проходят нормально, но когда я запускаю их как набор, только первый один проходит, и остальные из них не удается.

Например, Test1, Test2 и Test3 выполняются как набор; то Test1 проходит, а Test2 и Test3 терпят неудачу.

Если я прокомментирую код для Test1 и запустите Test2 и Test3; Test2 проходит, и Test3 терпит неудачу.

Когда я запускаю их индивидуально, все они проходят.

Код для алгоритма:

package com.kbajpai.algorithms.ds; 

class Node { 
    private static Node sInstance; 

    static { 
     try { 
      sInstance = new Node(); 
     } catch (Exception e) { 
      throw new RuntimeException("Could not create singleton instance"); 
     } 
    } 

    static Node getInstance() { 
     return sInstance; 
    } 

    private long mData; 
    private int mCount; 
    private Node mLeft; 
    private Node mRight; 

    private Node() { 
     mCount = 0; 
     mLeft = null; 
     mRight = null; 
    } 

    private Node(long data) { 
     mData = data; 
     mLeft = null; 
     mRight = null; 
     mCount = 1; 
    } 

    public String toString() { 
     StringBuilder sb = new StringBuilder(); 

     if (mCount == 0) { 
      return ""; 
     } else { 
      if (mLeft != null) { 
       sb.append(mLeft.toString()).append(","); 
      } 
      sb.append(mData).append(":").append(mCount); 
      if (mRight != null) { 
       sb.append(",").append(mRight.toString()); 
      } 
     } 
     return sb.toString(); 
    } 

    private void insert(long data) { 
     if (mCount == 0) { 
      mData = data; 
      mCount++; 
     } else { 
      if (data == mData) { 
       mCount++; 
      } else if (data > mData) { 
       if (mRight != null) { 
        mRight.insert(data); 
       } else { 
        mRight = new Node(data); 
       } 
      } else { 
       if (mLeft != null) { 
        mLeft.insert(data); 
       } else { 
        mLeft = new Node(data); 
       } 
      } 
     } 
    } 

    String getScores(long[] data) { 
     for (long aData : data) { 
      insert(aData); 
     } 

     return toString(); 
    } 
} 

Код для UnitTests:

package com.kbajpai.algorithms.ds; 

import com.kbajpai.datagen.ds.ScoreStatsData; 
import org.junit.FixMethodOrder; 
import org.junit.Test; 
import org.junit.runners.MethodSorters; 

import static junit.framework.TestCase.assertTrue; 

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class NodeTest { 
    @Test 
    public void test01ScoreStats_Ten() throws Exception { 
     long[] data = ScoreStatsData.getInstance().getNumbers(ScoreStatsData.FILE_TEN); 
     String expected = ScoreStatsData.getInstance().getStats(ScoreStatsData.FILE_TEN_STATS); 

     assertTrue(expected.equals(Node.getInstance().getScores(data))); 
    } 

    @Test 
    public void test02ScoreStats_Hundred() throws Exception { 
     long[] data = ScoreStatsData.getInstance().getNumbers(ScoreStatsData.FILE_HUNDRED); 
     String expected = ScoreStatsData.getInstance().getStats(ScoreStatsData.FILE_HUNDRED_STATS); 

     String actual = Node.getInstance().getScores(data); 
     assertTrue(expected.equals(actual)); 
    } 

    @Test 
    public void test03ScoreStats_Thousand() throws Exception { 
     long[] data = ScoreStatsData.getInstance().getNumbers(ScoreStatsData.FILE_THOUSAND); 
     String expected = ScoreStatsData.getInstance().getStats(ScoreStatsData.FILE_THOUSAND_STATS); 

     String actual = Node.getInstance().getScores(data); 
     assertTrue(expected.equals(actual)); 
    } 

    @Test 
    public void test04ScoreStats_Million() throws Exception { 
     long[] data = ScoreStatsData.getInstance().getNumbers(ScoreStatsData.FILE_MILLION); 
     String expected = ScoreStatsData.getInstance().getStats(ScoreStatsData.FILE_MILLION_STATS); 

     String actual = Node.getInstance().getScores(data); 
     assertTrue(expected.equals(actual)); 
    } 

    @Test 
    public void test05ScoreStats_TenMillion() throws Exception { 
     long[] data = ScoreStatsData.getInstance().getNumbers(ScoreStatsData.FILE_TEN_MILLION); 
     String expected = ScoreStatsData.getInstance().getStats(ScoreStatsData.FILE_TEN_MILLION_STATS); 

     String actual = Node.getInstance().getScores(data); 
     assertTrue(expected.equals(actual)); 
    } 
} 

N.B:

  • Использование Gradle с IntelliJ IDEA
  • Link to repo
+1

Возможно, это потому, что вы используете одиночные игры повсюду. Поскольку «Node» - это Singleton, вы не создаете новый в каждом тестовом сценарии, но снова используете тот же самый из предыдущего теста и который содержит все записи, добавленные до этого, конечно. – Pox

ответ

1

Это вызван использованием Вами static переменных с устойчивым состоянием. Первый тест выполняется, он помещает некоторые данные в одноэлементный объект (ы), и эти данные все еще существуют, когда второй и более поздние тесты выполняются в одной партии.

Чтобы исправить это, вам необходимо либо сбросить синглоты между каждым тестом, либо переписать код, чтобы не использовать шаблон одноэлементного кода.

+0

Изменен ** Узел ** от синглтона до не-одиночного. Я подозревал, что на ** ScoreStatsData **, никогда не думал об Узле. –

Смежные вопросы