对 ArrayList 的 ArrayList 进行 Junit 测试
Junit test on an ArrayList of ArrayLists
我是 Java 的初学者,我正在尝试通过实践学习,我发现这个练习的目的是将列表划分为 n 大小的子列表
方法分区接受参数 (ArrayList, size)
例如:
partition([1,2,3,4,],2)
将 return ([1,2],[3,4])
partition([1,2,3,4,],3)
将 return ([1,2,3],[4])
package partition;
import java.util.ArrayList;
import java.util.List;
public class Partition {
public ArrayList<ArrayList> partition(List<Integer> li, int n) {
ArrayList<ArrayList> al = new ArrayList();
int start = 0;
int i=n;
for(; i<li.size(); i+=n){
List<Integer> lis = li.subList(start, i);
ArrayList<Integer> list = new ArrayList<>();
list.addAll(lis);
al.add(list);
start = i;
}
if(i >= li.size()){
List<Integer> lis = li.subList(start, li.size());
ArrayList<Integer> list = new ArrayList<>();
list.addAll(lis);
al.add(list);
}
return al;
}
}
我想编写一个 Junit 测试来测试所有情况。我正在尝试阅读有关如何使用 Junit 的文档,但我发现在这种情况下很难做到这一点。
有人可以通过给出一些指示或一个看起来像这个的例子来帮助我,这样我就可以测试所有的情况。
所以您已经编写了 class 并且想要测试它以查看是否有效。这里你可以用单元测试做什么:
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
public class Tests {
Partition sut = new Partition();
@Test
public void it_should_has_partition_size_2() {
ArrayList<ArrayList> partitioned = sut.partition(Arrays.asList(1,2,3,4),2);
assertEquals(partitioned.size(), 2); // we expecting size to be 2
assertEquals(partitioned.get(0), Arrays.asList(1,2,3)); // we know the first element should contains 1,2,3
}
@Test
public void it_should_fail() {
ArrayList<ArrayList> partitioned = main.partition(Arrays.asList(1,2,3,4),3);
assertEquals(partitioned.size(), 2);
// here it fails because we should expect partitioned.get(0) contains 1,2,3
assertEquals(partitioned.get(0), Arrays.asList(1,2));
/*
* to pass this test we should use the below method
* assertNotEquals(partitioned.get(0), Arrays.asList(1,2));
*/
}
}
当你 运行 时,第一个测试将通过,第二个测试将失败。
它给出了为什么第二个失败的解释:
junit 的 Maven 依赖项:
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
您的用例似乎很适合进行参数化测试。
JUnit 5 现在真的很成熟。所以我鼓励使用它。
单元测试的总体思路是识别场景:输入的内容和预期的内容。
在您的问题中,您已成功开始定义它们。
但是好的单元测试是不留漏洞的单元测试。所以你还必须识别和测试极端情况。
例如,您可以定义场景(并非详尽无遗,但可以给您一个想法):
partition([1,2,3,4,],2) will return ([1,2],[3,4]) // nominal case
partition([1,2,3,4,],3) will return ([1,2,3],[4]) // nominal case
partition([1,2,3,4,],5) will return () // corner case
partition([],2) will return () // corner case
现在为他们写一个测试:
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
public class PartitionTest {
@ParameterizedTest
@MethodSource("partitionFixture")
void partition(List<Integer> originalList, int partitionSize, List<List<Integer>> expectedListOfList) {
ArrayList<ArrayList<Integer>> actualListOfList = new Partition().partition(originalList, partitionSize);
Assertions.assertEquals(expectedListOfList, actualListOfList);
}
@SuppressWarnings("unused")
private static Stream<Arguments> partitionFixture() {
return Stream.of(Arguments.of(asList(1, 2, 3, 4), 2, asList(asList(1, 2), asList(3, 4))),
Arguments.of(asList(1, 2, 3, 4), 3, asList(asList(1, 2, 3), asList(4))),
Arguments.of(asList(1, 2, 3, 4), 5, asList()),
Arguments.of(asList(), 2, asList()));
}
}
我是 Java 的初学者,我正在尝试通过实践学习,我发现这个练习的目的是将列表划分为 n 大小的子列表 方法分区接受参数 (ArrayList, size)
例如:
partition([1,2,3,4,],2)
将 return ([1,2],[3,4])
partition([1,2,3,4,],3)
将 return ([1,2,3],[4])
package partition;
import java.util.ArrayList;
import java.util.List;
public class Partition {
public ArrayList<ArrayList> partition(List<Integer> li, int n) {
ArrayList<ArrayList> al = new ArrayList();
int start = 0;
int i=n;
for(; i<li.size(); i+=n){
List<Integer> lis = li.subList(start, i);
ArrayList<Integer> list = new ArrayList<>();
list.addAll(lis);
al.add(list);
start = i;
}
if(i >= li.size()){
List<Integer> lis = li.subList(start, li.size());
ArrayList<Integer> list = new ArrayList<>();
list.addAll(lis);
al.add(list);
}
return al;
}
}
我想编写一个 Junit 测试来测试所有情况。我正在尝试阅读有关如何使用 Junit 的文档,但我发现在这种情况下很难做到这一点。 有人可以通过给出一些指示或一个看起来像这个的例子来帮助我,这样我就可以测试所有的情况。
所以您已经编写了 class 并且想要测试它以查看是否有效。这里你可以用单元测试做什么:
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
public class Tests {
Partition sut = new Partition();
@Test
public void it_should_has_partition_size_2() {
ArrayList<ArrayList> partitioned = sut.partition(Arrays.asList(1,2,3,4),2);
assertEquals(partitioned.size(), 2); // we expecting size to be 2
assertEquals(partitioned.get(0), Arrays.asList(1,2,3)); // we know the first element should contains 1,2,3
}
@Test
public void it_should_fail() {
ArrayList<ArrayList> partitioned = main.partition(Arrays.asList(1,2,3,4),3);
assertEquals(partitioned.size(), 2);
// here it fails because we should expect partitioned.get(0) contains 1,2,3
assertEquals(partitioned.get(0), Arrays.asList(1,2));
/*
* to pass this test we should use the below method
* assertNotEquals(partitioned.get(0), Arrays.asList(1,2));
*/
}
}
当你 运行 时,第一个测试将通过,第二个测试将失败。 它给出了为什么第二个失败的解释:
junit 的 Maven 依赖项:
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
您的用例似乎很适合进行参数化测试。
JUnit 5 现在真的很成熟。所以我鼓励使用它。
单元测试的总体思路是识别场景:输入的内容和预期的内容。
在您的问题中,您已成功开始定义它们。
但是好的单元测试是不留漏洞的单元测试。所以你还必须识别和测试极端情况。
例如,您可以定义场景(并非详尽无遗,但可以给您一个想法):
partition([1,2,3,4,],2) will return ([1,2],[3,4]) // nominal case
partition([1,2,3,4,],3) will return ([1,2,3],[4]) // nominal case
partition([1,2,3,4,],5) will return () // corner case
partition([],2) will return () // corner case
现在为他们写一个测试:
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
public class PartitionTest {
@ParameterizedTest
@MethodSource("partitionFixture")
void partition(List<Integer> originalList, int partitionSize, List<List<Integer>> expectedListOfList) {
ArrayList<ArrayList<Integer>> actualListOfList = new Partition().partition(originalList, partitionSize);
Assertions.assertEquals(expectedListOfList, actualListOfList);
}
@SuppressWarnings("unused")
private static Stream<Arguments> partitionFixture() {
return Stream.of(Arguments.of(asList(1, 2, 3, 4), 2, asList(asList(1, 2), asList(3, 4))),
Arguments.of(asList(1, 2, 3, 4), 3, asList(asList(1, 2, 3), asList(4))),
Arguments.of(asList(1, 2, 3, 4), 5, asList()),
Arguments.of(asList(), 2, asList()));
}
}