【软件测试】单元测试工具---Junit详解

1.junit

1.1 junit是什么

JUnit是一个Java语言的单元测试框架。

虽然我们已经学习了selenium测试框架,但是有的时候测试用例很多,我们需要一个测试工具来管理这些测试用例,Junit就是一个很好的管理工具,简单来说Junit是一个针对Java单元测试的框架。Junit由Junit Platform _ Junit Jupiter + junit Vintage3部分组成。

1.2 Junit和Selenium的关系

Junit和Selenium是完全不同的两个东西!!!

在一个灯串上,如果说selenium编写的测试用例是一个小灯泡,那么junit就是把它们串起来的线。junit是用来管理selenium的测试用例的。

2.junit技术

2.0 前置工作

在pom.xml文件中添加依赖

引入selenium:

java 复制代码
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.7.2</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>

参数化:

java 复制代码
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.2</version>
        </dependency>       

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.9.2</version>
        </dependency>

测试套件:

java 复制代码
        <!-- 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>

2.1 junit常用注解

@Test

@Test表示当前的方法是一个测试用例

使用:

@Test

void + 方法名(){}

举例:

java 复制代码
    //表示当前的方法是一个测试用例
    @Test
    void Test01(){
        // 创建了一个options对象,用来给请求设置一些参数
        ChromeOptions options = new ChromeOptions();
        // 允许所有的请求
        options.addArguments("--remote-allow-origins=*");
        //设置驱动路径
        System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");
        // 创建了一个驱动
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度
        webDriver.get("https://www.baidu.com/");
    }

@BeforeAll 和 @AfterAll

这两个注解在整个测试的时候会执行一次。

@BeforeAll表示在当前类所有测试用例执行之前运行
@AfterAll表示在当前类所有测试用例执行之后运行
并且这两个方法都有static修饰,都只执行一次

使用:

@BeforeAll

static void 方法名(){}

举例:

java 复制代码
	//当前类里面所有的测试用例执行之前执行这个方法
    @BeforeAll
    static void SetUp(){
        System.out.println("开始执行@BeforeAll修饰的方法");
    }

使用:

@AfterAll

static void 方法名(){}

举例:

java 复制代码
	//当前类里面所有的测试用例执行之后执行这个方法
    @AfterAll
    static void TearDown(){
        System.out.println("开始执行@AfterAll对应的方法");
    }

运行结果:

@BeforeEach 和 @AfterEach

这两个注解会在每一个测试用例执行的时候都执行一次。

  • @BeforeEach表示在每个测试方法执行前运行
  • @AfterEach表示在每个测试方法执行后运行

举例:

java 复制代码
    @BeforeEach
    void BeforeTest(){
        System.out.println("这是一个@BeforeEach注解");
    }
    @AfterEach
    void AfterTest(){
        System.out.println("这是一个@AfterEach注解");
    }

结果:

@Disabled

作用:忽略当前的测试用例

举例:

java 复制代码
    //忽略当前的测试用例
    @Disabled
    //表示当前的方法是一个测试用例
    @Test
    void Test01(){
        // 创建了一个options对象,用来给请求设置一些参数
        ChromeOptions options = new ChromeOptions();
        // 允许所有的请求
        options.addArguments("--remote-allow-origins=*");
        //设置驱动路径
        System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");
        // 创建了一个驱动
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度
        webDriver.get("https://www.baidu.com/");
    }

结果:并没有执行这个测试用例

2.2 junit测试用例执行顺序

有人觉得junit的测试顺序是从上到下的,是这样吗?

先来看一个示例:

java 复制代码
    @Test
    void Test06(){
        System.out.println("这是测试用例5");
    }

    @Test
    void Test05(){
        System.out.println("这是测试用例4");
    }


    @Test
    void Test04(){
        System.out.println("这是测试用例3");
    }

    @Test
    void Test02(){
        System.out.println("这是测试用例1");
    }

    @Test
    void Test03(){
        System.out.println("这是测试用例2");
    }

结果:

以上结果表明了它不是按照从上到下执行的测试用例。

指定顺序执行

使用@TestMethodOrder(MethodOrderer.OrderAnnotation.class)+ @Order(数字)注解顺序执行测试用例。

举例:

java 复制代码
//按照指定顺序执行测试用例
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
    @Order(1)
    @Test
    void Test06(){
        System.out.println("这是测试用例5");
    }
    @Order(2)
    @Test
    void Test05(){
        System.out.println("这是测试用例4");
    }
    @Order(3)
    @Test
    void Test04(){
        System.out.println("这是测试用例3");
    }
    @Order(4)
    @Test
    void Test02(){
        System.out.println("这是测试用例1");
    }
    @Order(5)
    @Test
    void Test03(){
        System.out.println("这是测试用例2");
    }
}

结果:

是按照order里面的顺序执行的。

随机执行

使用@TestMethodOrder(MethodOrderer.Random.class)随机执行测试用例。

举例:

java 复制代码
//按照随机顺序执行测试用例
@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest {
    @Order(1)
    @Test
    void Test06(){
        System.out.println("这是测试用例5");
    }
    @Order(2)
    @Test
    void Test05(){
        System.out.println("这是测试用例4");
    }
    @Order(3)
    @Test
    void Test04(){
        System.out.println("这是测试用例3");
    }
    @Order(4)
    @Test
    void Test02(){
        System.out.println("这是测试用例1");
    }
    @Order(5)
    @Test
    void Test03(){
        System.out.println("这是测试用例2");
    }
}

2.3 参数化测试

测试方法一般需要传参数。

单参数

使用 @ParameterizedTest + @ValueSource() 配合传递单参数

@ParameterizedTest : 注册参数

!!!注意:这两个注解不能和@Test一起使用,并且只能传一种类型的参数

示例:

java 复制代码
    @ParameterizedTest  //注册
    @ValueSource(strings = {"1","2","3"})
    void Test07(String str){
        System.out.println(str);
    }

结果:

多参数

上面只可以传入一种类型的参数,所以如果我们需要传入多种类型的参数,就可以使用csv 。

CSV

①直接传参数:使用@ParameterizedTest + @CsvSource()配合

举例:

java 复制代码
    @ParameterizedTest
    @CsvSource({"1,2","3,4"})
    void Test08(String str,int num){
        System.out.println(str+" "+num);
    }

结果:

②传递文件:使用@ParameterizedTest+ @CsvFileSource(resources = "文件名.csv")配合

!!!注意:文件必须是.csv类型

示例:

java 复制代码
    @ParameterizedTest
    @CsvFileSource(resources = "test01.csv")
    void Test09(int id,String name){
        System.out.println("id="+id+",name="+name);
    }

test01.csv文件内容:

java 复制代码
1,温温
2,苏苏
3,怜怜

结果:

方法传参

使用@ParameterizedTest + @MethodSource("方法名") 传入一个方法

示例:

java 复制代码
    @ParameterizedTest  //注册参数
    @MethodSource("Generator")  //注册的参数是什么
    void Test10(String num,String name){
        System.out.println(num+" "+name);
    }

Generator方法代码:

java 复制代码
	public static Stream<Arguments> Generator() {
        return Stream.of(Arguments.arguments("1,温温","2,苏苏"));
    }

结果:

2.4 断言

在软件测试中,断言(Assertion)是一种用于检查程序或系统在执行某些操作或运行某些代码后是否符合预期行为的技术手段。在测试中,断言通常用于验证代码的正确性,确保代码在满足特定条件时会产生预期的结果。

示例:

java 复制代码
    @ParameterizedTest
    @ValueSource(ints = {10})
    void Test11(int num){
        //断言相等
        Assertions.assertEquals(num,10);
        //断言不相等
        Assertions.assertNotEquals(num,11);
    }
java 复制代码
    @ParameterizedTest
    @ValueSource(strings = {"1"})
    void Test11(int num){
        //断言为空
        Assertions.assertNull(num);
        //断言不为空
        Assertions.assertNotNull(num);
    }

2.5 测试套件

测试套件(test suite)有时也称为验证套件(validation suite),是许多测试用例的集合,测试用例可用来测试一程式是否正确工作,测试套件包括许多测试用例,一般也会有针对测试用例及其测试目的的详细说明,在进行测试时的系统组态资讯以及测试前需进行的步骤。

通过测试套件,将服务于同一个测试目的或同一运行环境下的一系列测试用例有机的组合起来。测试套件是按照测试计划所定义的各个阶段的测试目标决定的,即先有测试计划,后面才有测试套件。

例如:此时有三个类的测试用例都需要测试。

通过测试套件全部测试:

方法①:在括号中写入测试类

java 复制代码
@Suite
@SelectClasses({JunitTest.class, JunitTest02.class})
public class RunSuite {
}

方法②:根据指定的包来运行多个测试用例

java 复制代码
@Suite
@SelectPackages({"org.example.junit01","org.example.junit"})
public class RunSuit {
}
相关推荐
m0_571957582 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2344 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
测开小菜鸟6 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity7 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天7 小时前
java的threadlocal为何内存泄漏
java
caridle7 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^7 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋37 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx