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

时间:2016-09-02 17:11:55

标签: maven junit maven-surefire-plugin

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

我的问题是:有没有办法通过附加到现有流程来运行测试? 这样测试就可以使用附加的流程环境。

我发现surefire有JVM属性,found here,但如果这是正确的理解,则无法设置它。

更新 由于项目是基于SpringBoot的,所以我执行了这样的服务器(Say it test server) -

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

1 个答案:

答案 0 :(得分:2)

最后,您要问:我如何任意代码注入正在运行的 JVM中。

可能这在技术上是可行的;但需要很多工作;可能是肮脏的黑客攻击获得......什么?

长话短说:我认为你应该退后一步,仔细看看&#34;为什么&#34;你想要那样做。然后争取另一种解决方案!

鉴于您的评论:良好的单元测试应该关注小型单元。如果你需要你的整个堆栈&#34;启动和运行;然后不要称他们为单位测试;因为他们不是。它们是功能/集成测试!

当你真的想要研究单元测试;然后了解模拟框架......可能:如何可测试代码。这些videos是这个主题的一个很好的开端。

严重的是:连接到JVM以运行单元测试并不是一个好的答案。相反,退一步;并研究你的设计;并找到在&#34;较小的&#34;上测试它的方法。范围。

第二条评论的另一个更新:如果你真的需要这样一个级别的&#34;动态&#34 ;;然后我会建议完全不同的东西:将Jython整合到您的产品中;至少对你的&#34;开发&#34;建立。这将允许您将 jython 脚本(可以将所有使用所有Java类的python代码)发送到JVM中。

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

但仅仅是为了记录:我们的开发系统中也有jython。是的,即使有一个&#34; shell&#34; 很棒在你的JVM中运行。