我有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
答案 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中运行。