一、目标:对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
三、项目实践(重点代码):
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 {
}