目录
前言:
1.什么是Junit
2.Junit相关的技术
2.1注解
2.1.1@Test
2.1.2@Disable
2.1.3@BeforeAll和@AfterAll
2.1.4@BeforeEach和@AfterEach
2.2参数化
2.2.1单参数
2.2.2多参数
2.2.2.1CSV获取参数
2.2.2.2方法获取参数
2.3测试套件
2.3.1通过class运行测试用例
2.3.2通过包运行测试用例
2.4执行顺序
2.5断言
2.5.1断言相等
2.5.2断言不相等
2.5.3断言为空
2.5.4断言不为空
结束语:
在上一篇博客中小编主要与大家分享了该如何使用selenium来完成自动化测试,那么还有一种是Junit,Junit是单元测试的框架而Selenium是自动化测试的框架,Selenium是拿着一个技术写自动化测试用例,而Junit是拿着一个技术管理已经编写好的测试用例。所以两者之间还是有一定的差别的。接下来咱们就来谈谈Junit中相关的技术吧。
Junit是针对Java的一个单元测试框架。
在Junit注解主要有:
下面我们来给大家一一讲解演示一下。
在以前的代码中我们运行代码必须是通过主函数来进行运行的,如下所示:
代码展示:
public class Test02 {
public static void main(String[] args) {
Test();
}
private static void Test() {
System.out.println("这是一个Test方法");
}
}
结果展示:
那么通过@Test这样的一个注解我们就可以直接进行运行了,@Test表示当前这个方法是一个测试用,我们通过代码来感受一下。
代码展示:
package JunitTest;
import org.junit.jupiter.api.Test;
public class JunitTest01 {
@Test
void Test01() {
System.out.println("这是JunitTest里面的Test01");
}
}
这里我们就可以点击旁边的按钮来进行运行了。
注意:点击①是运行整个程序的代码。点击②只是运行Test01这一块的代码。
结果展示:
在上述中我们需要先去Maven中央仓库里导入依赖,步骤入下所示:
①打开Maven中央仓库点击搜索Junit。
②找到对应的依赖点击复制。(注:由于我们这里讲解的是Junit5,所以小编这里复制的是5.9.1里面的)
④点击刷新Maven。
@Disable表示直接忽视这块代码。
代码展示:
package JunitTest;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
public class JunitTest02 {
@Test
void Test01() {
System.out.println("这是JunitTest02里面的Test01");
}
@Test
void Test02() {
System.out.println("这是JunitTest02里面的Test02");
}
@Disabled
@Test
void Test03() {
System.out.println("这是JunitTest02里面的Test03");
}
}
如果没有该注释上面的代码执行结果应该是这样的。
但是如果有@Disable这个注释的话,Test03就会被忽视。
代码展示:
package JunitTest;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
public class JunitTest03 {
@Test
void Test01() {
System.out.println("这是JunitTest03里面的Test01");
}
@Test
void Test02() {
System.out.println("这是JunitTest03里面的Test02");
}
@Test
void Test03() {
System.out.println("这是JunitTest03里面的Test03");
}
@BeforeAll
static void SetUp() {
System.out.println("这是BeforeAll里面的语句");
}
@AfterAll
static void TearDown() {
System.out.println("这是AfterAll里面的语句");
}
}
需要注意的是我们要方法前面加上static,将他变成静态的,也就是类方法。
代码展示:
package JunitTest;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class JunitTest04 {
@Test
void Test01() {
System.out.println("这是JunitTest04里面的Test01");
}
@Test
void Test02() {
System.out.println("这是JunitTest04里面的Test02");
}
@Test
void Test03() {
System.out.println("这是JunitTest04里面的Test03");
}
@BeforeEach
void BeforeEachTest() {
System.out.println("这是BeforeEach里面的语句");
}
@AfterEach
void AfterEachTest() {
System.out.println("这是AfterEach里面的语句");
}
}
结果展示:
如果我们想要在方法中传入参数,会出现什么情况呢?如下所示。
代码展示:
package JunitTest;
import org.junit.jupiter.api.Test;
public class JunitTest05 {
@Test
void Test01(int i) {
System.out.println(i);
}
}
结果展示:
你会发现会报错,原因是因为我们没有给注册一个参数。那么此时我们该怎么办呢?这里就需要我们先在Maven里面导入一个依赖,如下所示:
将其复制到pom中,并刷新。
此时我们就可以使用注解@ ParameterizedTest了,通过该注解我们就可以实现传递参数了,具体的我们看下述操作。
我们通过@ValueSource就可以进行单参数的传递了。
代码展示:
package JunitTest;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class JunitTest05 {
@ParameterizedTest
@ValueSource(ints = {1,2,3})
void Test01(int num) {
System.out.println(num);
}
@ParameterizedTest
@ValueSource(strings = {"1", "2", "3"})
void Test02(String number) {
System.out.println(number);
}
}
结果展示:
如果我们想要进行多参数的传递那又该怎么传递呢?
可以通过@ CsvSource来进行传递,它既可以进行单参数的传递也可以进行多参数的传递。
单参数:
代码展示:
package JunitTest;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
public class JunitTest06 {
@ParameterizedTest
@CsvSource({"1","2","3"})
void Test02(String num) {
System.out.println(num);
}
}
结果展示:
多参数:
代码展示:
package JunitTest;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
public class JunitTest09 {
@ParameterizedTest
@CsvSource({"1,2", "3,4"})
void Test01(String str, int num) {
System.out.println(str + " : " + num);
}
}
结果展示:
也可以通过 @CsvFileSource来传递。
代码展示:
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
public class Test01 {
@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void Test01(int num, String name) {
System.out.println(num + ":" + name);
}
}
结果展示:
注意在上述代码中我们是通过以下的方式来创建一个.csv文件的。
然后就在文件中进行填写数据即可。
除了上述的三种方式之外我们还可以通过@MethodSource来传递参数。
代码展示:
package JunitTest;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.stream.Stream;
public class JunitTest08 {
public static Stream Generator() {
return Stream.of(Arguments.arguments(
"1","张三"
));
}
@ParameterizedTest
@MethodSource("Generator")
void Test01(String num, String name) {
System.out.println(num + ":" + name);
}
}
结果展示:
这里我们先在java文件夹中新建两个.class类。
代码展示:
代码①:
代码②:
import org.junit.jupiter.api.Test;
public class Test04 {
@Test
void Test04() {
System.out.println("Test04");
}
}
代码③:
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
@Suite
//通过class测试用例运行
@SelectClasses(value = {Test03.class,Test04.class})
public class RunSuite {
}
在上述代码中我们是通过class来运行的,这里我们来通过包来运行。
代码展示:
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
@Suite
//通过包来运行测试用例
@SelectPackages({"Test1","Test2"})
public class RunSuite2 {
}
结果展示:
我们先来看下面这个代码的执行顺序。
代码展示:
package JunitTest;
import org.junit.jupiter.api.Test;
public class JunitTest11 {
@Test
void A() {
System.out.println("A");
}
@Test
void B() {
System.out.println("B");
}
@Test
void C() {
System.out.println("C");
}
@Test
void D() {
System.out.println("D");
}
}
如果我们现在换一下代码块之间的顺序结果会是什么呢?
代码展示:
package JunitTest;
import org.junit.jupiter.api.Test;
public class JunitTest11 {
@Test
void D() {
System.out.println("D");
}
@Test
void A() {
System.out.println("A");
}
@Test
void C() {
System.out.println("C");
}
@Test
void B() {
System.out.println("B");
}
}
你会发现即是是换了代码的顺序,结果还是一样的没有变,那么我们该怎么让代码的顺序变动呢?
这里我们可以借助@TestMethodOrderer来指定执行的顺序,具体使用请看代码。
代码展示:
package JunitTest;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest11 {
@Order(1)
@Test
void D() {
System.out.println("D");
}
@Order(2)
@Test
void A() {
System.out.println("A");
}
@Order(3)
@Test
void C() {
System.out.println("C");
}
@Order(4)
@Test
void B() {
System.out.println("B");
}
}
通过上述的方法我们就可以让代码来按照我们指定的顺序来进行执行了。
如果我们需要对测试用例进行预期的判断,判断我们的结果是不是和我们的预期相符,那么此时我们就可以使用断言这样的操作来进行判断,这里我们具体看下面的代码案例。
代码展示:
package JunitTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class JunitTest12 {
@ParameterizedTest
@ValueSource(ints = {1})
void Test01(int num) {
System.out.println(num);
//在这里判断我们接收到的参数是不是1
Assertions.assertEquals(1,num);
}
}
结果展示:
我们可以看到结果展示的是1,那就说明我们的预期结果与实际结果是相符的。
代码展示:
package JunitTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class JunitTest13 {
@ParameterizedTest
@ValueSource(ints = {1})
void Test01(int num) {
System.out.println(num);
//在这里判断接收到的参数是不是与预期的不相符,也就是断言不相等
Assertions.assertNotEquals(1,num);
}
}
结果展示:
注意:这里是预期的如果与实际的相符的话就会报错!!!
断言为空就是判断接收到的值是不是空值。
代码展示:
package JunitTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class JunitTest14 {
@ParameterizedTest
@ValueSource(ints = {1})
void Test01(int num) {
System.out.println(num);
//判断断言是不是空值
Assertions.assertNull(num);
}
}
上述代码的结果表明接收到的值不为空。
断言不为空就是判断如果断言是空的话就报错,不为空才是正确的。
代码展示:
package JunitTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class JunitTest15 {
@Test
void Test01() {
String str = "1";
Assertions.assertNotNull(str);
System.out.println(str);
}
}
结果展示:
上述结果表明str不是空值。
希望这节对大家学习自动化测试有一定的帮助,下节中小编将重点给大家介绍一下Junit里的一些操作,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)