如何以编程方式调用junit5 @ParameterizedTest?

问题描述 投票:0回答:1

我有一堆 junit 5 测试,其中一些是参数化的,我想从 java 类调用它们。

当保存在 src/test 文件夹中时,测试通过 IDE 或使用 gradle clean build 成功运行,但这不是我的目标。

我希望能够从一个单独的 java 类调用此测试(例如,每当我需要触发这些测试时,我可以公开和调用其端点的控制器)

我的参数化测试:

@ParameterizedTest(name = "{0}")
     @MethodSource("getAllTestData")
     void myParameterizedTestMethod(
     String testCaseName, List<String> inputParams, List<String> expectedResults){
     // Some Assertions here
     Assertions.assertTrue(true);
     }

     //method source
     public Stream<Arguments> getAllTestData() {
     return aStreamOfParamsToBeUsedInTests;
  }

我尝试了 junit-platform-launcher 如下:

LauncherDiscoveryRequest request =
     LauncherDiscoveryRequestBuilder.request().selectors(selectClass(DummyTest.class)).build();
     Launcher launcher = LauncherFactory.create();
     launcher.execute(request);

这成功执行了用@Test(这里是DummyTest.class)注释的测试方法,但不是@ParameterizedTest

还尝试了 junit-platform-testkit 如下:

EngineTestKit.engine("junit-jupiter")
     .selectors(selectClass(DummyTest.class))
     .execute()
     .testEvents()
     .assertStatistics(o -> o.failed(0));

但结果相同。 不确定我正在做的事情是否不正确或者调用参数化测试的方式不同。

如有任何帮助,我们将不胜感激。谢谢。

编辑:

我没有遇到任何错误。只是任何 @ParameterizedTest 都不会被调用。只有 @Test 方法正在运行。

如果有帮助的话,请包含更多代码:

一个简单的单元测试:


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

public class DummyTest {
  @Test
  void dummyTest() {
    System.out.println("Success1");
    Assertions.assertTrue(true);
  }
}

参数化测试:


import com.fasterxml.jackson.core.JsonProcessingException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

public class MyParameterizedTest{
  @ParameterizedTest(name = "{0}")
  @MethodSource("getAllTestData")
  void testProductRequestValidator(
      String testCaseName, String inputParams) {
    Assertions.assertTrue(true);

    System.out.println("<<<<<<>>>>>>>>>>Success");
    Assertions.assertTrue(true);
  }


  public Stream<String> getAllTestData() {
    return Stream.of("1","2","2");
  }
}

我想从中调用测试的服务类:

import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;


import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
import org.junit.platform.testkit.engine.EngineTestKit;
import org.springframework.stereotype.Service;

@Service
public class MyTestService{ // TODO Rename

  public void runTests() {

      LauncherDiscoveryRequest request =
        LauncherDiscoveryRequestBuilder.request().selectors(selectClass(DummyTest.class)).build();
    Launcher launcher = LauncherFactory.create();
    launcher.execute(request);

  }
}

重要提示:这有效。测试被执行。

但是当我尝试在 MyParameterizedTest 类中调用测试时,它根本无法被识别并且没有调用..没有错误。

与上面相同的代码,只是更改了类名:

import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;


import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
import org.junit.platform.testkit.engine.EngineTestKit;
import org.springframework.stereotype.Service;

@Service
public class MyTestService{ // TODO Rename

  public void runTests() {

      LauncherDiscoveryRequest request =
        LauncherDiscoveryRequestBuilder.request().selectors(selectClass(MyParameterizedTest.class)).build();
    Launcher launcher = LauncherFactory.create();
    launcher.execute(request);

  }
}

以上方法不起作用。测试未被调用。

Java:openjdk版本“1.8.0_362” 等级:等级8.5

java junit5 parameterized-tests
1个回答
0
投票

您提供的

ParameterizedTest
不是有效的测试,因此
Launcher
会默默地找不到它。你说这些测试在IDE中通过了,所以可能是过程中出现了错误,但是修复后这个测试被识别并成功完成:

public class MyParameterizedTest {
    @ParameterizedTest(name = "{0}")
    @MethodSource("getAllTestData")
    void testProductRequestValidator(String inputParam) {
        System.out.println("<<<<<<>>>>>>>>>>Success: " + inputParam);
        Assertions.assertTrue(true);
    }

    public static Stream<String> getAllTestData() {
        return Stream.of("1", "2", "3");
    }
}

我所做的更改是将

static
添加到源方法并将测试方法参数减少为单个字符串。

© www.soinside.com 2019 - 2024. All rights reserved.