Eu tenho uma pergunta sobre junit assertEquals
para testar valores duplos. Lendo o documento da API, posso ver:
@Deprecated public static void assertEquals(double expected, double actual)
Descontinuada. Use assertEquals (dobro esperado, dobro real, dobro epsilon)
O que o epsilon
valor significa? (Epsilon é uma letra do alfabeto grego, certo?).
Alguém pode me explicar como usá-lo?
java
unit-testing
junit
Édipo Féderle
fonte
fonte
<=
não<
.doubleIsDifferent
(para comparar valores duplos) e retornaMath.abs(d1 - d2) > delta
. Portanto, se a diferença entre d1 e d2 for maior que delta, isso significa que os valores são diferentes e retornarão true. Retornará false se os valores forem considerados iguais. Esse método é chamado diretamente no assertEquals e, se retornar verdadeiro, o assertEquals chamaráfailNotEquals
e o resultado do teste será uma falha.Qual versão do JUnit é essa? Eu só vi delta, não epsilon - mas isso é uma questão secundária!
No javadoc JUnit :
Provavelmente é um exagero, mas normalmente uso um número muito pequeno, por exemplo
Se você estiver usando declarações de hamcrest , poderá usar o padrão
equalTo()
com duas duplas (ele não usa um delta). No entanto, se você quiser um delta, basta usarcloseTo()
(consulte javadoc ), por exemploPara sua informação, o próximo JUnit 5 também tornará o delta opcional ao pagar
assertEquals()
com duas duplas. A implementação (se você estiver interessado) é:fonte
Os cálculos de ponto flutuante não são exatos - geralmente há erros de arredondamento e erros devido à representação. (Por exemplo, 0.1 não pode ser representado exatamente no ponto flutuante binário.)
Por isso, comparar diretamente dois valores de ponto flutuante para igualdade geralmente não é uma boa ideia, pois eles podem ser diferentes em uma pequena quantidade, dependendo de como foram calculados.
O "delta", como é chamado nos javadocs da JUnit , descreve a quantidade de diferença que você pode tolerar nos valores para que eles ainda sejam considerados iguais. O tamanho desse valor depende inteiramente dos valores que você está comparando. Ao comparar duplas, normalmente uso o valor esperado dividido por 10 ^ 6.
fonte
O fato é que dois duplos podem não ser exatamente iguais devido a problemas de precisão inerentes aos números de ponto flutuante. Com esse valor delta, você pode controlar a avaliação da igualdade com base em um fator de erro.
Além disso, alguns valores de ponto flutuante podem ter valores especiais, como NAN e -Infinity / + Infinity, que podem influenciar os resultados.
Se você realmente pretende comparar que duas duplas são exatamente iguais, é melhor compará-las como uma representação longa
Ou
O que pode levar essas nuances em consideração.
Não mergulhei no método Assert em questão, mas só posso supor que o anterior foi descontinuado para esse tipo de problema e o novo leva-os em consideração.
fonte
Epsilon é uma diferença entre
expected
eactual
valores que você pode aceitar pensando que são iguais. Você pode definir,.1
por exemplo.fonte
Observe que, se você não estiver fazendo matemática, não há nada errado em afirmar valores exatos de ponto flutuante. Por exemplo:
Nesse caso, você quer ter certeza de que não é realmente
MIN_VALUE
zero-MIN_VALUE
ouMIN_NORMAL
ou algum outro valor muito pequeno. Você pode dizermas isso receberá um aviso de descontinuação. Para evitar isso, você pode ligar
assertEquals(Object, Object)
:E, se você realmente quer parecer inteligente:
Ou você pode simplesmente usar afirmações no estilo fluente de Hamcrest:
Se o valor que você está verificando for proveniente de algumas contas, use o epsilon.
fonte
fonte