在JUnit测试中重复代码

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)

Ton*_*son 7

在任何地方复制代码都是"坏事".此代码是否因某种原因而重复,或仅仅是为了方便.如果有一个原因,你想要在两者中使用相同的数据并以相同的方式添加它,那么一个小的"设置"方法是有意义的.


ewe*_*nli 7

我不敢反对大多数答案,对我来说测试代码与生产代码一样.当然,测试代码应该像生产代码一样受到关注和关注,因为它是整体开发工作的一部分,但它们的性质不同.我不会重复自己,而是指向我的另一个答案:当逻辑相同时复制过去单元测试是否可以.

也就是说,重复测试数据的创建是不好的.更好的方法是考虑为测试而精心创建的数据集,并支持测试大多数情况.可以在该setUp方法中创建该数据集.如有必要,可以有多个测试数据集,涵盖业务规则的变体.创建有用的测试数据集并不容易,但值得花一些时间.此外,可以从JSON等加载测试数据.在某些情况下,它更容易维护.

单元测试通常不应相互依赖.但经常,测试用例确实相互依赖.例如,为了测试一个列表,人们想要测试哪些add()有效,哪个isEmpty()有效,哪个remove()有效.测试remove()假设add()有效.对于这种情况,您可以使用JExample,一个单元测试框架,您可以使用它来"链接"测试.


Tom*_*ros 6

您可以使用该方法注释方法@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)