java系列2:java测试框架Junit5+Allure+Mockito

1. Junit5

1.1 框架

结构上变成了:JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

  • JUnit Platform: Junit Platform是在JVM上启动测试框架,可以接入各种引擎。
  • JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。运行在上面的JUnit Platform中。
  • JUnit Vintage: 兼容JUnit4.x,Junit3.x测试引擎。
    web测试的话,可以用postman

下面是个简单的例子:

import org.junit.jupiter.api.Test; //注意这里使用的是jupiter的Test注解!!
public class TestDemo {
  @Test
  @DisplayName("第一次测试")
  public void firstTest() {
      System.out.println("hello world");
  }

1.2 注解

Junit5多了很多新的tag

@Test :表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试
@ParameterizedTest :表示方法是参数化测试,下方会有详细介绍
@RepeatedTest :表示方法可重复执行,下方会有详细介绍
@DisplayName :为测试类或者测试方法设置展示名称
@BeforeEach :表示在每个单元测试之前执行
@AfterEach :表示在每个单元测试之后执行
@BeforeAll :表示在所有单元测试之前执行
@AfterAll :表示在所有单元测试之后执行
@Tag :表示单元测试类别,类似于JUnit4中的@Categories
@Disabled :表示测试类或测试方法不执行,类似于JUnit4中的@Ignore
@Timeout :表示测试方法运行如果超过了指定时间将会返回错误
@ExtendWith :为测试类或测试方法提供扩展类引用

这里介绍一下tag。利用 Tag 标签,用户可以比较方便地根据标注来分类,并在执行时快速根据分类来针对性地运行测试。在 Junit5 中添加 Tag 是通过 @Tag 注解来实现的
Junit5 也支持直接读取自定义的注解,比如我们自定义一个注解 QiucaoTag,将 @Tag(“qiucao”) 和 @Test 注解聚合,来简化标注操作。

@QiucaoTag
void customTag(TestInfo info) {
    System.out.println(info.getTags());
}

自定义注解类如下:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("qiucao")
@Test
public @interface QiucaoTag {}

1.3 断言

除了传统的assertion外,JUnit5提供了一些新的断言方式。Assertions.assertThrows() ,配合函数式编程就可以进行使用。

@Test
@DisplayName("异常测试")
public void exceptionTest() {
    ArithmeticException exception = Assertions.assertThrows(
           //扔出断言异常
            ArithmeticException.class, () -> System.out.println(1 % 0));
}

Junit5还提供了Assertions.assertTimeout() 为测试方法设置了超时时间

@Test
@DisplayName("超时测试")
public void timeoutTest() {
    //如果测试方法时间超过1s将会异常
    Assertions.assertTimeout(Duration.ofMillis(1000), () -> Thread.sleep(500));
}

1.4 参数化测试

@ValueSource:指定入参,支持八大基础类以及String类型,Class类型
@NullSource: 表示为参数化测试提供一个null的入参
@EnumSource: 表示为参数化测试提供一个枚举入参
下面是例子

@ParameterizedTest
@ValueSource(strings = {"one", "two", "three"})
@DisplayName("参数化测试1")
public void parameterizedTest1(String string) {
    System.out.println(string);
    Assertions.assertTrue(StringUtils.isNotBlank(string));
}

1.5 测试用例参数化

Junit5中支持给测试方法提供参数,提高了测试数据管理的便利性。内建的几种数据源

// ValueSource
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testWithValueSource(int argument) {
   assertTrue(argument > 0 && argument < 4);
}
//EnumSource
@ParameterizedTest
@EnumSource(TimeUnit.class)
void testWithEnumSource(TimeUnit timeUnit) {
   assertNotNull(timeUnit);
}
//还可以提供数据的例外处理,正则匹配等
@ParameterizedTest
@EnumSource(value = TimeUnit.class, mode = EXCLUDE, names = { "DAYS", "HOURS" })
void testWithEnumSourceExclude(TimeUnit timeUnit) {
   assertFalse(EnumSet.of(TimeUnit.DAYS, TimeUnit.HOURS).contains(timeUnit));
   assertTrue(timeUnit.name().length() > 5);
}
//or
@ParameterizedTest
@EnumSource(value = TimeUnit.class, mode = MATCH_ALL, names = "^(M|N).+SECONDS$")
void testWithEnumSourceRegex(TimeUnit timeUnit) {
   String name = timeUnit.name();
   assertTrue(name.startsWith("M") || name.startsWith("N"));
   assertTrue(name.endsWith("SECONDS"));
}
//MethodSource
@ParameterizedTest
@MethodSource("stringProvider")
void testWithSimpleMethodSource(String argument) {
   assertNotNull(argument);
}
static Stream<String> stringProvider() {
   return Stream.of("foo", "bar");
}
//CsvSource
@ParameterizedTest
@CsvSource({ "foo, 1", "bar, 2", "'baz, qux', 3" })
void testWithCsvSource(String first, int second) {
     assertNotNull(first);
     assertNotEquals(0, second);
}
//CsvFileSource
@ParameterizedTest
@CsvFileSource(resources = "/two-column.csv", numLinesToSkip = 1)
void testWithCsvFileSource(String first, int second) {
     assertNotNull(first);
     assertNotEquals(0, second);
}

2. Allure

2.1 创建junit测试的方法

在要测试的类上按快捷键ctrl + shift + t,选择Create New Test,在出现的对话框的下面member内勾选要测试的方法,点击ok

或者点击菜单栏Navigate–>test,选择Create New Test,在出现的对话框的下面member内勾选要测试的方法,点击ok

2.2 Allure安装与配置。

详细安装步骤看这里
首先把junit配置好,去intelliJ idea->Preference->Plugins中,安装MavenTestSupportPlugin。然后选中要单元测试的项目,按command+shift+t生成test。注意junit5还要再安装两个库。

brew install allure #进行安装
allure --version # 查看版本号
#这个命令最常使用的,生成web报告。
allure serve [path of allure result] 
# 生成测试报告,可以携带一个 -c 参数先清空之前的结果。
allure generate [path of allure result]
# 打开已经生产的测试报告:这个命令则会启动一个 Web 服务将打开。

在这里插入图片描述
在这里插入图片描述

3. mockito

mockito可以模拟真实环境,Mock测试就是在测试的过程中,对于某些不容易构造的,如HttpServletRequest必须在Servlet容器中才能构造出来,或者不容易获取比较复杂的对象(如JDBC中的ResultSet对象),用一个虚拟的对象(Mock对象)来创建以便测试的测试方法

Mock最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,他能帮你模拟这些依赖,并帮你验证所调用的依赖的行为

import org.junit.Test;

import java.util.LinkedList;
import static org.mockito.Mockito.*;


public class test {
    LinkedList linkedList =  mock(LinkedList.class);
    @Test
    public void test(){
        //创建linkedlist

        System.out.println(linkedList.get(0)); //null
    }

    //方法调用的方绘制
    @Test
    public void test2(){ //模拟方法的调用的返回值
        when(linkedList.get(0)).thenReturn("first"); //当调用get(0)是返回first
        System.out.println(linkedList.get(0)); //输出first
    }

    //方法调用抛出异常
    //模拟获取第二个元素时,抛出runtimeException
    @Test
    public void test3(){
        when(linkedList.get(1)).thenReturn(new RuntimeException());
        System.out.println(linkedList.get(1));
    }

    //调用方法时的参数匹配
    @Test
    public void test4(){
        when(linkedList.get(anyInt())).thenReturn("element");
        System.out.println(linkedList.get(100)); //返回element -任意index都会返回element
    }
    ```
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java是一种高级编程语言,应用广泛,可以用于开发各种类型的程序。JUnit5Java开发中非常流行的测试框架,可以对代码单元进行测试,确保程序的正确性。Maven是Java开发者常用的构建工具,帮助开发者管理项目依赖、构建和管理项目。 Jenkins是一个持续集成工具,可以帮助开发者自动化地构建、测试和部署代码,并且支持多种编程语言。Selenium是一个广泛使用的自动化测试工具,可以模拟用户行为,测试Web应用程序并进行UI测试。通常与JavaJUnit5一起使用,可以大大简化测试过程,提高测试效率和可靠性。综上所述,JavaJUnit5、Maven、Jenkins和Selenium是Java开发者常用的一些重要工具,它们结合使用可以提高开发效率和代码质量,同时也有助于保障Web应用程序的可靠性和稳定性。 ### 回答2: Java是一种计算机编程语言,广泛用于开发企业级应用程序和移动应用程序。它是一种跨平台语言,可以在各种操作系统上运行。其面向对象的语言特性使得开发人员可以更轻松地构建可维护、可扩展的应用。 JUnit 5是一个开源的Java测试框架,可用于编写单元测试,集成测试和功能测试。它提供了丰富的测试注解和断言,能够优化测试开发过程。JUnit 5支持Java 8及以上版本,并且具有更好的可扩展性和灵活性。 Maven是一个Java项目管理和构建工具,可以自动下载项目依赖库,并负责编译,测试,打包和发布应用程序。它可以管理多个项目和模块,并且具有统一的目录结构和构建流程,提高了项目的可维护性和开发效率。 Jenkins是一个自动化构建和持续集成工具,可以监控版本控制系统中的代码变化,自动触发构建和测试,并且能够将构建结果进行分析和报告。Jenkins支持插件扩展,可以轻松地与其他工具集成,提高了持续集成的灵活性和可靠性。 Selenium是一个自动化Web应用测试工具,可以模拟用户交互,进行功能测试,回归测试和性能测试。它支持多种编程语言,包括Java和JUnit 5,并且能够在不同的浏览器和操作系统上运行,是开发Web应用的重要工具。 ### 回答3: Java是一种广泛使用的编程语言,它具有面向对象的特点,可以在不同的平台上运行。Junit5Java中使用的测试框架,可以用来编写测试用例、测试断言和执行测试。Maven是Java的一个构建工具,可以管理项目中的依赖项、编译、测试、打包和部署等过程。Jenkins是一个流行的持续集成工具,可以对Java项目进行持续集成和自动化测试。Selenium是一种自动化测试工具,可以用来模拟浏览器行为,自动化测试Web应用程序。 在Java的开发过程中,常常需要进行测试,以保证程序的质量和正确性。Junit5Java中使用的一个成熟的测试框架,它可以用来编写测试用例、测试断言和执行测试等操作。Maven可以管理项目中的依赖项、编译、测试、打包和部署等过程,可以大大简化项目的构建和管理。Jenkins可以集成Junit5和Selenium等测试工具,对Java项目进行持续集成和自动化测试,大大提高开发效率和代码质量。 Selenium是一种自动化测试工具,可以用来模拟浏览器行为,对Web应用程序进行自动化测试。它可以模拟用户在浏览器中的操作,比如单击、输入、滚动、切换窗口等,通过代码自动化地执行这些操作,并对应用程序的响应结果进行断言和验证。因此,Selenium非常适合用于测试Web应用程序。结合Junit5和Jenkins等工具,可以实现自动化的测试流程,提高测试效率和准确度。 综上所述,JavaJunit5、Maven、Jenkins和Selenium是Java开发中常用的一些工具和框架,它们可以提高开发效率,保证程序的质量和稳定性,是Java开发者必备的知识点和技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值