No momento em que escrevi esta resposta, percebi que não se trata de testes, mas de documentação. Você deve ler primeiro o manifesto ágil :
[Valorizamos] o software de trabalho em vez de uma documentação abrangente
Portanto, você deve tornar suas especificações executáveis, ou seja, escrevê-las como um conjunto de testes totalmente automatizado.
Escrever especificações baseadas em histórias é uma boa ideia?
Sim, sim, é. É chamado de "desenvolvimento orientado a comportamento" ou "especificação por exemplo". Em rubi, há um ótimo pepino para ferramentas que ajuda muito nisso.
O problema agora é que, por haver tantas histórias, não fica claro de imediato para qualquer parte do sistema em que as histórias se relacionam.
Por que você quer que fique claro? Quero dizer, você realmente precisa de uma matriz de rastreabilidade "teste / código"? A vantagem de escrever testes como uma especificação é que você não precisa de uma rastreabilidade "requisitos / testes" separada, porque os testes se tornam requisitos. Para fins de teste de integração, você deve tratar seu software como um todo, não como partes separadas.
Você pode precisar de uma ferramenta de cobertura para verificar se existem módulos "mortos", partes do seu sistema não cobertas pelos testes de especificação. Mas você realmente não deve se importar com a especificação a que esse código específico corresponde. Deve ser vice-versa: de uma especificação específica, você deve saber qual parte do sistema corresponde a ela. Você não deve se preocupar com alguma duplicação em suas especificações. E se você aplicar um princípio DRY ao seu código, haverá dezenas de especificações executando o mesmo código.
Funciona no momento dos desenvolvedores, a cada sprint os desenvolvedores recebem apenas uma especificação descrevendo o que precisam fazer e as mudanças que precisam fazer. Mas, em termos de manutenção dessa lista de histórias e de teste, está começando a ficar realmente difícil rastrear bugs e, em geral, apenas mantendo as especificações, porque uma parte da funcionalidade na tela pode ter sido documentada em vários lugares diferentes devido ao fato de ser dividido por história.
Não é incomum que centenas de testes de integração sejam interrompidos por uma pequena alteração em um módulo crítico. É aí que entra o teste de unidade.
Você deve estruturar seus testes como tal para poder saber se um teste específico cobre um requisito de alto nível ou apenas um detalhe sutil. Nesse último caso, você deve separar esse teste do seu conjunto de testes de integração. O objetivo do teste de unidade é localizar erros. Portanto, se você introduzir um bug, haverá uma e apenas uma falha no teste.
Escrevemos as histórias da maneira errada?
Eu acho que você só precisa organizar suas histórias em épicos por usuário, por exemplo, "Cliente", "Assistente" ou por recursos / telas / fluxos de trabalho ("Compra", "Reembolso").
E, novamente, os testes de especificação não substituem os testes de unidade. Consulte Mais informação