Salve, Felipe!
Sobre organizar/agrupar seu código, existem vários padrões descritos, como o Atomic Design, mas eu nunca vi um consenso. Mas, uma vez que existe um padrão, acho super bacana seguí-lo. E isso tende a variar entre as empresas.
Já em relação a testes unitários, temos de ter um equilíbro entre DRY (Don't repeat yourself) e DAMP (Descriptive And Meaningful Phrases) .
DAMP (Descriptive And Meaningful Phrases)
Para manter o código, primeiro você precisa entender o código. Para entendê-lo, é preciso lê-lo. Considere por um momento quanto tempo você gasta lendo o código... é muito. No dia a dia, nós lemos muito código.
O DAMP aumenta a capacidade de manutenção reduzindo o tempo necessário para ler e entender o código (quanto mais camadas de abstração, mais complexo fica).
A ideia aqui é promover a legibilidade do código.
DRY (Não se repita)
A remoção da duplicação garante que cada conceito no sistema tenha uma única representação autorizada no código.
Uma mudança em um único conceito de negócio resulta em uma única mudança no código.
O DRY aumenta a capacidade de manutenção isolando a mudança (risco) apenas para as partes do sistema que devem ser alteradas.
Este artigo (em inglês) temos o Dave Thomas explicando que o conceito do DRY não tem essa intenção de "evitar código duplicado", é um conceito muito mais abrangente e é uma leitura muito bacana. Recomendo.
Então, por que a duplicação é mais aceitável em testes?
Os testes geralmente contêm código duplicado porque estamos testando a mesma coisa várias vezes, apenas com valores de entrada ou alguma configuração diferentes. No entanto, ao contrário do código de produção, essa duplicação geralmente é isolada apenas para os cenários dentro de um único arquivo de teste. Por causa disso, a duplicação é mínima e óbvia, o que significa que representa menos risco para o projeto do que outros tipos de repetição de código.
Além disso, a remoção desse tipo de duplicação reduz a legibilidade dos testes. Os detalhes que foram duplicados anteriormente em cada teste agora estão abstraídos em algum novo método ou classe. Para obter a imagem completa do teste, agora você precisa juntar todas essas peças.
Portanto, duplicar código de teste geralmente traz menos riscos e promove a legibilidade, isso é considerada aceitável.
Como princípio, prefira DRY no código de produção, prefira DAMP no código de teste. Embora ambos sejam igualmente importantes, vale a pena pesar onde utilizar cada um.
Espero que tenha ajudado!
Bons estudos e parabéns pela excelente pergunta ;)
Vida longa e próspera.