Sou um grande defensor do desenvolvimento orientado a testes em computação científica. Sua utilidade na prática é simplesmente impressionante e realmente alivia os problemas clássicos que os desenvolvedores de código conhecem. No entanto, existem dificuldades inerentes ao teste de códigos científicos que não são encontrados na programação geral; portanto, os textos TDD não são muito úteis como tutoriais. Por exemplo:
Em geral, você não sabe a resposta exata para um determinado problema complexo a priori; então, como você pode escrever um teste?
O grau de paralelismo muda; Recentemente, encontrei um bug em que o uso de tarefas MPI como um múltiplo de 3 falharia, mas um múltiplo de 2 funcionava. Além disso, estruturas de teste comuns não parecem muito compatíveis com o MPI devido à própria natureza do MPI - você precisa executar novamente um binário de teste para alterar o número de tarefas.
Os códigos científicos geralmente têm muitas peças fortemente acopladas, interdependentes e intercambiáveis. Todos nós vimos o código legado e sabemos como é tentador renunciar a um bom design e usar variáveis globais.
Freqüentemente, um método numérico pode ser um "experimento" ou o codificador não entende completamente como funciona e está tentando entendê-lo, portanto, antecipar resultados é impossível.
Alguns exemplos de testes que escrevo para código científico:
Para integradores de tempo, use um ODE simples com uma solução exata e teste se o seu integrador o soluciona com uma determinada precisão, e a ordem da precisão está correta testando com diferentes tamanhos de etapas.
Testes de estabilidade zero: verifique se um método com 0 limite / condições iniciais permanece em 0.
Testes de interpolação: dada uma função linear, garanta que uma interpolação esteja correta.
Validação herdada: isole um pedaço de código em um aplicativo herdado que esteja correto e retire alguns valores discretos para usar nos testes.
Ainda é frequente que eu não consiga descobrir como testar adequadamente um determinado pedaço de código, além da tentativa e erro manual. Você pode fornecer alguns exemplos de testes que você escreve para código numérico e / ou estratégias gerais para testar software científico?