2009-03-20 4 views
6

Sto cercando di offuscare il nostro codice di app Web Java all'interno del nostro script di build Ant, ma sto incontrando problemi relativi al test delle unità. Sto offuscando il codice subito dopo che è stato compilato, prima che venga cancellato e prima che vengano eseguiti i test delle unità.Potete testare il codice offuscato dall'Unità?

Tuttavia, se offro il mio codice di produzione e non il mio codice di test, tutti i test falliscono perché stanno cercando di chiamare metodi che non esistono più perché sono stati rinominati dall'offfuscator. Posso marcare certi metodi per non offuscare in modo che possano essere usati da sistemi esterni come la nostra suite di test, ma poiché stiamo girando per una copertura di prova di unità elevata dovremo marcare tutti i metodi come non-confondibili.

Se offuscare le classi di test così, mi imbatto in due problemi:

1: Le classi di produzione e le classi di test ottenere fuse nella stessa directory di output e non sono in grado di escludere le classi di test dal produzione file .jar

2: non riesco a eseguire il mio normale chiamata batchtest Ant:

<batchtest todir="${basedir}/reports"> 
     <fileset dir="${basedir}/components/common/build-zkm"> 
      <include name="**/*Test.class"/> 
     </fileset> 
</batchtest> 

perché l'obfuscator ha cambiato i nomi dei test.

Potrei semplicemente eseguire l'obfuscator sui file .war/.ear risultanti, ma voglio che i nostri test unitari vengano eseguiti contro il codice modificato per eliminare eventuali errori causati dall'offfuscator.

Attualmente sto lavorando con Zelix KlassMaster, ma sono ancora in fase di valutazione, quindi sarei aperto ad altre opzioni se funzionassero meglio.

risposta

3

si può dire che per eseguire l'obfuscator tale da refactors efficacemente il codice compresi i riferimenti dei test (vale a dire quando un nome di produzione modifiche, il codice di prova cambia il suo riferimento), ma non per nascondere le prove stesse (cioè non cambiare i nomi delle classi di test o dei loro metodi)? Data la precedente esperienza con gli offuscatori mi aspetterei che funzioni.

Così, per esempio, si supponga che avevamo fonte unobfuscated di:

public class ProductionCode 
{ 
    public void productionMethod() {} 
} 

public class ProductionCodeTest 
{ 
    public void testProductionMethod() 
    { 
     new ProductionCode().productionMethod(); 
    } 
} 

Si desidera impostare le opzioni del obfuscator per renderlo efficace:

public class Xyzzy 
{ 
    public void ababa() {} 
} 

public class ProductionCodeTest 
{ 
    public void testProductionMethod() 
    { 
     new Xyzzy(). ababa(); 
    } 
} 

In questo modo il "run i test "Le attività di Ant dovrebbero essere in grado di rimanere invariate, poiché l'API dei test non è cambiata, ma solo l'implementazione dei metodi.

+0

Ho trovato un modo in KlassMaster per farlo aggiungendo "exclude *. * Test;" nella mia sceneggiatura e ora funzionano. Dato che devo ancora eseguire i test attraverso l'obfuscator, si stanno ancora mescolando con le classi di produzione nella directory di output. Sto verificando le opzioni di configurazione per quello –

0

L'obfuscator non deve modificare le chiamate pubbliche. Sembra che tu debba eseguire gli altri test prima dell'offuscamento perché controllano le funzionalità interne che non dovrebbero cambiare dopo l'offuscamento.

Quindi, se questo è il caso, perché non eseguire solo i test che chiamano funzionalità pubbliche? Tutto quello che devi fare è avere una classe separata con quelle chiamate e ricostruirla usando il codice offuscato e quindi eseguire quella DLL.

+1

Anche se abbiamo metodi "pubblici", non abbiamo metodi che affrontano esternamente. Penso che dovremmo offuscare metodi pubblici solo interni proprio come faremmo con metodi privati. Vorrei testare tutto dopo l'offuscamento perché ci sono dei bug che può introdurre, specialmente intorno alla riflessione. –

+0

@Nathan Voxland Credo che quella funzionalità debba essere testata anche tramite l'API pubblica - in altre parole non importa come lo fai solo che funzioni –

+0

@Nathan - considera l'uso di dp4j.com, inietterà la riflessione API necessaria per testare metodi privati ​​in fase di compilazione. Quindi l'obfuscator dovrebbe offuscare il tuo semplice accesso ai metodi java private nei test, e quindi dp4j rifletterà gli accessi offuscati. NB: questo funziona solo quando sai in fase di compilazione i metodi che vuoi riflettere, cioè nel tuo caso. – simpatico

7

Io uso yguard (è gratuito, motivo per cui lo menziono).

Dovresti essere in grado di dire all'offuscatore di non offuscare certe cose (guardando here sembra possibile).

Come altri hanno già detto, non offuscare le prove, ma offuscare il resto.

Tuttavia, vorrei suggerire che si fa la seguente:

  1. compilare
  2. jar i file non-offuscato (se lo si desidera)
  3. prova i file non-offuscato
  4. se passano i test poi offuscano i file offuscati
  5. test i file offuscati

Sarà più lento, ma se i test falliscono nel passaggio 3 sarà più facile da risolvere (potenzialmente) e se i test falliscono a 5 allora sai che c'è un problema con l'offuscamento non il tuo codice sorgente.

+0

Buon punto con il test a due passaggi. –

+0

Grazie per il collegamento yGuard. –