我已经解决了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); } }
附言:如果您知道任何改进解决方案的建议,我们非常欢迎将其包含在您的答案中。
您将在所有测试中共享被测类的单个实例。我将删除初始任务并添加以下内容:
private GameOfStones gameOfStones; // Don't create an instance here @BeforeMethod public void setUp() { gameOfStones = new GameOfStones(); }
…它将为每个测试使用一个新实例。好的做法还应该是在每次测试后进行清理:
@AfterMethod public void tearDown() { gameOfStones = null; }
在此处给出的示例中,修复导致问题变为方法范围的类范围变量也将解决此问题,但是随着被测软件变得更加复杂,开始进行正确的测试设置和拆除是很好的。