Qualquer teste de software é como "Prova por exemplo", não apenas testes de unidade usando uma ferramenta como JUnit. E isso não é nova sabedoria, há uma citação de Dijkstra de 1960, que diz essencialmente o mesmo:
"O teste mostra a presença, não a ausência de bugs"
(basta substituir as palavras "shows" por "provas"). No entanto, isso também é verdade para ferramentas que geram dados de teste aleatórios. O número de entradas possíveis para uma função do mundo real é geralmente maior em ordens de magnitudes do que o número de casos de teste que se pode produzir e verificar em relação a um resultado esperado dentro da idade do universo, independentemente do método de geração desses casos. mesmo se alguém usar uma ferramenta geradora para produzir muitos dados de teste, não há garantia de não perder o caso de teste que poderia ter detectado um determinado bug.
Às vezes, testes aleatórios podem revelar um bug que foi ignorado pelos casos de teste criados manualmente. Mas, em geral, é mais eficiente criar testes cuidadosamente para a função a ser testada e garantir que um usuário obtenha uma cobertura completa de código e ramificação com o menor número possível de casos de teste. Às vezes, é uma estratégia viável combinar testes gerados manualmente e aleatoriamente. Além disso, ao usar testes aleatórios, é preciso ter o cuidado de obter os resultados de maneira reproduzível.
Portanto, os testes criados manualmente não são de forma alguma pior que os testes gerados aleatoriamente, geralmente o contrário.