Pra mim, sistema sem testes já baixa a qualidade do mesmo em 50%
Dificuldade em achar bugs, manutenção complicada e “medo” de refactoring são uns dos motivos pelo qual eu penso assim.
Só que é difícil implantar testes numa equipe sem conhecimento do mesmo, principalmente se você quiser usar TDD: É uma maneira diferente de você codificar, “ver o mundo” da programação com outros olhos.
Pra um sistema ficar bem testado e automatizado, o que eu uso e faço geralmente é:
1- Testes unitários com TestNG
2- Testes de integração também com o TestNG, mas isso vai depender do sistema, pois algumas vezes é necessário usar mocks para os seus requests ou até mesmo fazer testes a partir da camada mais alta, logo abaixo da camada de view (Se for JSF começa-se pelos Backing Beans, se for Struts nos seus Actions etc).
3- Testes de carga com o JMeter (isso, honestamente, raramento eu faço)
4- Cobertura nos testes unitários com o Emma (no eclipse eu uso o EclEmma)
5- Pra finalizar, testes funcionais com o Selenium é legal também.
Você também pode utilizar o Selenium direto nos seus testes de integração, pois ele tem uma API que você coloca no seu código Java e ele faz todos o processo gravado no código! Em um pseudo-código-aportuguesado, ficaria assim:
public void test_login {
selenium.abrirTela("login.jsp");
selenium.adicionarCampo("txtNomeUsuario", "Leozin");
selenium.adicionarCampo("txtSenha", "******"); //pegadinha do malandro!
selenium.efetuarPost();
Assert.equals(selenium.getPaginaAtual(), "home.jsp");
}
Dicas: Deixando um servidor de Integração Continua rodando, (e também seguindo o processo/metodologia de Integração Continua), fica até mais legal pra trabalhar com esses testes pois como há builds frequentes, é rápido ver se algo quebrou ou não a cada commit/push no seu svn/git.