É tudo apenas software, então, com esforço suficiente, é possível ;-). Em uma linguagem que suporta uma maneira decente de fazer análise de código, ela também deve ser viável.
Quanto à utilidade, acho que alguma automação em torno do teste unitário é útil para um determinado nível, dependendo de como ele é implementado. Você precisa ter clareza sobre aonde deseja ir com antecedência e estar bem ciente das limitações desse tipo de ferramental.
No entanto, o fluxo que você descreve tem uma enorme limitação, porque o código que está sendo testado conduz o teste. Isso significa que um erro no raciocínio ao desenvolver o código provavelmente acabará no teste também. O resultado final provavelmente será um teste que basicamente confirma que o código "faz o que ele faz" em vez de confirmar que ele faz o que deve fazer. Isso na verdade não é completamente inútil porque pode ser usado mais tarde para verificar se o código ainda faz o que ele fez anteriormente, mas não é um teste funcional e você não deve considerar seu código testado com base em tal teste. (Você ainda pode pegar alguns bugs superficiais, como manuseio de nulos, etc.) Não é inútil, mas não pode substituir um teste 'real'. Se isso significa que você ainda terá que criar o teste 'real', pode não valer a pena o esforço.
Você pode seguir rotas ligeiramente diferentes com isso. A primeira é apenas lançar dados na API para ver onde ela quebra, talvez depois de definir algumas asserções genéricas sobre o código. Isso é basicamente teste do Fuzz
O outro seria gerar os testes, mas sem as asserções, basicamente ignorando a etapa 10. Portanto, termine com um 'questionário de API' onde suas ferramentas determinam casos de teste úteis e solicita ao testador a resposta esperada dada uma chamada específica . Dessa forma você está realmente testando novamente. Ainda não está completo, se você esquecer um cenário funcional em seu código, a ferramenta não o encontrará magicamente e não removerá todas as suposições. Suponha que o código devesse ter sido if (handCardIndex > hand.getCapacity())
se > =, uma ferramenta como essa nunca descobrirá isso sozinha.
Se você quiser voltar para o TDD, poderia sugerir casos de teste baseados apenas na interface, mas isso seria ainda mais funcionalmente incompleto, porque não há nem mesmo um código a partir do qual você possa inferir alguma funcionalidade.
Seus principais problemas sempre serão 1. Carregar erros no código para o teste e 2. Integralidade funcional. Ambas as questões podem ser reprimidas de alguma forma, nunca serem eliminadas. Você sempre terá que voltar aos requisitos e sentar-se para verificar se todos foram realmente testados corretamente. O claro perigo aqui é uma falsa sensação de segurança, porque a cobertura do código mostra 100% de cobertura. Mais cedo ou mais tarde alguém cometerá esse erro, cabe a você decidir se os benefícios superam esse risco. IMHO se resume a um trade-off clássico entre qualidade e velocidade de desenvolvimento.