jdk版本要求不一样
断言Assertions
假定Assumptions
标记与过滤
测试用例簇(Test Suites)
JUnit5允许测试非public方法
第三方集成
具体请看 JUnit4和JUnit5的主要区别_junit4和junit5的区别_pilaf1990的博客-CSDN博客
Container
测试树中包含其他容器或测试作为其子节点的节点(例如测试类)。
Test
测试树中的一个节点,用于验证执行时的预期行为(例如方法)。
生命周期方法
任何直接用 、、或进行注释或元注释的方法。
测试类
任何顶级类、成员类或类 至少包含一个测试方法的,即容器。测试类不能而且必须有一个构造函数。
测试方法
任何用, , , , 或直接注解或元注解的实例方法 。除了,它们在测试树中 创建一个容器,用于对测试进行分组,或者可能(对于),其他容器。
测试类、测试方法和生命周期方法不需要是,但它们不能是
@DisplayName("A special test case")
class. 自带的不好用
第三方库
AssertJ、Hamcrest、Truth
assumeTrue("CI".equals(System.getenv("ENV"))); 如果报错,灰色,测试跳过,不是失败 //一些其他用法 assumingThat("CI".equals(System.getenv("ENV")), () -> { // perform these assertions only on the CI server 只在C1环境断言 assertEquals(2, calculator.calculate("4/2")); });
@Disabled
类和方法上都可用
在package org.junit.jupiter.api.condition包下
@Test @EnabledOnOs({ LINUX, MAC }) @Test @EnabledOnOs(value = MAC, architectures = "aarch64") @EnabledOnJre({ JAVA_9, JAVA_10 }) @EnabledForJreRange(min = JAVA_9, max = JAVA_11)
自定义条件
@EnabledIf("customCondition") //双引号里是方法名称 @DisabledIf("customCondition")
@Test @DisabledIf("customCondition") void disabled() { // ... } boolean customCondition() { return true; }
@Tag("fast")
测试类和方法可以通过注解来标记。这些标记稍后可用于过滤测试发现和执行
- :根据显示名称按字母数字顺序对测试方法进行排序(请参阅显示名称生成优先规则)
- :根据名称和形式参数列表按字母数字顺序对测试方法进行排序
- :根据通过注释指定的值对测试方法进行数字排序
- :伪随机排序测试方法并支持自定义种子的配置
- :根据名称和形式参数列表按字母数字顺序对测试方法进行排序;已弃用,将在 6.0 中删除
@TestMethodOrder(OrderAnnotation.class)
方法 用 @Order(3) 来标记顺序
统一配置信息:新建一个配置文件,命名为 junit-platform.properties
src/test/resources/junit-platform.properties
方法顺序
junit.jupiter.testmethod.order.default = org.junit.jupiter.api.MethodOrderer$OrderAnnotation
类顺序
junit.jupiter.testclass.order.default = org.junit.jupiter.api.ClassOrderer$OrderAnnotation
@TestInstance(Lifecycle.PER_CLASS)每个类一个测试实例 @TestInstance(Lifecycle.PER_METHOD) 每个方法一个测试实例
配置信息
junit.jupiter.testinstance.lifecycle.default = per_class
@RepeatedTest(10)
重复10次
测试不同的场景,只写一个方法
@ParameterizedTest @ValueSource(strings = { "racecar", "radar", "able was I ere I saw elba" }) void palindromes(String candidate) { assertTrue(StringUtils.isPalindrome(candidate)); }
@TestTemplate
@TestFactory
@Timeout(5) @Timeout(value = 2, unit = TimeUnit.SECONDS) junit.jupiter.execution.timeout.mode 共有三种模式:enabled、disabled和disabled_on_debug
junit.jupiter.execution.parallel.enabled=true junit.jupiter.execution.parallel.mode.default= SAME_THREAD 或者 CONCURRENT
注解使用,有以下拓展接口可以实现
//Supported Extension APIs ExecutionCondition InvocationInterceptor TestInstanceFactory TestInstancePostProcessor 后置处理 ParameterResolver TestExecutionExceptionHandler 异常处理 LifecycleMethodExecutionExceptionHandler TestTemplateInvocationContextProvider BeforeAllCallback AfterAllCallback BeforeEachCallback AfterEachCallback BeforeTestExecutionCallback AfterTestExecutionCallback TestInstancePreDestroyCallback
例如@ExtendWith(MockitoExtension.class)
可以在单元测试类里直接用mock注解,因为MockitoExtension已经为我们初始化好了mock需要的东西
public class MockitoExtension implements BeforeEachCallback, AfterEachCallback, ParameterResolver { @Override public void beforeEach(final ExtensionContext context) { List<Object> testInstances = context.getRequiredTestInstances().getAllInstances(); Strictness actualStrictness = this.retrieveAnnotationFromTestClasses(context) .map(MockitoSettings::strictness) .orElse(strictness); MockitoSession session = Mockito.mockitoSession() .initMocks(testInstances.toArray()) .strictness(actualStrictness) .logger(new MockitoSessionLoggerAdapter(Plugins.getMockitoLogger())) .startMocking(); context.getStore(MOCKITO).put(MOCKS, new HashSet<>()); context.getStore(MOCKITO).put(SESSION, session); } ... }
例如springExtension类的结构
public class SpringExtension implements BeforeAllCallback, AfterAllCallback, TestInstancePostProcessor, BeforeEachCallback, AfterEachCallback, BeforeTestExecutionCallback, AfterTestExecutionCallback, ParameterResolver { ... }
如果您使用的是 Junit 版本 < 5,则必须使用 或 等。
如果您使用的是 Junit 版本 = 5,那么您必须使用 或 等
@SpringbootTest 注解中已经有包含了 @ExtendWith({SpringExtension.class})
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @BootstrapWith(SpringBootTestContextBootstrapper.class) @ExtendWith({SpringExtension.class}) public @interface SpringBootTest { }
// 如下可以记录下来所有的错误 class RecordStateOnErrorExtension implements LifecycleMethodExecutionExceptionHandler { @Override public void handleBeforeAllMethodExecutionException(ExtensionContext context, Throwable ex) throws Throwable { memoryDumpForFurtherInvestigation("Failure recorded during class setup"); throw ex; } @Override public void handleBeforeEachMethodExecutionException(ExtensionContext context, Throwable ex) throws Throwable { memoryDumpForFurtherInvestigation("Failure recorded during test setup"); throw ex; } @Override public void handleAfterEachMethodExecutionException(ExtensionContext context, Throwable ex) throws Throwable { memoryDumpForFurtherInvestigation("Failure recorded during test cleanup"); throw ex; } @Override public void handleAfterAllMethodExecutionException(ExtensionContext context, Throwable ex) throws Throwable { memoryDumpForFurtherInvestigation("Failure recorded during class cleanup"); throw ex; } }
其他自行查阅官网junit5
import org.junit.platform.suite.api.IncludeClassNamePatterns; import org.junit.platform.suite.api.SelectPackages; import org.junit.platform.suite.api.Suite; import org.junit.platform.suite.api.SuiteDisplayName; @Suite @SuiteDisplayName("JUnit Platform Suite Demo") @SelectPackages("example") @IncludeClassNamePatterns(".*Tests") class SuiteDemo { }到此这篇junit5(junit5官方文档)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/39798.html