2016-09-02 6 views
3

У меня есть проект maven, а бег работает mvn test выполняет тестовые примеры в рамках отдельного процесса.Junit- Как подключить тест к существующему процессу

Мой вопрос: есть ли способ запустить тесты, присоединившись к существующему процессу? Чтобы тесты могли использовать подключенную среду процесса.

Я нашел surefire имеет JVM property, found here, но не смог получить, как установить его, если это правильное понимание.

Update: Поскольку проект основан SpringBoot, поэтому я казнены сервер (Скажите это тестовый сервер), как this-

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

И обновленными тест Junit классов, как this-

@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, как это (запустив 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 

ответ

2

В конце концов, вы спрашиваете: как я могу введите произвольный код в работает JVM.

Возможно, это технически выполнимо; но потребует много работы; и, возможно, грязный взлом. Чтобы получить ... что?

Короче говоря: я думаю, вам следует отступить и внимательно посмотреть в «почему» вы хотите это сделать. И затем стремиться к другому решению!

На ваш комментарий: хорошие юнит-тесты должны быть сосредоточены на малых единиц. Если вам нужен ваш «весь стек» для запуска и запуска; то не называйте их модульными тестами; потому что это не так. Это функциональные/интеграционные тесты!

Если вы действительно хотите найти блок-тесты; затем узнайте о насмешливых фреймворках ... и, вероятно: как testable код. Эти videos здесь отличное начало в эту тему.

Серьезно: присоединение к JVM для запуска модульных тестов не является хорошим ответом. Вместо этого отступите; и загляните в ваш дизайн; и найти способы проверить его на «меньших» масштабах.

Еще одно обновление вашего второго комментария: если вам действительно нужен такой уровень «динамики»; то я бы предложил что-то совершенно другое: интегрируйте Jython в свой продукт; по крайней мере, для вашей «разработки». Это позволит вам отправить jython скрипты (код python, который может вызвать все использовать все ваши классы java) в JVM.

Но опять же: просмотрите реальные модульные тесты; любое приложение может извлечь выгоду из этого. У меня есть сотрудники, которые всегда говорят мне, что им нужно запускать «функциональные тесты» при отладке проблем.Я, я работаю над одним и тем же стеком программного обеспечения; Мне обычно нужны файлы журналов; а затем я адаптирую свои модульные тесты, чтобы воспроизвести проблему; Мне нужно только «системное время» очень поздно в игре, чтобы сделать окончательный тест исправления до того, как это выходит в поле.

Но только для записи: у нас есть jython и в наших системах разработки. И да, это отличное, чтобы иметь даже «оболочку» в вашей JVM.

+0

Спасибо за ваше предложение. Причина в том, что тестовые случаи в значительной степени зависят от настройки среды, для каждого теста я не хочу тратить время на настройку и настройку, скорее сосредоточившись на проблеме, решаемой модульными тестами. – Sam

+0

Добавьте несколько обновлений для вас! – GhostCat

+0

Может быть, мне не нужно говорить «единичный тест», а просто тест. И причина того, что тест сильно зависит от настройки среды, объясняется природой приложения, что он полагается на несколько разных компонентов. Допустим, у приложения есть проблемы в производстве, чтобы решить эту проблему, создать такую ​​же среду на моей локальной или сцене, и теперь хочу выполнить мои тесты, чтобы увидеть, что происходит. Для этого мне просто нужно настроить среду один раз. Надеюсь, это прояснит мою потребность. – Sam

Смежные вопросы