当前位置: 首页 > 后端技术 > Java

JUnit5教程(四):JUnit5假设、测试套件和条件测试

时间:2023-04-01 20:08:55 Java

大家好,我是大洋。这是专栏《SpringBoot自动化单元测试教程》的第四篇文章。在本文中,我们将讨论JUnit5中的假设、测试套件和条件测试。1.JUnit5AssumptionsJUnit5Assumptions类提供静态方法来支持基于假设的条件测试执行。假设失败会导致测试中止。当继续使用给定的测试方法没有意义时,通常会使用假设。在测试报告中,这些测试将被标记为通过。JUnitAssumptions类具有以下方法:Assumptions.assumeTrue()Assumptions.assumeFalse()Assumptions.assumingThat()1.1Assumptions.assumeTrue()此方法验证给定假设是否为真,如果假设为真则测试继续,否则,测试执行将中止。它具有以下重载方法:publicstaticvoidassumeTrue(booleanassumption)throwsTestAbortedExceptionpublicstaticvoidassumeTrue(booleanassumption,SuppliermessageSupplier)throwsTestAbortedExceptionpublicstaticvoidassumeTrue(booleanassumption,Stringmessage)throwsTestAbortedExceptionpublicstaticvoidassumeTrue(BooleanSupplierassumptionSupplier))throwsTestAbortedExceptionpublicstaticvoidassumeTrue(BooleanSupplierassumptionSupplier,Stringmessage)throwsTestAbortedExceptionpublicstaticvoidassumeTrue(BooleanSupplierassumptionSupplier,SuppliermessageSupplier)throwsTestAbortedException示例:packagecn.dayangshuo.junit5.tests;importorg.junit.jupiter.api.假设;导入org.junit.jupiter.api.Test;/***@authorDAYANG*/publicclassAssumeTests{@TestvoidtestOnDev(){System.setProperty("ENV","DEV");Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")));System.out.println("Thetestcontinues...");}/***测试失败,并打印失败信息*/@TestvoidtestOnProd(){System.setProperty("ENV","PROD");Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")),AssumeTests::message);System.out.println("测试不会继续并且不会打印Thisline...");}privatestaticStringmessage(){return"Testfailed...";}}1.2Assumptions.assumeFalse()如果假设为假,测试继续,否则,测试执行被中止它具有以下重载方法:publicstaticvoidassumeFalse(booleanassumption)throwsTestAbortedExceptionpublicstaticvoidassumeFalse(booleanassumption,SuppliermessageSupplier)throwsTestAbortedExceptionpublicstaticvoidassumeFalse(booleanassumption,Stringmessage)throwsTestAbortedExceptionpublicstaticvoidassumeFalse(BooleanSupplierassumptionSupplier))throwsTestAbortedExceptionpublicstaticvoidassumeFalse(BooleanSupplierassumptionSupplier,Stringmessage)throwsTestAbortedExceptionpublicstaticvoidassumeFalse(BooleanSupplierassumptionSupplier,SuppliermessageSupplier)throwsTestAbortedException示例:packagecn.dayangshuo.junit5.tests;importorg.junit.jupiter.api.假设;导入org.junit.jupiter.api.Test;/***@authorDAYANG*/publicclassAssumeTests{@TestvoidtestOnDev(){System.setProperty("ENV","DEV");假设.assumeFalse("DEV".equals(System.getProperty("ENV")),AssumeTests::message);System.out.println("测试不会继续,这一行不会被打印...");}/***测试失败,打印失败信息*/@TestvoidtestOnProd(){System.setProperty("ENV","PROD");Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));System.out.println("测试继续执行...");}privatestaticStringmessage(){return"测试失败...";}}1.3Assertions.assumingThat()此方法执行提供的可执行文件,但前提是提供的假设有效与其他假设方法不同,此方法不会中止测试。如果该假设无效,则该方法不执行任何操作。如果假设有效并且可执行文件抛出异常,则将被视为常规测试失败。抛出的异常按原样重新抛出,但被屏蔽为未经检查的异常。它具有以下重载方法:publicstaticvoidassumingThat(booleanassumption,Executableexecutable)publicstaticvoidassumingThat(BooleanSupplierassumptionSupplier,Executableexecutable)示例:@TestvoidtestInAllEnvironments(){System.setProperty("ENV","DEV");Assumptions.assumingThat("DEV".equals(System.getProperty("ENV")),()->{//执行这些断言并只在DEV服务器上打印//ieSystem.setProperty("ENV","DEV")将执行Assertions.assertEquals(3,Calculator.add(4,2));});//在所有环境中执行这些断言Assertions.assertEquals(13,Calculator.add(6,7));}2.JUnit5测试套件测试套件其实就是JUnit5,它允许我们在多个包或类中运行测试方法,即组测试。JUnit5使用@Suite注释来声明测试套件。在开始群测之前,我们先了解几个注解:@Tag:测试类和方法可以用这个注解来标记。这些标签稍后可用于过滤测试发现和执行。@Disabled:整个测试类或者单个测试方法都可以通过该注解禁用测试。直接看群测的代码示例:packagecn.dayangshuo.junit5;importcn.dayangshuo.junit5.assertt.AssertTest;importcn.dayangshuo.junit5.tests.LifeCycleTests;导入org.junit.platform.suite.api。*;/***@authorDAYANG*///将LifeCycleTests和AssertTest这两个类合并为一组进行测试@SelectClasses({LifeCycleTests.class,AssertTest.class})//也可以直接将多个包合并Mergetestsinagroup//@SelectPackages({"cn.dayangshuo.junit5.tests"})//这个注解只代表带有DEV标签的测试类或方法//@IncludeTags("DEV")@Suite@SuiteDisplayName("测试套件,grouptest")publicclassSuiteTests{}LifeCycleTests和AssertTest的代码如下,直接运行SuiteTests类,看看会执行LifeCycleTests和AssertTest类中的哪些方法:packagecn.dayangshuo.junit5.tests;importcn.dayangshuo.junit5.Calculator;importorg.junit.jupiter.api.*;/***@authorDAYANG*/publicclassLifeCycleTests{//执行@Tag("DEV")@DisplayName("Life循环测试")@TestvoidtestCalcOne(){System.out.println("======测试1执行=======");断言.assertEquals(4,Calculator.add(2,2));}//已执行,但如果SuiteTests类有@IncludeTags("DEV")注解,@Tag("PROD")@TestvoidtestCalcThree(){System.out.println("======Test3is执行=======");Assertions.assertEquals(6,Calculator.add(2,4));}//不会被执行,因为它被禁用了@Disabled@TestvoidtestCalcTwo(){System.out.println("======Test2isexecuted=======");Assertions.assertEquals(6,Calculator.add(2,4));}}packagecn.dayangshuo.junit5.assertt;importcn.dayangshuo.junit5.Calculator;importorg.junit.jupiter.api.Assertions;importorg.junit.jupiter.api.Tag;importorg.junit.jupiter.api.Test;importjava.util.function.Supplier;/***@authorDAYANG*/publicclassAssertTest{//执行@Test@Tag("DEV")voidassertTest(){//测试通过断言.assertNotEquals(3,Calculator.add(2,2));//测试失败Assertions.assertNotEquals(4,Calculator.add(2,2),"Calculator.add(2,2)测试失败");//测试失败SuppliermessageSupplier=()->"Calculator.add(2,2)测试失败";Assertions.assertNotEquals(4,Calculator.add(2,2),messageSupplier);}}执行结果如图:套件测试中的更多注解如下,可以使用它们来包含或排除某些类、某些包或某些标签:@SelectClasses@SelectPackages@IncludePackages@ExcludePackages@IncludeClassNamePatterns@ExcludeClassNamePatterns@IncludeTags@ExcludeTags3.ConditionaltestingJUnitJupiter中的ExecutionCondition扩展API允许开发人员以编程方式启用或禁用容器或根据特定条件测试此类条件。最简单的示例是支持注释的内置函数。如操作系统条件测试:@EnabledOnOs可以通过@DisabledOnOs注解启用或禁用容器或在特定操作系统上进行测试。packagecn.dayangshuo.junit5.tests;importorg.junit.jupiter.api.Test;importorg.junit.jupiter.api.condition.DisabledOnOs;importorg.junit.jupiter.api.condition.EnabledOnOs;importorg.junit.jupiter.api.condition.OS;导入java.lang.annotation.ElementType;导入java.lang.annotation.Retention;导入java.lang.annotation.RetentionPolicy;导入java.lang.annotation.Target;/***@作者DAYANG*/publicclassConditionsTests{@Test@EnabledOnOs(OS.MAC)voidonMacOs(){//...}@TestOnMacvoidtestOnMac(){//...}@Test@EnabledOnOs({OS.LINUX,OS.MAC})voidonLinuxOrMac(){//...}@Test@DisabledOnOs(OS.WINDOWS)voidnotOnWindows(){//...}@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Test@EnabledOnOs(OS.MAC)@interfaceTestOnMac{}}下一篇我们将讨论JUnit5让单元测试更方便的参数化测试,基于参数化测试我们可以更灵活的配置我们的参数。