我測試我的方法之一,double getSqrt(double s)
,並具有以下JUnit測試代碼:爲什麼我的assertEquals不起作用?
@Test
public void testGetSqrt() {
System.out.println("getSqrt");
double s = 16.0;
Calculator instance = new Calculator();
double expResult = 4.0;
double result = 4.000000000052429; // was "instance.getSqrt(s);" here
// now hardcode for test purpose
System.out.println(System.getProperty("java.class.path"));
assertEquals(expResult, result, 0.0);
}
它每次都失敗,無論我如何改變容忍「0.0」,「0.1」,「0.00」 ,「0.01」,「0.001」....該報告如下:
AssertionFailedError: expected:<4.0>; but was:<4.000000000052429>
我使用的是JUnit 4.12和Hamcrest 1.3。
而且我進口:
import org.junit.Test;
import static org.junit.Assert.*;
難道我用的是寬容錯了嗎?
輸出在控制檯上:
compile-test-single:
Testsuite: descriptivestatisticsapplication.processing.CalculatorTest
getSqrt
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.079 sec
------------- Standard Output ---------------
getSqrt
C:\Java\jdk1.8.0_111\jre\lib\javaws.jar;C:\Java\jdk1.8.0_111\jre\lib\deploy.jar;C:\Java\jdk1.8.0_111\jre\lib\plugin.jar;C:\Users\Z\Documents\NetBeansProjects\DescriptiveStatisticsApplication\build\classes;C:\Program Files\NetBeans 8.2\platform\modules\ext\junit-4.12.jar;C:\Program Files\NetBeans 8.2\platform\modules\ext\hamcrest-core-1.3.jar;C:\Users\Z\Documents\NetBeansProjects\DescriptiveStatisticsApplication\build\test\classes;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant-launcher.jar;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant.jar;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant-junit.jar;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant-junit4.jar
------------- ---------------- ---------------
更新的5/27:
做從意見建議一些測試後,該單元測試現在可以順利通過。我認爲這個問題可以結束。
我擔心的是我沒有找到任何失敗原因,爲什麼現在它成功了!相同的代碼,相同的邏輯!我所做的唯一事情就像註釋掉一些不重要的行,然後將它們添加回來,更改一些聲明語句序列,然後將其更改回來。相同的代碼有不同的行爲。我沒有改變建築物中的任何東西,並運行env和libs。這沒有任何意義。一段代碼的結果應該是可重現的。
在你的'getSqrt'方法裏面,你是如何計算平方根的? –
@BiancaRosa重要嗎?我們可以看到結果。 –
@BiancaRosa getSqrt的實現不應該是相關的。正如你所看到的,它已經計算出結果<4.000000000052429>。這當然不準確,因爲我使用Double。問題是,我已經將精度容限限制爲0.01,但它仍然不起作用。我想不出爲什麼...... –