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?
Respostas:
Método de soluções fabricadas .
Verifique através de estudos de refinamento que o método atinge a ordem teórica de precisão.
Conservação de resposta. Reprodução de soluções bit a bit e a norma.
fonte
Bill já listou alguns métodos que abordam suas preocupações.
Dirigindo-se ao seu terceiro ponto, não, não há razão para introduzir acoplamentos fortes entre as peças. Exatamente o oposto: se suas funções ou classes tiverem interfaces bem definidas, será muito mais fácil trocar, por exemplo, um solucionador linear por outro, ou um esquema de escalonamento no tempo. Apenas resista e você poderá testar esses componentes separadamente. Fazemos isso com deal.II há décadas.
Para seu quarto ponto: se seu método é um experimento, seus experimentos com o método constituem um teste. Contanto que você não tenha análise, será necessário realizar esses resultados da melhor forma possível. Mas, geralmente, você tem uma expectativa, por exemplo, da ordem de um método, ou saberia que é exato para uma certa classe de soluções, por exemplo, polinômios até um certo grau. A verificação dessas informações deve fazer parte de seus experimentos e, à medida que a análise melhora, é possível adicionar testes.
fonte
Eu encontrei recentemente esta tese sobre TDD em Ciência da Computação. Ainda não li, por isso não faço ideia se é bom, mas espero que possa ajudar.
http://cyber.ua.edu/files/2014/12/u0015_0000001_0001551.pdf
fonte