È possibile utilizzare JUnit per testare questo progetto?

0

Al momento ho una situazione interessante che si verifica con il mio codice, e dopo aver violato quello che si è rivelato un vicolo cieco nelle ultime due settimane, sto qui chiedendo a quelli più intelligenti di me di educarmi su dove sono andato storto e come posso eseguire correttamente l'attività prevista.

Impostazione:

Abbiamo un set di classi che svolgono varie attività, ma lo fanno su un oggetto che passano intorno. Le azioni vengono eseguite su questo oggetto in ogni classe prima di essere infine elaborate e quindi inviate al livello di visualizzazione per l'elaborazione front-end. Questa è una breve descrizione di come funziona il processo.

Una raccolta di utenti viene inviata tramite il modulo front-end La raccolta di utenti viene elaborata in un oggetto con vari parametri impostati all'interno. Le classi multiple con vari metodi che elaborano l'oggetto appena creato vengono eseguite una alla volta. In ogni classe, l'oggetto ha vari metodi che eseguono attività su determinate azioni, come formule, convalida, ecc. l'oggetto viene quindi inviato al front-end per la visualizzazione dell'oggetto elaborato.

L'attività:

Sto tentando di creare test JUnit per automatizzare i test per questo gruppo di classi. Questo è come ho configurato

testConfiguration - Invece di inviare un modulo, creo una raccolta di utenti in varie configurazioni in base a ciò che dobbiamo fare per testare

testMain - Questa è la classe "root". Richiede una configurazione dalla classe testConfiguration necessaria per l'esecuzione di test corrente, la crea in un oggetto con vari parametri basati sugli utenti passati e quindi passata nelle varie classi per l'ulteriore elaborazione

testClassesProcess - varie classi che prendono l'oggetto elaborato da testMain, eseguono varie azioni su di esso (principalmente metodi di tipo matematico) e quindi restituiscono.

I problemi:

Ran in pochi davvero. Il primo è che non è possibile passare i parametri alle funzioni nei test di JUnit, poiché verrà visualizzato initializeErrors. Anche l'annotazione @Autowired nelle classi in fase di test ha generato un errore con NullPointerException , si scopre che se inserisci le classi testate dalla suite JUnit, e non riesco a risolvere la variabile che verrebbe utilizzata senza alcun problema quando eseguita tramite l'applicazione normalmente.

Attualmente utilizziamo Java 1.7 con Hibernate, Spring e JUnit per contribuire a dare una visuale del nostro stack.

Quindi mi chiedo se, dopo aver descritto la mia situazione, sto cercando di fare in modo che JUnit metta un piolo rotondo in un buco quadrato, se sto usando JUnit errato, o se c'è una soluzione migliore che potrei usare per testare questa configurazione.

EDIT: Le mie scuse se questo sembra vago. È un problema sul posto di lavoro, quindi cerco di non rivelare nulla di proprietario e di farlo in modo che altri possano identificarlo.

    
posta canadiancreed 09.12.2014 - 20:36
fonte

1 risposta

4

Capisco che stiate lasciando alcuni dettagli a causa della natura proprietaria del progetto. Questa risposta è la mia opinione su ciò che sta accadendo in base a come comprendo la domanda. Per favore lascia un commento se sono fuori base qui e modifico di conseguenza.

Penso che potresti fraintendere come usare JUnit in progetti complessi.

Ogni test deve stare in piedi da solo: non vi è alcun motivo per passare i parametri in test, poiché ogni test deve essere trattato concettualmente come una funzione main . Se hai davvero bisogno di fare qualcosa prima di un test, puoi annotare i metodi da eseguire prima / dopo ogni test o tutti i test ( @Before , @After , @BeforeClass , @AfterClass ). In pratica, ho trovato tali metodi utili solo per i test che si collegano a risorse remote come un database. Mentre in generale questa è una cattiva idea, ci sono alcuni casi specifici in cui ha senso. Ad esempio, quando si scrive un driver in cui si sta testando realmente il livello JDBC stesso.

Questo mi porta al punto successivo: in generale, un test unit riguarda un pezzo di codice specifico, non l'applicazione nel suo complesso o altri componenti. Per fare ciò, devi applicare i tuoi principi SOLID per spezzare il software in componenti più piccoli che sono vagamente accoppiato ad altri componenti.

Una volta che un oggetto ha una sola responsabilità, puoi facilmente prendere in giro i componenti su cui fa affidamento. In base alla ripartizione delle varie classi, dovresti considerare l'utilizzo di interfacce per definire ciascun componente. In questo modo è possibile avere le classi "reali" e di simulazione che implementano l'interfaccia e funzionano correttamente. Ciò ha anche il vantaggio di aiutare a garantire che le classi stiano utilizzando l'interfaccia pubblica (anziché i membri del pacchetto-privato) che facilitano ulteriormente l'accoppiamento.

Sembra che tu abbia molte interdipendenze che rendono difficile "rompere" un pezzo di dimensioni morso da testare. Penso che sia necessario dare un'occhiata a suddividere il progetto in modo da poter iniettare gli oggetti di prova di simulazione che consentono di mettere a fuoco un singolo test su un singolo componente che non dovrebbe richiedere ulteriori informazioni da eseguire.

    
risposta data 09.12.2014 - 22:37
fonte

Leggi altre domande sui tag