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