Test dell'unità duplicazione del codice?

2

Come posso evitare la duplicazione del codice nei test unitari?

Usando Java e JUnit supponiamo di avere qualcosa di simile a questo:

public interface Arithmetic<T> {
    public T add(T a, T b);
    public T sub(T a, T b);
}

public void IntegerArithmetic<Integer> {
    //
}

public void DoubleArithmetic<Double> {
    //
}

E la classe di test:

public class TestArith {

private Arithmetic<Integer> arith;

@Before
public void init() {
    Arithmetic<Integer> arith = new IntegerArithmetic();
    Integer term1 = 4;
    Integer term2 = 3;
}

@Test
public void testAdd() {
     assertEquals(7, arith.add(term1, term2));
}

@Test
public void testAdd() {
     assertEquals(1, arith.sub(term1, term2));
}
}

Il problema è che la classe di test per la classe DoubleArithmetic dovrebbe apparire esattamente la stessa; l'unica differenza è in @Before init () in cui viene eseguita l'inizializzazione del tipo concreto. Come si può evitare questa duplicazione del codice?

    
posta m3th0dman 10.08.2012 - 16:44
fonte

2 risposte

5

Dichiarare la classe TestArith come astratta. Quindi creare due classi, TestIntegerArith e TestDoubleArith estendendo TestArith. Nel TestArith creare un metodo astratto getArithmetic, che restituisce un'istanza di Aritmetica. Quindi modifica i test per ottenere l'istanza Arithmetic chiamando getArithmetic.

Quindi sembrerebbe questo:

public abstract class TestArith<T> {
  protected abstract Arithmetic<T> getArithmetic();

  @Test
  public void testAdd() {
      assertEquals(7, getArithmetic().add(term1, term2));
  }
}
    
risposta data 10.08.2012 - 17:19
fonte
1

Questo non è sempre così.

Ovviamente, i test per 10 / 4 o 1 << 31 * 5 daranno risultati diversi in IntegerArithmetic e DoubleArithmetic .

Se c'è un grande sottoinsieme in cui IntegerArithmetic e DoubleArithmetic dovrebbero comportarsi allo stesso modo, prova a istanziare una classe basata su un'interfaccia comune, ad es. Arithmetic<java.lang.Number> .

Lasciami elaborare un po '.

Esistono due luoghi in cui può verificarsi la duplicazione del codice: l'inizializzazione, che differisce solo dalla classe sottoposta a test e dai casi di test.

I test comuni possono entrare in un caso comune che può essere sottoclassificato e ogni% di co_de di sottoclasse istanzia la propria istanza concreta di .setUp() da testare.

I test specifici per classe hanno i loro casi di test.

Il codice di inizializzazione può essere deduplicato usando una classe base parametrizzata da cui nasceranno istanze concrete di Arithmetic , come proposto da @Skillwired.

    
risposta data 10.08.2012 - 16:52
fonte

Leggi altre domande sui tag