JUNIT5测试框架实践一

一、目标:对Calculator类中的方法进行用例测试

二、关键知识点:

1)问题:sum方法返回值为Int型,concatStr方法返回值为String型,如何在AfterEach返回不同类型的值

解决方法:添加判定,使用testInfo;

代码如下:

    void tearDown(TestInfo testInfo){
        String displayName = testInfo.getDisplayName();
        System.out.println("displayName:"+ displayName);
        //Optional<Method> testMethod = testInfo.getTestMethod();
        testInfo.getTestMethod().map(Method::getName).filter(str -> str.startsWith("str"));
        String str1 = Optional
                .ofNullable(str1Result).orElseGet(() -> String.valueOf(result));

        //在测试方法得到结果后log打印:计算结果:result
        logger.info("计算结果:"+ str1);
        //在每个测试方法之后进行销毁ID操作
        calculator.destroyId();
    }

2)问题:@ParameterizedTest(name = “{argumentsWithNames}”) 没有生效

解决方法:maven-compiler-plugin插件中添加true

image

三、项目实践(重点代码):

1、业务代码、POM、 日志 logback.xml 配置:见课程贴 06-19 Junit5测试框架实战(一)

2、测试代码如下:

1)添加BaseTest,存放公共变量和方法;

package com.ceshiren;

import org.junit.jupiter.api.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Method;
import java.util.Optional;

import static java.lang.String.valueOf;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;

public class BaseTest {

    public static Logger logger;
    public int result;
    public String str1Result;
    public static Calculator calculator;

    //todo:根据需求编写对应的测试用例:加法,减法,string拼接
    @BeforeAll
    static void  setUpAll(){
        logger = LoggerFactory.getLogger(BaseTest.class);
        //第一步:打开计算器
        calculator = new Calculator("新型计算器");

    }
    @BeforeEach
    void setUp(){
        //在每个测试方法之前log打印:开始进行计算
        logger.info("开始进行计算");
        //在每个测试方法之前生成运行的唯一ID标识
        calculator.initId();
    }

    @AfterEach
    void tearDown(TestInfo testInfo){
        String displayName = testInfo.getDisplayName();
        System.out.println("displayName:"+ displayName);
        Optional<Method> testMethod = testInfo.getTestMethod();

        testInfo.getTestMethod().map(Method::getName).filter(str -> str.startsWith("str"));
        String str1 = Optional
                .ofNullable(str1Result).orElseGet(() -> String.valueOf(result));

        //在测试方法得到结果后log打印:计算结果:result
        logger.info("计算结果:"+ str1);
        //在每个测试方法之后进行销毁ID操作
        calculator.destroyId();

    }

    @AfterAll
    static void tearDownAll(){
        //在调用完所有测试用例后执行关闭计算器app操作
        calculator.close();
    }
}

2) CalculatorTest类测试Calculator类中sum方法

import org.junit.jupiter.params.provider.MethodSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import java.util.stream.Stream;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.params.ParameterizedTest.ARGUMENTS_PLACEHOLDER;

@DisplayName("加法运算")
//@TestMethodOrder(MethodOrderer.DisplayName.class)
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class CalculatorTest extends BaseTest {

    static Stream<Arguments> calculatortest01(){
        return Stream.of(
                Arguments.arguments(1,2,3),
                Arguments.arguments(12,22,34),
                Arguments.arguments(2,3,5)
        );
    }

    @ParameterizedTest(name = "{argumentsWithNames}")
    //@ParameterizedTest(name = ARGUMENTS_PLACEHOLDER)
    //{arguments} 1,1,2
    //{argumentsWithNames} a=1,b=1,c=2
    @DisplayName("加法03")
//index 执行索引,从1开始
//    @ParameterizedTest(name = "[{index}] : {0}+{1}={2}")
    @MethodSource()
    @Order(33)
    @Tag("parameterTest")
    public void calculatortest01(int a,int b,int c){
        result = calculator.sum(a,b);
        //junit5
//        assertEquals(20,result);
        assertThat("计算结果01错误",result,is(equalTo(c)));
    }

    @Test
    @DisplayName("加法02")
    @Order(11)
    public void calculatortest02(){
        result = calculator.sum(12,8);
        //junit5
//        assertEquals(2,result);
        assertThat("计算结果02错误",result,is(equalTo(20)));
    }

}

3)测试Calculator类中concatStr方法

public class StrTest extends BaseTest {
    @Test
    @Tag("str")
    void str1Test(){
        str1Result = calculator.concatStr("hello","Junit5");
        assertEquals("hello Junit5",str1Result,"message");
    }
}

4)添加suit包,创建SuitTest类

package com.ceshiren.suit;

import org.junit.platform.suite.api.IncludeTags;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;


@Suite
@SelectClasses(
        {
                com.ceshiren.num.SubTest2.class,
                com.ceshiren.num.SubTest1.class,
                com.ceshiren.num.CalculatorTest.class,
                com.ceshiren.str.StrTest.class//包名.类名.方法名
        }
)
@IncludeTags({
        "parameterTest",//Tag标签名
        "str"//Tag标签名

})
@SuiteDisplayName("suit的displayName")
public class SuitTest {
}
1 个赞

建议代码使用代码块格式


import org.junit.platform.suite.api.IncludeTags;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;


@Suite
@SelectClasses(
        {
                com.ceshiren.num.SubTest2.class,
                com.ceshiren.num.SubTest1.class,
                com.ceshiren.num.CalculatorTest.class,
                com.ceshiren.str.StrTest.class//包名.类名.方法名
        }
)
@IncludeTags({
        "parameterTest",//Tag标签名
        "str"//Tag标签名

})
@SuiteDisplayName("suit的displayName")
public class SuitTest {
}

修改好了~ :smiley: