测试在单独运行时传递,但在整个测试类运行时不传递

时间:2014-10-25 10:43:00

标签: java algorithm testng

我已经解决了一个topCoder问题,当我自己运行它们时,所有测试都会通过。尽管如此,当我运行整个测试类时,其中一些失败了。请问,请帮我确定一下这种行为的原因?这是我的班级和我的考试:

 package com.topcoder.div2.stage1;

import java.util.Arrays;

public class GameOfStones {
    private int iterations = 0;
    public int count(int[] stones){
        int result = checkEquality(stones);
        return result;
    }

    private int checkEquality(int[] stones){
        int count = 0;
        int sum = 0;
        for(int k = 0; k< stones.length;k++){
            sum += stones[k];
        }
        if(stones.length > 0) {
            for (int i = 0; i < sum; i++) {
                Arrays.sort(stones);
                if(stones[stones.length-1] != 3) {
                    int j = 0;
                    while (j < stones.length - 1) {
                        if (stones[j] == stones[j + 1]) {
                            count++;
                        }
                        j++;
                    }
                    if (count == stones.length - 1) {
                        return iterations;
                    }
                    stones[0] = stones[0] + 2;
                    stones[stones.length - 1] = stones[stones.length - 1] - 2;
                    iterations++;
                    count = 0;
                }
            }
        }
        return -1;
    }
}

测试:

package com.topcoder.div2.stage1;

import org.testng.annotations.Test;

import static org.testng.Assert.assertEquals;

public class GameOfStonesTest {
    private GameOfStones gameOfStones = new GameOfStones();

    @Test
    public void test1() {
        int expected = 0;
        int[] given = {17};

        int actual = gameOfStones.count(given);

        assertEquals(expected, actual);
    }

    @Test
    public void test2() {
        int expected = 3;
        int[] given ={7, 15, 9, 5};

        int actual = gameOfStones.count(given);
        assertEquals(actual, expected);
    }

    @Test
    public void test3() {
        int expected = -1;
        int[] given ={2, 8, 4};

        int actual = gameOfStones.count(given);
        assertEquals(actual, expected);
    }

    @Test
    public void test4() {
        int expected = -1;
        int[] given ={10, 15, 20, 12, 1, 20};

        int actual = gameOfStones.count(given);
        assertEquals(actual, expected);
    }

    @Test
    public void test5(){
        int expected = 277;
        int[] given ={17, 1, 27, 29, 13, 1, 27, 3, 19, 3, 25, 1, 11, 9, 7, 17, 31, 25, 5, 11, 31, 9,
                15, 3, 3, 3, 11, 11, 1, 41, 5, 95, 7, 3, 41, 31, 7, 13, 15, 5, 17, 3, 9, 3, 11,
                27, 1, 23, 15, 5, 43, 11, 17, 7, 1, 3, 13, 69, 3, 43, 21, 1, 25, 1, 3, 11, 5, 43,
                13, 7, 15, 1, 1, 55, 37, 9, 5, 7, 21, 3, 23, 15, 1, 9, 3, 35, 13, 17, 7, 17, 27, 5,
                9, 19, 13, 1, 1, 1, 29};
        int actual = gameOfStones.count(given);
        assertEquals(actual, expected);
    }

    @Test
     public void test6(){
        int expected = 539;
        int[] given ={1, 29, 11, 35, 57, 15, 85, 19, 5, 47, 53, 5, 63, 19, 13, 63, 27, 43, 53, 75, 67, 93, 33, 31, 47, 3,
                63, 17, 11, 53, 35, 23, 17, 45, 31, 19, 63, 75, 5, 3, 49, 19, 11, 89, 21, 69,
                71, 5, 45, 81, 31, 13, 11, 19, 7, 99, 33, 63, 19, 57, 73, 29, 35, 9, 47,
                1, 17, 7, 13, 31, 5, 85, 95, 23, 45, 65, 63, 41, 81, 33, 45, 1, 15,
                45, 19, 87, 51, 7, 13, 39, 1, 59, 29, 35, 1, 43};
        int actual = gameOfStones.count(given);
        assertEquals(actual, expected);
    }

    @Test
    public void test7() {
        int expected = 0;
        int[] given ={100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
                100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
                100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
                100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
                100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
                100, 100};
        int actual = gameOfStones.count(given);
        assertEquals(actual, expected);
    }

    @Test
    public void test8() {
        int expected = 11;
        int[] given ={3, 5, 21, 31};
        int actual = gameOfStones.count(given);
        assertEquals(actual, expected);
    }

    @Test
    public void test9() {
        int expected = 13;
        int[] given ={44, 6, 46};
        int actual = gameOfStones.count(given);
        assertEquals(actual, expected);
    }

}

如果你知道改进解决方案的任何建议,我们非常欢迎你将它们包括在你的答案中。

5 个答案:

答案 0 :(得分:3)

您正在所有测试中共享受测试类的单个实例。我将删除初始分配并添加:

private GameOfStones gameOfStones; // Don't create an instance here

@BeforeMethod
public void setUp() {
    gameOfStones = new GameOfStones();
}

...将为每个测试使用一个新实例。良好的做法也是每次测试后清理:

@AfterMethod
public void tearDown() {
    gameOfStones = null;
}

在这里给出的示例中,修复类范围的变量导致问题变为方法范围,这也将解决问题,但随着被测软件变得越来越复杂,开始进行适当的测试设置和拆除是很好的。

答案 1 :(得分:1)

您也可以在Junit5上尝试@BeforeEach

@BeforeEach
public void setup() {
  // Some code here
}

答案 2 :(得分:0)

由于我在一个接一个地执行的许多测试用例中打开了相同的被测活动,并且具有相同的IntentsTestRule类活动

我可以通过在activityTestRule类和intentTestRule类上调用finishActivity来解决该问题

例如:

@之后 有趣的method(){

mainActivityTestRule.finishActivity()

mIntentsRule.finishActivity()

}

答案 3 :(得分:0)

我有同样的问题。我需要模拟一个记录器,这是一个静态字段。因此,最终类加载器在被测类的第一次调用期间仅创建静态字段的单个实例,而忽略了所有进一步的模拟和存根。单独运行时,测试是绿色的,因为记录器已按预期进行了初始化和加载,但是当与其他测试方法一起运行时,它被初始化为一个具体对象,而不是模拟对象。解决方法:

  • 创建@BeforeClass方法以确保首先创建正确的静态字段实例:
    @BeforeClass
    public static void setupBeforeClass() {
      PowerMockito.mockStatic(LoggerFactory.class);
      loggerMock = mock(Logger.class);
      when(LoggerFactory.getLogger(any(Class.class))).thenReturn(loggerMock);
   }
  • 通过不同的测试执行积累了模拟上的交互。因此,为确保在每次测试方法执行时都能获得干净的模拟实例,请在@Before@After方法中重置模拟:
      @Before
      public void setup() {

        // Reset interactions on the mocked logger
        Mockito.reset(loggerMock);

      }

请注意,在我的示例中,我使用了PowerMock,因此您需要相应的运行器@RunWith(PowerMockRunner.class)@PrepareForTest({LoggerFactory.class, MyClass.class)}语句。

答案 4 :(得分:0)

我想补充一下我在此问题上的经验。

经过多次调试后,我可以确认数据库中没有垃圾数据,也没有影响功能的静态变量。

同样的单元测试,可以在另一个环境中按预期一次又一次地全部通过。

Java版本和MySQL版本在两种环境中都相同。唯一的区别是Maven版本。因此,我配置了成功环境中使用的相同的Maven版本。

然后问题解决了。