Ваш вопрос мне кажется сложенным. С одной стороны, вы хотели бы сравнить две тестовые среды, с другой стороны, вы хотели бы легко реализовывать тесты, иметь естественные утверждения и т. Д ...
Хорошо, во-первых, JUnit играла в догонялки с TestNG с точки зрения функциональности, они преодолели разрыв с V4, но, на мой взгляд, недостаточно хорошо. Такие вещи, как аннотации и поставщики данных, все еще намного лучше в TestNG. Кроме того, они более гибки с точки зрения выполнения теста, поскольку TestNG имеет тестовую зависимость, группировку и упорядочение.
JUnit по-прежнему требует, чтобы определенные методы до / после были статичными, что ограничивает возможности, которые вы можете делать до запуска тестов, у TestNG такой проблемы никогда не было.
TBH, в основном различия между двумя средами ничего не значат, если только вы не сосредоточены на тестировании интеграции / автоматизации. JUnit, исходя из моего опыта, создан с нуля для модульного тестирования и в настоящее время движется к более высоким уровням тестирования, что делает IMO неподходящим инструментом для работы. TestNG хорошо справляется с модульным тестированием и благодаря надежному предоставлению данных и отличным возможностям выполнения тестов работает еще лучше на уровне тестирования интеграции / автоматизации.
Теперь о том, что я считаю, является отдельной проблемой, как писать хорошо структурированные, читаемые и поддерживаемые тесты. Я уверен, что большинство из этого вы знаете, но такие вещи, как Фабричный шаблон , Командный шаблон и PageObjects (если вы тестируете сайты) очень важны, это очень важно иметь уровень абстракции между тем, что вы тестируете (SUT) и что такое реальный тест (утверждения бизнес-логики). Чтобы иметь более хорошие утверждения, вы можете использовать Hamcrest . Используйте наследование / интерфейсы javas, чтобы уменьшить количество повторений и обеспечить общность.
Почти забыл, также используйте Test Data Builder Pattern , это в сочетании с аннотацией поставщика данных TestNG очень полезно.