目录
1.为什么要学习Junit
虽然我们已经学习了selenium测试框架,但是有的时候测试用例很多,我们需要一个测试工具来管理这些测试用例,Junit就是一个很好的管理工具,简单来说Junit是一个针对Java单元测试的框架
Junit由Junit Platform _ Junit Jupiter + junit Vintage3部分组成,
2.Junit的使用
2.1.添加Maven依赖
需要在pop.xml中添加相应的依赖,这里给出一个汇总
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
</dependencies>
2.2.注解
2.2.1@Test
表示当前的方法是测试方法
public class JunitTest {
@Test
public void Teat02() {
System.out.println("测试用例2");
}
@Test
public void Teat01() {
System.out.println("测试用例1");
}
}
点击类左边的运行箭头就可以运行类中所有的测试方法,结果如下
2.2.2@BeforeAll和@AfterAll
- @BeforeAll表示在当前类所有测试用例执行之前运行
- @AfterAll表示在当前类所有测试用例执行之后运行
- 并且这两个方法都有static修饰,都只执行一次
public class JunitTest {
// 当前类里的所有测试用例执行之后执行该方法
@AfterAll
static void Teat04() {
System.out.println("测试用例AfterAll");
}
// 当前类里的所有测试用例执行之前执行该方法
@BeforeAll
static void Teat03() {
System.out.println("测试用例BeforeAll");
}
@Test
void Teat02() {
System.out.println("测试用例2");
}
@Test
void Teat01() {
System.out.println("测试用例1");
}
}
可以看到结果如下:
所以通常情况下,创建驱动打开网页都放在@BeforeAll下,关闭网页都放在AfterAll下
2.2.3BeforeEach和AfterEach
@BeforeEach表示在每个测试方法执行前运行
@AfterEach表示在每个测试方法执行后运行
public class JunitTest {
@AfterEach
void test06() {
System.out.println("测试用例AfterEach");
}
@BeforeEach
void test05() {
System.out.println("测试用例BeforeEach");
}
// 当前类里的所有测试用例执行之后执行该方法
@AfterAll
static void Teat04() {
System.out.println("测试用例AfterAll");
}
// 当前类里的所有测试用例执行之前执行该方法
@BeforeAll
static void Teat03() {
System.out.println("测试用例BeforeAll");
}
@Test
void Teat02() {
System.out.println("测试用例2");
}
@Test
void Teat01() {
System.out.println("测试用例1");
}
}
可以看到,除了static修饰的@BeforeAll和@AfterAll,其余测试方法每次执行前后都执行了@BeforeEach和@AfterEach
2.2.4@Disabled
表示忽略当前的测试用例,不执行
可以看到运行结果和上面一样,并没有执行Disabled
2.2.5 指定测试用例的执行顺序
类注解@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
给类里面的方法加上注解@Order(数字),按照数字的大小从小到大的顺序运行
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitOrder {
@Order(2)
@Test
void Teat01() {
System.out.println("测试用例1");
}
@Order(0)
@Test
void Teat02() {
System.out.println("测试用例2");
}
@Order(-2)
@Test
void Teat03() {
System.out.println("测试用例3");
}
}
2.2.6随机顺序执行 (不建议使用,不可控)
2.3参数化测试
测试方法一般需要传参数
2.3.1单参数
@ParameterizedTest
@ValueSource(strings = {"1", "2", "3"})
注意:这两个注解不能和@Test一起使用,并且只能传一种类型的参数
public class JunitTest02 {
@ParameterizedTest
@ValueSource(strings = {"1", "2", "3"})
void Teat02(String str) {
System.out.println(str);
System.out.println("测试用例2");
}
}
2.3.2多参数
上面只可以传入一种类型的参数,所以如果我们需要传入多种类型的参数,就可以使用csv
1)CSV
① @ParameterizedTest
@CsvSource({"1,2", "3,4"})
@ParameterizedTest
@CsvSource({"1,2", "3,4"})
void Teat01(String str, Integer num) {
System.out.println(str + " " + num);
}
可以看到两种类型都成功打印出来了
② 当多种类型参数有很多的时候,我们可以使用
@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
括号里面输入以csv结尾的文件啦啊传入大量参数
@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void Teat03(Integer id, String name) {
System.out.println("id = " + id + "name = " + name);
}
执行后结果如下:
2)方法
使用 @ParameterizedTest
@MethodSource("Generator")传入一个方法
private static Stream<Arguments> Generator() {
return Stream.of(Arguments.arguments("1, 小张", "2, 锦鲤"));
}
@ParameterizedTest
@MethodSource("Generator")
void test04(String num, String name) {
System.out.println("num = " + num + "name = " + name);
}
更多方法请到官方文档查看
JUnit执行过程 - jUnit教程 | 编程字典 (codingdict.com)
2.4断言
2.4.1断言相等
@ParameterizedTest
@ValueSource(ints = {10})
void test05(int num) {
Assertions.assertEquals(num, 10);
}
相等所以正常运行
2.4.2断言不想等
@ParameterizedTest
@ValueSource(ints = {10})
void test06(int num) {
Assertions.assertNotEquals(num, 10);
}
相等所以报错了
2.4.3断言为空,不为空
@ParameterizedTest
@ValueSource(ints = {1})
void test06(Integer num) {
// 断言为空
Assertions.assertNull(num);
// 断言不为空
Assertions.assertNotNull(num);
}
2.5套件
1)可以运行多个类中的多个测试用例
@Suite
@SelectClasses({JunitTest.class, JunitOrder.class, JunitOrder.class})
括号中可以重复写入多个测试类
@Suite
@SelectClasses({JunitTest.class, JunitOrder.class, JunitOrder.class})
public class RunSuite {
}
2)根据指定的包来运行多个类测试用例
@Suite
@SelectPackages({"Test"})
public class RunSuite {
}
以上就是此次分享的全部内容了,下篇博客见~