Запуск нескольких основных методов java в eclipse

Я запускаю Eclipse 3.5, и у меня есть частая проблема, что для тестирования моей программы я должен сделать около 6-7 кликов, а не один щелчок на кнопке воспроизведения.

Проблема заключается в том, что я пишу сетевое приложение, и, таким образом, у меня есть сценарий запуска для "Сервер" и сценарий запуска для "Клиент". Затем, чтобы протестировать мою программу, я должен запустить сервер, затем клиент, потом другой клиент и т.д. Есть ли способ автоматизировать это в одной конфигурации запуска?

Ответы

Ответ 1

Вы можете вызвать основной метод любого класса напрямую. Например, если у вас есть сервер и клиентский класс, и вы хотите запустить один сервер и два клиента, вот что вы можете сделать.

public class Server {
    public void main(final String ... $Args) {
         final Server S = new Server();
         S.config($Args);
         S.run();
    }
}

public class Client {
    public void main(final String ... $Args) {
         final Client C = new Client();
         C.config($Args);
         C.run();
    }
}

public class Test_ServerClient {
    public void main(final String ... $Args) {
         Server.main('server1.cfg');
         Client.main('client1.cfg');
         Client.main('client2.cfg');
    }
}

Готово!

Ну, почти. Вы можете захотеть сделать некоторую задержку перед вызовом основной части клиента, чтобы убедиться, что сервер работает правильно.

Можно подумать. Все сервер и клиенты будут работать на одной и той же JVM. В большинстве случаев (вы просто хотите проверить его взаимодействие и не имеете никакого отношения к загрузке классов, поскольку это будет вести себя по-другому, если они не находятся на одном JVM), это должно быть хорошо. Если вы действительно хотите, чтобы он выполнялся на разных JVM, вы можете использовать Ant для их запуска.

Что-то вроде этого:

<project name="TestServerClient" default="test" basedir=".">
  <target name="test">
       <java classname="my.Server">
         <arg value="server1.cfg"/>
         <classpath>
           <pathelement location="dist/test.jar"/>
           <pathelement path="${java.class.path}"/>
         </classpath>
       </java>
       <java classname="my.Client">
         <arg value="client1.cfg"/>
         <classpath>
           <pathelement location="dist/test.jar"/>
           <pathelement path="${java.class.path}"/>
         </classpath>
       </java>
       <java classname="my.Client">
         <arg value="client2.cfg"/>
         <classpath>
           <pathelement location="dist/test.jar"/>
           <pathelement path="${java.class.path}"/>
         </classpath>
       </java>
  </target>
</project>

Итак, вы можете просто запустить этот Ant, и это все.

Надеюсь, что это поможет.

Ответ 2

Только для завершения утверждённого ответа: Если вы хотите параллельно выполнять сервер и клиенты, вам нужно запустить новый поток для каждого экземпляра клиента и сервера. Вы можете сделать это следующим образом:

pulic class Test_ServerClient {
    public static void main(final String[] args) {

        Thread serverThread = new Thread() {
            public void run() {
                Server.main(args);
            }
        };

        Thread clientThread = new Thread() {
            public void run() {
                Client.main(args);
            }
        };

        serverThread.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        clientThread.start();
    }
}

public class Server {
    public static void main(final String[] args) {...}
}

public class Client {
    public static void main(final String[] args) {...}
}

Ответ 3

Хорошо, почему бы не написать тестовый пример с помощью JUnit. Я имею в виду,

  • Подготовьте 2 файла свойств, один для сервера и другой для клиента
  • Напишите тестовое устройство, которое запускает сервер и несколько клиентов для запуска теста
  • Затем напишите свои тестовые примеры на основе этого

Я знаю, что мы не должны называть его unit test, поскольку он будет зависеть от сетевого ввода-вывода. Итак, называйте это все, что вам нужно. Мое предложение - просто использовать JUnit для этого.

Ответ 4

Вы можете написать простую стартовую программу, которая запустит все остальные программы в новой JVM. Для вызова в новой JVM вы можете использовать методы Runtime.exec().

То, как это было сделано во множестве сценариев модульного тестирования.

Ваша стартовая программа может принимать список других программ в качестве аргументов и разворачивать их каждый в новом java-процессе.

Ответ 5

Окно → Новое окно

Запустите отдельные программы отдельно.