La tua domanda mi sembra duplice. Da un lato ti piacerebbe confrontare due framework di test, dall'altro ti piacerebbe implementare i test facilmente, avere affermazioni naturali, ecc ...
Ok, in primo luogo JUnit ha giocato a recupero con TestNG in termini di funzionalità, ha colmato il divario rispetto alla v4, ma a mio avviso non abbastanza bene. Cose come annotazioni e dataprovider sono ancora molto meglio in TestNG. Inoltre, sono più flessibili in termini di esecuzione dei test, poiché TestNG ha dipendenze, raggruppamenti e ordini dei test.
JUnit richiede ancora che determinati metodi prima / dopo siano statici, il che limita ciò che è possibile fare prima dell'esecuzione dei test, TestNG non ha mai questo problema.
TBH, principalmente le differenze tra i due framework non significano molto, a meno che non ti concentri sui test di integrazione / automazione. JUnit dalla mia esperienza è costruito da zero per i test unitari e ora viene spinto verso livelli più alti di test, che IMO lo rende lo strumento sbagliato per il lavoro. TestNG si comporta bene nei test unitari e, grazie alla sua solida fornitura di dati e alle eccellenti capacità di esecuzione dei test, funziona ancora meglio a livello di test di integrazione / automazione.
Ora, per quello che credo sia un problema separato, come scrivere test ben strutturati, leggibili e mantenibili. La maggior parte di questo sono sicuro che lo sai, ma cose come Factory Pattern , Command Pattern e PageObjects (se i tuoi siti Web di test) sono vitali, è molto importante avere uno strato di astrazione tra ciò che il tuo test (SUT) e ciò che il test effettivo è (affermazioni della logica aziendale). Per avere delle affermazioni molto più belle, puoi usare Hamcrest . Utilizzare l'ereditarietà / le interfacce java per ridurre la ripetizione e applicare la comunanza.
Quasi dimenticato, utilizzare anche il modello Test Data Builder , questo accoppiato con l'annotazione del provider di dati di TestNG è molto utile.