O teste de afirmação única viola o DRY?
Não, mas promove violação.
Dito isto, um bom design orientado a objetos tende a sair pela janela para testes de unidade - principalmente por um bom motivo. É mais importante que os testes de unidade sejam isolados um do outro para que o teste possa ser interrogado isoladamente e, se necessário, corrigido com confiança para que você não faça outros testes. Basicamente, a correção e a legibilidade do teste são mais importantes que seu tamanho ou capacidade de manutenção.
Francamente, nunca fui fã da regra de uma afirmação por teste pelos motivos que você descreve: isso leva a muitos códigos clichê que são difíceis de ler, fáceis de enganar e difíceis de corrigir se você refatorar (o que leva você a refatorar menos).
Se uma função deve retornar uma lista de "foo" e "bar" para uma determinada entrada, mas em qualquer ordem, é perfeitamente bom usar dois assertivos para verificar se ambos estão no conjunto de resultados. O problema é quando um único teste verifica duas entradas ou dois efeitos colaterais e você não sabe qual das duas causou a falha.
Eu vejo isso como uma variação do Princípio da Responsabilidade Única: deve haver apenas uma coisa que pode causar uma falha no teste e, em um mundo ideal, essa mudança deve apenas quebrar um teste.
Mas no final, é uma troca. É mais provável que você gaste mais tempo mantendo todo o código colado da cópia ou passará mais tempo procurando as causas-raiz quando os testes podem ser interrompidos por várias fontes. Contanto que você escreva alguns testes, provavelmente não importa muito. Apesar do meu desprezo pelos testes de afirmação única, tenho tendência a errar ao lado de mais testes. Sua milhagem pode variar.