Eu não sou engenheiro de software. Sou estudante de doutorado no campo da geociência.
Há quase dois anos, comecei a programar um software científico. Eu nunca usei a integração contínua (IC), principalmente porque no começo eu não sabia que ela existia e eu era a única pessoa trabalhando nesse software.
Agora que a base do software está sendo executada, outras pessoas começam a se interessar e querem contribuir com o software. O plano é que outras pessoas de outras universidades estejam implementando adições ao software principal. (Eu tenho medo que eles possam introduzir bugs). Além disso, o software ficou bastante complexo e tornou-se cada vez mais difícil de testar e também pretendo continuar trabalhando nele.
Por esses dois motivos, agora estou pensando cada vez mais sobre o uso do IC. Como nunca tive formação em engenharia de software e ninguém ao meu redor jamais ouviu falar sobre CI (somos cientistas, não programadores), acho difícil começar o meu projeto.
Tenho algumas perguntas em que gostaria de obter alguns conselhos:
Primeiro de tudo, uma breve explicação de como o software funciona:
O software é controlado por um arquivo .xml contendo todas as configurações necessárias. Você inicia o software simplesmente passando o caminho para o arquivo .xml como um argumento de entrada e ele é executado e cria alguns arquivos com os resultados. Uma única execução pode levar ~ 30 segundos.
É um software científico. Quase todas as funções têm vários parâmetros de entrada, cujos tipos são principalmente classes bastante complexas. Eu tenho vários arquivos .txt com grandes catálogos que são usados para criar instâncias dessas classes.
Agora vamos às minhas perguntas:
testes de unidade, testes de integração, testes de ponta a ponta? : Meu software agora possui cerca de 30.000 linhas de código com centenas de funções e ~ 80 classes. Parece meio estranho para mim começar a escrever testes de unidade para centenas de funções que já estão implementadas. Então, pensei em simplesmente criar alguns casos de teste. Prepare 10 a 20 arquivos .xml diferentes e deixe o software funcionar. Eu acho que isso é o que é chamado de testes de ponta a ponta? Costumo ler que você não deve fazer isso, mas talvez esteja tudo bem se você já tem um software funcionando? Ou é simplesmente uma idéia idiota tentar adicionar CI a um software já em funcionamento.
Como você escreve testes de unidade se os parâmetros de função são difíceis de criar? suponha que eu tenho uma função
double fun(vector<Class_A> a, vector<Class_B>)
e, normalmente, eu precisaria primeiro ler vários arquivos de texto para criar objetos do tipoClass_A
eClass_B
. Pensei em criar algumas funções fictícias comoClass_A create_dummy_object()
sem ler nos arquivos de texto. Também pensei em implementar algum tipo de serialização . (Não pretendo testar a criação dos objetos de classe, pois eles dependem apenas de vários arquivos de texto)Como escrever testes se os resultados são altamente variáveis? Meu software utiliza grandes simulações de monte-carlo e funciona iterativamente. Normalmente, você tem ~ 1000 iterações e a cada iteração, você está criando ~ 500 a 20.000 instâncias de objetos com base em simulações de monte-carlo. Se apenas um resultado de uma iteração for um pouco diferente, as iterações futuras serão completamente diferentes. Como você lida com essa situação? Eu acho que isso é um grande ponto contra testes de ponta a ponta, já que o resultado final é altamente variável?
Qualquer outro conselho com a CI é muito apreciado.