Utilizzo di variabili "finali" nei test Java Selenium

Oct 24 2020

Questa potrebbe essere considerata una domanda di programmazione, ma riguarda il codice di test, scritto in Selenium più Java, quindi penso che questo sia il sito pertinente per pubblicare questo.

Quando visualizzo i test di altre persone online, a volte trovo elementi web aggiunti a una variabile dichiarata come final:

final WebElement element = driver.findElement(By.id("element-id"));

Immagino che ciò consenta una migliore atomizzazione e isolamento dei test e ha senso.

Dato che non ho avuto problemi a non dichiarare le variabili finali, ci sono altri motivi per farlo?

Risposte

6 corsiKa Oct 25 2020 at 01:28

Questa è una pratica di programmazione standard intesa a ridurre i bug nel codice. Come aggiornamento, il modificatore finale impedisce che una variabile primitiva o una variabile di riferimento a un oggetto venga riassegnata. Pertanto, le primitive sono immutabili e un riferimento può sempre puntare all'oggetto a cui puntava inizialmente. (Ciò non influisce sui metodi che è possibile chiamare, anche quelli che potrebbero mutare lo stato interno dell'oggetto.)

Ogni IDE che ho usato negli ultimi 10 anni ha avuto la capacità di ispezionare il codice in un metodo e applicare in modo deterministico il modificatore finale a una variabile locale che non viene riassegnata dopo che è stata inizializzata. L'idea alla base di questo è che se hai scritto del codice e lo hai salvato (che esegue azioni di salvataggio che applicano il modificatore finale) probabilmente non intendi modificare di nuovo quella variabile. Se intendi modificare quella variabile, puoi semplicemente rimuovere il modificatore. In questa logica, ogni variabile è definitiva finché qualcuno non decide attivamente che non dovrebbe esserlo.

Come per tutto ciò che riguarda la programmazione, ci sono argomenti contrari a questo. Uno è che ingombra il codice, aumentando il carico di lavoro su un programmatore che cerca di leggere il codice per mantenerlo. Anche se questa non è stata la mia esperienza personale con questo modificatore, so che è stato con altre pratiche per me, quindi non voglio ignorarlo completamente semplicemente perché non si applica a me. L'altro è che se la usi solo su quelli che decidi dovrebbero essere definitivi (invece di coprire il codice con il finale) stai inviando un messaggio ad altri sviluppatori che questa variabile non dovrebbe mai cambiare - che dovrebbe risaltare tra le altre variabili come una che non dovresti tentare di modificare.

Il commento di PDHide sulla limitazione dell'uso dell'esecuzione parallela è correlato: le variabili finali possono essere utilizzate nei lambda e nell'elaborazione parallela mentre altre variabili non lo sono. Ora credo (è passato un po 'di tempo) il compilatore Java permetterà di utilizzare una variabile che è effettivamente finale anche se non è esplicitamente finale ma poi se qualcuno decide di modificare la variabile prima dell'esecuzione parallela, il compilatore non può più dire che è effettivamente definitivo e quindi non è più idoneo per l'elaborazione parallela e genererà un errore di compilazione. Si risolve facilmente, ma può comunque essere fastidioso.

Alla fine della giornata, vorrai avere una breve conversazione con il tuo team per decidere cosa funzionerà meglio per te. La parola chiave non ha alcun impatto sull'effettiva esecuzione o efficienza ed è tutta una questione di produttività del programmatore.