首页 > 解决方案 > 为什么我的测试没有通过以百分比形式返回数组中的元素?

问题描述

嗨,我返回一个表示视图数百分比的数组,如果视图为空,则返回空数组,如果视图为空数组,则返回空数组,例如,如果视图 = {10、70、20、90},则总视图为190. * 10 是 190 的 5.26% * 70 是 190 的 36.84% * 20 是 190 的 10.52% * 90 是 190 的 47.36% 我不需要担心 EXACT 值。测试检查每个值是否在预期值的 0.01 范围内。

我想知道我做错了什么,因为我的测试没有通过?

public double[] viewsInPercentage() {
    if(views.length==0) {
        return null;
    }
    double watched[] = new double[views.length];
    for(int i = 0; i < views.length; i++) {
        watched[i] = ((double)views[i]*100)/getTotalViews();
    }
    return watched;
}

测试

@BeforeEach
    public void setUp() throws Exception {
        currentMethodName = null;
        
        a = new int[] {10,70,20,90,80,5};
        simple = new VideoAnalytics("El Clasico", a);
        
        b = null;
        nullHistory = new VideoAnalytics("Installing Eclipse", b);
        
        c = new int[0]; //empty array
        emptyHistory = new VideoAnalytics("Headphones Review", c);
        
        d = new int[] {10,10,20,10,20,30,10,20,30,40,5,40,50,60,80,70,70,80,90,100,110,120,130,140,150,160,170,180};
        longHistory = new VideoAnalytics("Practical exam walkthrough", d);
    }

@Test @Order(6) @Graded(description="viewsInPercentage", marks=8)
public void testViewsInPercentage() {
    assertNull(nullHistory.viewsInPercentage());
    assertNotNull(emptyHistory.viewsInPercentage());
    assertEquals(0, emptyHistory.viewsInPercentage().length);
    
    for(int i=0; i < simple.views.length; i++) {
        assertEquals(simple.views[i] * 100.0 / simple.getTotalViews(), simple.viewsInPercentage()[i], 0.01);
    }

    for(int i=0; i < longHistory.views.length; i++) {
        assertEquals(longHistory.views[i] * 100.0 / longHistory.getTotalViews(), longHistory.viewsInPercentage()[i], 0.01);
    }
    
    currentMethodName = new Throwable().getStackTrace()[0].getMethodName();
}

标签: javaarrays

解决方案


如果您期望分别null为空输出null和空输入,则需要修复代码:

public double[] viewsInPercentage() {
    if(null == views) {
        return null;
    }
    double[] watched = new double[views.length];
    int totalViews = getTotalViews();
    for (int i = 0; i < views.length; i++) { // the loop won't execute for empty input
        watched[i] = views[i] * 100.0 / totalViews;
    }
    return watched;
}

此外,getTotalViews应该检查它是否返回正确的所有视图总数:

public int getTotalViews() {
    return null == views ? 0 : Arrays.stream(views).sum();
}

推荐阅读