Eu já tinha um pouco de experiência com testes de unidade no que chamo (não pejorativamente) de projeto clássico de engenharia de software: um MVC, com uma GUI de usuário, um banco de dados, lógica de negócios na camada intermediária, etc. estou escrevendo uma biblioteca de computação científica em C # (sim, eu sei que o C # é muito lento, use C, não reinvente a roda e tudo isso, mas temos muitas pessoas fazendo computação científica na minha faculdade em C #, e nós meio que precisamos disso). É um projeto pequeno, em termos da indústria de desenvolvimento de software, porque estou escrevendo principalmente sozinho e, de tempos em tempos, com a ajuda de alguns colegas. Além disso, não sou pago por isso, e o mais importante é um projeto acadêmico. Quero dizer, espero que tenha qualidade profissional algum dia, porque estou pensando em abrir código-fonte,
De qualquer forma, o projeto está ficando grande (cerca de 18.000 linhas de código, o que eu acho que é grande para o projeto de um homem), e está saindo das minhas mãos. Estou usando o git para controle de origem e acho que fiquei bem, mas estou testando como a velha escola, ou seja, escrevendo aplicativos de console completos que testam grande parte do sistema, principalmente porque não tenho idéia de como para fazer testes de unidade nesse cenário, embora eu sinta que é o que devo fazer. O problema é que a biblioteca contém principalmente algoritmos, por exemplo, algoritmos de gráficos, classificadores, solucionadores numéricos, distribuições aleatórias etc. Eu simplesmente não sei como especificar casos de teste minúsculos para cada um desses algoritmos, e como muitos deles são estocástico Não sei como validar a correção. Para classificação, por exemplo, existem algumas métricas como precisão e recall, mas essas métricas são melhores para comparar dois algoritmos do que para julgar um único algoritmo. Então, como posso definir correção aqui?
Finalmente, há também o problema de desempenho. Eu sei que é um conjunto totalmente diferente de testes, mas o desempenho é um dos recursos importantes de uma ferramenta científica, em vez de satisfação do usuário ou outras métricas de engenharia de software.
Um dos meus maiores problemas é com estruturas de dados. O único teste que posso encontrar para uma árvore kd é um teste de estresse: insira muitos vetores aleatórios e, em seguida, realiza muitas consultas aleatórias e compara com uma pesquisa linear ingênua. O mesmo para desempenho. E com os otimizadores numéricos, tenho funções de benchmark que posso testar, mas, novamente, esse é um teste de estresse. Eu não acho que esses testes possam ser classificados como testes de unidade e, o mais importante, sejam executados continuamente, pois a maioria deles é bastante pesada. Mas também acho que esses testes precisam ser feitos, não posso simplesmente inserir dois elementos, abrir a raiz e sim, funciona para o caso 0-1-n.
Então, qual é a abordagem de teste (unitário) para esse tipo de software? E como organizo os testes de unidade e os pesados em torno do ciclo de código-compilação-confirmação-integração?
fonte