自动化测试Junit(测试系列8)

目录

前言:

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中相关的技术吧。

1.什么是Junit

Junit是针对Java的一个单元测试框架。

2.Junit相关的技术

2.1注解

在Junit注解主要有:

  • @Test
  • @Disable
  • @BeforeAll,@AfterAll
  • @BeforEach,@AfterEach

下面我们来给大家一一讲解演示一下。

2.1.1@Test

在以前的代码中我们运行代码必须是通过主函数来进行运行的,如下所示:

代码展示:

public class Test02 {
    public static void main(String[] args) {
        Test();
    }

    private static void Test() {
        System.out.println("这是一个Test方法");
    }
}

结果展示:

自动化测试Junit(测试系列8)_第1张图片

那么通过@Test这样的一个注解我们就可以直接进行运行了,@Test表示当前这个方法是一个测试用,我们通过代码来感受一下。

代码展示:

package JunitTest;

import org.junit.jupiter.api.Test;

public class JunitTest01 {
    @Test
    void Test01() {
        System.out.println("这是JunitTest里面的Test01");
    }
}

这里我们就可以点击旁边的按钮来进行运行了。

自动化测试Junit(测试系列8)_第2张图片

注意:点击①是运行整个程序的代码。点击②只是运行Test01这一块的代码。

结果展示: 

自动化测试Junit(测试系列8)_第3张图片

在上述中我们需要先去Maven中央仓库里导入依赖,步骤入下所示:

①打开Maven中央仓库点击搜索Junit。

自动化测试Junit(测试系列8)_第4张图片

②找到对应的依赖点击复制。(注:由于我们这里讲解的是Junit5,所以小编这里复制的是5.9.1里面的)

自动化测试Junit(测试系列8)_第5张图片

自动化测试Junit(测试系列8)_第6张图片③将依赖粘贴到pom文件中。

自动化测试Junit(测试系列8)_第7张图片

④点击刷新Maven。

自动化测试Junit(测试系列8)_第8张图片 

2.1.2@Disable

@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");
    }
}

如果没有该注释上面的代码执行结果应该是这样的。

自动化测试Junit(测试系列8)_第9张图片

但是如果有@Disable这个注释的话,Test03就会被忽视。

自动化测试Junit(测试系列8)_第10张图片

 

2.1.3@BeforeAll和@AfterAll

  • @BeforeAll是指在所有的测试用例运行之前跑对应的方法。
  • @AfterAll是指在所有的测试用例运行之后跑对应的方法。

代码展示:

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里面的语句");
    }
}


结果展示:
自动化测试Junit(测试系列8)_第11张图片

需要注意的是我们要方法前面加上static,将他变成静态的,也就是类方法。

自动化测试Junit(测试系列8)_第12张图片 

2.1.4@BeforeEach和@AfterEach 

  • @BeforeEach:在每一个测试用例之前跑对应的代码。
  • @AfterEach :在每一个测试用例之后跑对应的代码。

代码展示:

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里面的语句");
    }
}


结果展示:

自动化测试Junit(测试系列8)_第13张图片

 

2.2参数化

如果我们想要在方法中传入参数,会出现什么情况呢?如下所示。

代码展示:

package JunitTest;

import org.junit.jupiter.api.Test;

public class JunitTest05 {
    @Test
    void Test01(int i) {
        System.out.println(i);
    }
}


结果展示:

自动化测试Junit(测试系列8)_第14张图片

你会发现会报错,原因是因为我们没有给注册一个参数。那么此时我们该怎么办呢?这里就需要我们先在Maven里面导入一个依赖,如下所示:

自动化测试Junit(测试系列8)_第15张图片

 自动化测试Junit(测试系列8)_第16张图片


 自动化测试Junit(测试系列8)_第17张图片

将其复制到pom中,并刷新。

自动化测试Junit(测试系列8)_第18张图片 

此时我们就可以使用注解@ ParameterizedTest了,通过该注解我们就可以实现传递参数了,具体的我们看下述操作。

2.2.1单参数

我们通过@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);
    }
}


结果展示:

自动化测试Junit(测试系列8)_第19张图片

2.2.2多参数

2.2.2.1CSV获取参数

如果我们想要进行多参数的传递那又该怎么传递呢?

可以通过@ 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);
    }

}

结果展示:

自动化测试Junit(测试系列8)_第20张图片

多参数:
代码展示:

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);
    }
}

结果展示:

自动化测试Junit(测试系列8)_第21张图片

 

也可以通过 @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);
    }
}


结果展示:

自动化测试Junit(测试系列8)_第22张图片

注意在上述代码中我们是通过以下的方式来创建一个.csv文件的。

自动化测试Junit(测试系列8)_第23张图片

自动化测试Junit(测试系列8)_第24张图片 

 然后就在文件中进行填写数据即可。

2.2.2.2方法获取参数

除了上述的三种方式之外我们还可以通过@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);
    }
}

结果展示:

自动化测试Junit(测试系列8)_第25张图片

2.3测试套件

2.3.1通过class运行测试用例

这里我们先在java文件夹中新建两个.class类。

自动化测试Junit(测试系列8)_第26张图片

代码展示:

代码①:
​​​​​​​代码②:

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 {
}

结果展示:
自动化测试Junit(测试系列8)_第27张图片
  

2.3.2通过包运行测试用例

在上述代码中我们是通过class来运行的,这里我们来通过包来运行。

代码展示:

import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;

@Suite
//通过包来运行测试用例
@SelectPackages({"Test1","Test2"})
public class RunSuite2 {
}

 结果展示:

自动化测试Junit(测试系列8)_第28张图片

2.4执行顺序

我们先来看下面这个代码的执行顺序。

代码展示:

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");
    }
}


结果展示:
自动化测试Junit(测试系列8)_第29张图片

如果我们现在换一下代码块之间的顺序结果会是什么呢?

代码展示:

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");
    }
}


结果展示:
自动化测试Junit(测试系列8)_第30张图片 

你会发现即是是换了代码的顺序,结果还是一样的没有变,那么我们该怎么让代码的顺序变动呢?

这里我们可以借助@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");
    }
}


结果展示:
自动化测试Junit(测试系列8)_第31张图片

通过上述的方法我们就可以让代码来按照我们指定的顺序来进行执行了。

2.5断言

如果我们需要对测试用例进行预期的判断,判断我们的结果是不是和我们的预期相符,那么此时我们就可以使用断言这样的操作来进行判断,这里我们具体看下面的代码案例。

2.5.1断言相等

代码展示:

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);
    }
}

结果展示:

自动化测试Junit(测试系列8)_第32张图片

我们可以看到结果展示的是1,那就说明我们的预期结果与实际结果是相符的。 

2.5.2断言不相等

代码展示:

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);
    }
}

结果展示:

自动化测试Junit(测试系列8)_第33张图片

注意:这里是预期的如果与实际的相符的话就会报错!!!

2.5.3断言为空

断言为空就是判断接收到的值是不是空值。

代码展示:

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);
    }
}


结果展示:
自动化测试Junit(测试系列8)_第34张图片

上述代码的结果表明接收到的值不为空。

2.5.4断言不为空

断言不为空就是判断如果断言是空的话就报错,不为空才是正确的。

代码展示:

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);
    }
}


结果展示:

自动化测试Junit(测试系列8)_第35张图片

上述结果表明str不是空值。

结束语:

希望这节对大家学习自动化测试有一定的帮助,下节中小编将重点给大家介绍一下Junit里的一些操作,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

你可能感兴趣的:(测试,junit)