我有 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/