maven - Junit- 如何将测试附加到现有流程

标签 maven junit maven-surefire-plugin

我有 maven 项目,正在运行 mvn test 在单独的进程中执行测试用例。

我的问题是:是否有任何方法可以通过附加到现有进程来运行测试? 这样测试就可以使用附加的进程环境。

我发现 surefire 有 JVM 属性,found here , 但不知道如何设置它,如果这是正确的理解。

更新: 由于该项目是基于 SpringBoot 的,所以我像这样执行服务器(说它测试服务器)-

java -jar target/server-0.0.1-SNAPSHOT.jar

并像这样更新 Junit 测试类-

@Before
public void setup() throws Exception {
    VirtualMachine virtualMachine = attach(getTestServerVM());
    System.out.println(virtualMachine.id());
}

@Test
public void emptyTest() {
    Stack<String> stack = new Stack<String>();
    assertTrue(stack.isEmpty());
}

private static VirtualMachine attach(VirtualMachineDescriptor virtualMachineDescriptor) {

    VirtualMachine virtualMachine = null;

    try {
        virtualMachine = VirtualMachine.attach(virtualMachineDescriptor);

    } catch (AttachNotSupportedException anse) {
        System.out.println("Couldn't attach " + anse);
    } catch (IOException ioe) {
        System.out.println("Exception attaching or reading a jvm." + ioe);
    } 

    return virtualMachine;
}

private static VirtualMachineDescriptor getTestServerVM() {

    String name = "target/server-0.0.1-SNAPSHOT.jar";
    List<VirtualMachineDescriptor> vms = VirtualMachine.list();

    VirtualMachineDescriptor serverVM = vms.stream()
              .filter(vm -> name.equals(vm.displayName()))
              .findAny()
              .orElse(null);

    System.out.println("Test server id : " + serverVM.id());

    return serverVM;
}

这就足够了吗,还是我需要加载代理? 我问这个,因为虽然程序显示 Junit 测试类成功附加,但我看到 Junit 的进程 ID 是这样的(通过运行 JCMD 命令)-

3585 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner -version 3 -port 55632 -testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader -loaderpluginname org.eclipse.jdt.junit4.runtime -classNames JunitRnD.J

最佳答案

最后,您会问:我如何注入(inject)任意代码到正在运行的JVM 中。

这在技术上可能是可行的;但需要大量的工作;可能还有肮脏的黑客攻击。为了获得……什么?

长话短说:我认为您应该退后一步,仔细研究您想要这样做的“原因”。然后争取另一种解决方案!

鉴于您的意见:好的单元测试应该关注单元。如果您需要启动并运行“整个堆栈”;那么不要称它们为单元测试;因为他们不是。它们是功能/集成测试!

当你真的想研究单元测试时;然后学习模拟框架……可能还有:如何测试代码。这些videos这是该主题的良好开端。

说真的:附加到 JVM 上运行单元测试不是一个好的答案。相反,退后一步;并研究你的设计;并找到在“较小”范围内对其进行测试的方法。

关于您的第二条评论的另一项更新:如果您真的需要这种级别的“动态”;那么我会建议一些完全不同的东西:集成 Jython进入您的产品;至少对于您的“开发”设置。这将允许您将 jython 脚本(可以调用 all 使用所有 java 类的 python 代码)发送到 JVM 中。

但再次:考虑编写真正的单元测试; 任何应用程序都可以从中受益。我有同事总是告诉我他们在调试问题时需要运行“功能测试”。我,我正在开发相同的软件堆栈;我通常需要日志文件;然后我调整我的单元测试以重现问题;我只需要在游戏后期的“系统时间”在进入现场之前对修复进行最终测试。

但郑重声明:我们的开发系统中也有 jython。是的,即使在您的 JVM 中运行“shell”也很棒

关于maven - Junit- 如何将测试附加到现有流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39297648/

相关文章:

java - 测试 Spring MVC 响应模式(忽略响应中项目中的 json 字段)

java - 在同一 Maven 模块中的不同插件之间共享通用配置

java - 更改maven依赖项的内容

kotlin - 如何在 kotlinx 中比较实际序列化结果和预期序列化结果?

java - Gradle 不执行测试

java - Maven Surefire 插件 + 并行构建

java - Maven surefire forkMode pertest 已弃用。什么是新设置?

java - 在 Maven POM 中禁用 distributionManagement

java - 将 maven -D 参数传递给 java 类?

Spring Boot War 部署到 Tomcat