No fim do enunciado do ep4 está escrito que devemos usar uma constante eps para testar as respostas das funções matemáticas. Isso dá a entender que precisamos fazer funções fazem as mesmas coisas que a biblioteca matemática faz e depois comparar os resultados, o que, pra mim, não faz sentido, porque se já fizemos essas funções, pra que usar a biblioteca matemática ?
Acho que parece muito mais justo ver se os resultados fazem algum sentindo, como algum outro colega propos num post comparar sen(a+b) usando cos, ou ver se as funções levantam exceções quando mandamos um valor onde a função não está definida.
O que vocês acham?
Re: O que é pra testar no miniep4?
Pelo que eu entendi a constante epsilon é uma constante de "arredondamento"
As funções sin, cos, por exemplo, do python3 devolvem um float "infinito", então é meio dificil de você comparar com algum outro resultado.
Nesses casos então o epsilon limitaria o número de casas decimais, assim 1,1234 != 1,123456789 , mas com um certo epsilon, seriam iguais.
É bem util, porque sin(pi) não é zero por exemplo.
Re: O que é pra testar no miniep4?
Acho que eu me expressei mal. Eu vi muita gente que está testando as funções fazendo outras versões e comparando os resultados, o que, pra mim, nao faz sentido.
Olá Gustavo,
No final, a sua pergunta leva a uma discussão de fundo importante. Se eu já fiz, para que verificar? Por algumas razões:
- garantir que no futuro, o que você fez continue funcionando;
- ver o que acontece em outros ambientes, isso é, você pode rodar os seus testes em uma nova arquitetura, por exemplo;
- Ter uma documentação de como usar o que foi testado.
Note que usamos as funções matemáticas de Python que devem funcionar, mas imagine que você recebeu a biblioteca QuickerMath.py, que você não conhece? Como você faria?
Alfredo
Pelo que entendi, acho que a questão é se devemos implementar uma função que calcula sen(x) através de uma série, por exemplo, para testar se a função sen(x) da math é correta.
Ao meu ver isso também não parece fazer sentido.
Sim,estou fazendo outros testes como ângulos suplementares, sen^2 + cos^2 = 1.
A ideia é testar a função para ver se ela realmente faz o que deveria.
Em um programa mais complexo, é bom saber que algumas funções que você implementou anteriormente não foram "quebradas" ao longo do desenvolvimento.
Exato. Fazer uma outra função que calcula um seno para calcular com a versão na math não faz sentido.
Devemos então escolher uns 10 casos intermediarios e colocar a resposta esperada direto no programa?
Olá Gustavo,
Como assim "Não faz sentido"? Repito, imagine que você está testando uma biblioteca Math
recebida de alguém. Como você vai validá-la?
Alfredo
Se eu fosse testar o seno, por exemplo, eu testaria o programa para alguns valores que eu sei o seno e testaria a função para alguns valores esquisitos, como valores muito altos ou strings, mas não criaria uma função que calcula o seno pra validar essa biblioteca que me passaram. Se eu fizesse isso eu teria que recriar essa biblioteca, não?
Re: O que é pra testar no miniep4?
Pelo que eu entendi, você não deve implementar outra função que calcula o sen, cos, etc... E sim avaliar e validar as que já existem na biblioteca d Python usando o unittest
Eu entendi isso também.
Você usa valores tabelados das funções e compara com os das bibliotecas.
Eu faria isso para testar uma biblioteca Math arbitrária
Olá Ian,
Imagine agora que a empresa que vende a biblioteca Math fica sabendo do seus testes. Nesse caso, ela poderia ao invés de fazer contas, apenas fazer um simples switch e fazer
passar o seu teste.
Tentem abstrair um pouco que estamos testando uma biblioteca bem conhecida e que não terá
nenhum erro. Pensem que vocês vão receber uma biblioteca possivelmente não confiável e opapel de vocês é fazer testes tão abrangentes quanto o possível.
Alfredo
Re: O que é pra testar no miniep4?
Então devemos implementar testes para verificar se o sin, cos etc do math do python funcionam como deveriam certo?
Testar se sin(0) = 0.
Certo.
Testar os casos extremos é importante! Mas não se limitem somente a isso, testem casos intermediários também.
Bom, aí que está o problema a meu ver. Só coisas como sen(0) = 0 ou sen(a+b) podem ser testadas. Pois ao meu ver usar sen(pi) faz menos sentido do que implementar um teste com cosseno já que pi também deve ser testado.
O mesmo oocorre se quiser testar usando série de Taylor. Já que utiliza fatorial.
Olá André,
Se você fez um teste que garante que o Math.Pi corresponde ao valor de Pi antes, faz sentido o teste de Math.sin(Math.Pi).
Mais, ainda, se você não confia no fatorial do Math, faça o seu antes. Todos os testes que verificam o funcionamento de formas
diferentes fazem sentido. Só para completar, não se usa o cálculo de fatorial, a cada iteração, em uma implementação eficiente
de série de Taylor
Alfredo
Uma ideia seria testar outras propriedades da função seno independentes de pi, cos... por exemplo testar se math.sin é limitada, se é função ímpar, se é periódica...
Olá Eric,
Sim, mas esperamos de vocês algumas verificações mais sofisticadas.
Alfredo
É necessário escrever algum relatório sobre os testes ou basta apenas o código fonte?