Tu pregunta me parece doble. Por un lado, le gustaría comparar dos marcos de prueba, por otro lado, le gustaría implementar pruebas fácilmente, tener afirmaciones naturales, etc.
Ok, en primer lugar, JUnit ha estado jugando con TestNG en términos de funcionalidad, han reducido la brecha con v4, pero no lo suficientemente bien en mi opinión. Cosas como anotaciones y proveedores de datos siguen siendo mucho mejores en TestNG. También son más flexibles en términos de ejecución de prueba, ya que TestNG tiene dependencia de prueba, agrupación y ordenamiento.
JUnit todavía requiere que ciertos métodos antes / después sean estáticos, lo que limita lo que puede hacer antes de ejecutar las pruebas, TestNG nunca tiene este problema.
TBH, la mayoría de las diferencias entre los dos marcos no significan mucho, a menos que se centre en las pruebas de integración / automatización. JUnit, desde mi experiencia, está construido desde cero para las pruebas unitarias y ahora está siendo empujado hacia niveles más altos de pruebas, lo que IMO lo convierte en la herramienta incorrecta para el trabajo. TestNG funciona bien en las pruebas unitarias y, debido a su robusto suministro de datos y excelentes capacidades de ejecución de pruebas, funciona aún mejor a nivel de prueba de integración / automatización.
Ahora, por lo que creo que es un tema separado, cómo escribir pruebas bien estructuradas, legibles y mantenibles. Estoy seguro de que sabe la mayor parte de esto, pero elementos como Factory Pattern , Command Pattern y PageObjects (si sus sitios web de prueba) son vitales, es muy importante tener una capa de abstracción entre lo que está probando (SUT) y cuál es la prueba real es (aserciones de lógica de negocios). Para tener afirmaciones mucho más agradables, puedes usar Hamcrest . Haga uso de la herencia / interfaces javas para reducir la repetición y hacer cumplir lo común.
Casi lo olvidé, también use el patrón Test Data Builder , esto junto con la anotación del proveedor de datos de TestNG es muy útil.