Luc*_*uke 3 java junit unit-testing java-ee
在测试类中复制代码是"坏"吗?如你所见,我将驾驶记录添加到驾驶记录中,以便在多种方法中进行测试.将它提取到私有帮助器方法是否更好?或者更清楚地保持它是否像它一样?在这种情况下你做什么?
@Test
public void shouldRemoveAllDrivingRecords() {
Duration duration1 = new Duration(1, 30, 45);
Duration duration2 = new Duration(2, 50, 12);
DrivingRecord drivingRecord1 = new DrivingRecord(230.0, duration1, "This was a long trip");
DrivingRecord drivingRecord2 = new DrivingRecord(300.0, duration2, "This trip is even longer.");
drivingLog.addDrivingRecord(drivingRecord1);
drivingLog.addDrivingRecord(drivingRecord2);
drivingLog.removeAllDrivingLogs();
assertEquals(0, drivingLog.numberOfDrivingRecords());
}
@Test
public void shouldSumTheDistanceDriven() {
Duration duration1 = new Duration(1, 30, 45);
Duration duration2 = new Duration(2, 50, 12);
DrivingRecord drivingRecord1 = new DrivingRecord(230.0, duration1, "This was a long trip");
DrivingRecord drivingRecord2 = new DrivingRecord(300.0, duration2, "This trip is even longer.");
drivingLog.addDrivingRecord(drivingRecord1);
drivingLog.addDrivingRecord(drivingRecord2);
double expectedDistanceDriven = drivingRecord1.getDistance() + drivingRecord2.getDistance();
double totalDistanceDriven = drivingLog.getDistanceDriven();
assertEquals(expectedDistanceDriven, totalDistanceDriven, 0.1);
}
Run Code Online (Sandbox Code Playgroud)
在任何地方复制代码都是"坏事".此代码是否因某种原因而重复,或仅仅是为了方便.如果有一个原因,你想要在两者中使用相同的数据并以相同的方式添加它,那么一个小的"设置"方法是有意义的.
我不敢反对大多数答案,对我来说测试代码与生产代码不一样.当然,测试代码应该像生产代码一样受到关注和关注,因为它是整体开发工作的一部分,但它们的性质不同.我不会重复自己,而是指向我的另一个答案:当逻辑相同时复制过去单元测试是否可以.
也就是说,重复测试数据的创建是不好的.更好的方法是考虑为测试而精心创建的数据集,并支持测试大多数情况.可以在该setUp方法中创建该数据集.如有必要,可以有多个测试数据集,涵盖业务规则的变体.创建有用的测试数据集并不容易,但值得花一些时间.此外,可以从JSON等加载测试数据.在某些情况下,它更容易维护.
单元测试通常不应相互依赖.但经常,测试用例确实相互依赖.例如,为了测试一个列表,人们想要测试哪些add()有效,哪个isEmpty()有效,哪个remove()有效.测试remove()假设add()有效.对于这种情况,您可以使用JExample,一个单元测试框架,您可以使用它来"链接"测试.
您可以使用该方法注释方法@org.junit.Before并初始化该方法中的变量:
public class DrivingLogTest {
//suposing DrivingLog class...
private DrivingLog drivingLog;
private Duration duration1;
private Duration duration2;
private DrivingRecord drivingRecord1;
private DrivingRecord drivingRecord2;
@Before
public void setUp() {
drivingLog=new DrivingLog();
duration1 = new Duration(1, 30, 45);
duration2 = new Duration(2, 50, 12);
drivingRecord1 = new DrivingRecord(230.0, duration1, "This was a long trip");
drivingRecord2 = new DrivingRecord(300.0, duration2, "This trip is even longer.");
drivingLog.addDrivingRecord(drivingRecord1);
drivingLog.addDrivingRecord(drivingRecord2);
}
@Test
public void shouldRemoveAllDrivingRecords() {
drivingLog.removeAllDrivingLogs();
assertEquals(0, drivingLog.numberOfDrivingRecords());
}
@Test
public void shouldSumTheDistanceDriven() {
double expectedDistanceDriven = drivingRecord1.getDistance() + drivingRecord2.getDistance();
double totalDistanceDriven = drivingLog.getDistanceDriven();
assertEquals(expectedDistanceDriven, totalDistanceDriven, 0.1);
}
}
Run Code Online (Sandbox Code Playgroud)