Java JUnit2.0:相同测试的不同结果
对于JUnit中的同一个测试,我得到了不同的结果。第一个测试似乎没有问题,为了验证所有断言,我相信该类工作正常。然后我重新运行测试,得到一个断言失败。我意识到问题在于我没有在测试后清除“数据”,并且我试图准确地修复它,但是我仍然有那些断言失败 有什么想法吗 单元测试:Java JUnit2.0:相同测试的不同结果,java,unit-testing,junit,Java,Unit Testing,Junit,对于JUnit中的同一个测试,我得到了不同的结果。第一个测试似乎没有问题,为了验证所有断言,我相信该类工作正常。然后我重新运行测试,得到一个断言失败。我意识到问题在于我没有在测试后清除“数据”,并且我试图准确地修复它,但是我仍然有那些断言失败 有什么想法吗 单元测试: import static org.junit.Assert.*; import org.junit.After; import org.junit.Before; import org.junit.Test; /** *
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* The test class TestHistorial.
*
* @author (your name)
* @version (a version number or a date)
*/
public class TestHistorial extends junit.framework.TestCase {
Historial hist;
/**
* Default constructor for test class TestHistorial
*/
public TestHistorial() {
}
/**
* Sets up the test fixture.
* <p/>
* Called before every test case method.
*/
@Before
public void setUp() {
hist = new BaseDatos();
}
/**
* Tears down the test fixture.
* <p/>
* Called after every test case method.
*/
@After
public void tearDown() {
hist.eliminarTodosLosRegistros();
}
/**
* Prueba
*/
public void testHistorial() {
for (int i = 0; i < 20; i++) {
Registro reg = new RegistroTemperatura(273 + i, 1900 + i, i + 1, i + 1, i);
try {
hist.agregarRegistro(reg);
} catch (Exception e) {
assertEquals(false, true);
} // No debería llegar aquí.
String str = "Reg_" + i;
Registro tReg = hist.getRegistroPorId(str);
try {
Temperatura t = new Temperatura(273 + i);
assertEquals(true, t.equals(((RegistroTemperatura) tReg).getTemperatura()));
} catch (Exception e1) {
assertEquals(false, true);
} // No debería llegar aquí.
try {
Fecha f = new Fecha(1900 + i, i + 1, i + 1, i);
assertEquals(true, f.equals(tReg.getFecha()));
} catch (Exception e2) {
assertEquals(false, true);
} // No debería llegar aquí.
}
assertEquals(20, hist.getNumeroDeRegistros());
assertEquals(true, hist.getRegistroMasViejo().equals(new RegistroTemperatura(273, 1900, 1, 1, 0)));
}
}
import static org.junit.Assert.*;
导入org.junit.After;
导入org.junit.Before;
导入org.junit.Test;
/**
*测试类TestHistorial。
*
*@author(你的名字)
*@version(版本号或日期)
*/
公共类TestHistorial扩展了junit.framework.TestCase{
历史史学家;
/**
*测试类TestHistorial的默认构造函数
*/
公共测试历史(){
}
/**
*设置测试夹具。
*
*在每个测试用例方法之前调用。
*/
@以前
公共作废设置(){
hist=新的BaseDatos();
}
/**
*拆下测试夹具。
*
*在每个测试用例方法之后调用。
*/
@之后
公共无效拆卸(){
hist.eliminartodoslosristros();
}
/**
*普鲁巴
*/
public void testHistorial(){
对于(int i=0;i<20;i++){
Registro reg=新登记温度(273+i,1900+i,i+1,i+1,i);
试一试{
Agregaregistro历史(reg);
}捕获(例外e){
资产质量(假、真);
}//没有德贝里亚·莱加·阿奎。
String str=“Reg_”+i;
Registro tReg=hist.getRegistroPorId(str);
试一试{
温度t=新温度(273+i);
assertEquals(true,t.equals((注册温度)tReg).getTemperatura());
}捕获(异常e1){
资产质量(假、真);
}//没有德贝里亚·莱加·阿奎。
试一试{
Fecha f=新的Fecha(1900+i,i+1,i+1,i);
assertEquals(true,f.equals(tReg.getFecha());
}捕获(异常e2){
资产质量(假、真);
}//没有德贝里亚·莱加·阿奎。
}
assertEquals(20,hist.getNumeroDeRegistros());
assertEquals(true,hist.getRegistroMasViejo().equals(新的寄存器温度(2731900,1,1,0));
}
}
第一次测试后的测试输出为:
$>应为:false,但为:true
真正的问题是,tearDown()
方法是否在`testHistorial()``之后执行?如果
不是,我该怎么做 首先,第二,不要在junit.framework.*
或junit.extensions.*
中使用任何东西
有了它的方式
为了回答第一个问题,在JUnit4.x中,带@After
-注释的方法总是在测试用例执行之后执行
为了解决问题的实质…您的单元测试应该测试一件事。它们只是一个功能单元。现在,您正在测试至少五个不同的部件,这就是为什么理解发生了什么或者为什么它会断裂是很复杂的
一件一件地做:测试Registro
,并确信它正在做它应该做的事情。然后转到Historial
。然后转到温度a
。然后Fecha
。我不能具体地告诉您为什么它会导致不一致的断言失败,但我可以告诉您,很难理解您实际测试的内容,这可能是造成误解的原因
也作为一般建议——如果您正在捕获<代码>异常< /代码>,请考虑在测试中仅捕获它,如果它是一个检查异常(由java强制执行),或者如果需要它抛出异常,并且需要在异常被抛出之后断言状态。创建一个单独的测试并使用
@expected
注释。这是一个相当丑陋的单元测试,将其重构为多个测试,将更容易确定故障。好的。哪里可以找到junit2文档?每个测试应该只有一个断言,很少有例外。如果有两个预期相等的复杂对象,并且要报告哪些字段不同,请使用ErrorCollector@Rule
,并收集断言异常。JUnit的当前版本是4.11。如果您想明确地使测试失败,请使用有意义的消息调用Assert.fail
;不要使用assertEquals(真、假)
hack。但是,如果测试中出现意外的异常,只需让方法抛出异常,而不处理它。移除所有try/catch块。抛出异常的JUnit测试被认为没有成功,您将从stacktrace中获得更多有用的信息。我有一个类似的JUnit测试问题,如果您需要测试异常消息,任何人都可以提供帮助。然后还可以使用ExpectedException@Rule
。他的@After
方法是不必要的,因为每次运行都会得到一个新的Historial
。即使它是一个已检查的异常,除非在测试中预期该异常,否则不要捕获它。只需将它添加到方法签名的throws
子句中。如果需要,请考虑使用<代码>预期属性<代码> @测试< /COD>注释。非常感谢您的建议,我将根据您的建议重构单元测试。请原谅我的语法错误,我学过英语,但还是有点生疏,因为我有一段时间不说不写英语了。