3

junit テスト用に書いているコード内で appium を起動する方法はありますか? appium はテストの実行中にのみ実行する必要があるため、appium サーバーを常に稼働させておくことは意味がありません。

現在、junit と maven を使用してテスト ビルドを実行しています。appium の安定性の問題により、ビルドの途中で終了することがあり、残りのすべてのテストに失敗します。@Before メソッドに何かを追加して、WebDriver を接続する前に appium サーバーを起動し、@After メソッドで終了できるかどうかを知りたいです。これは、次のテストを開始する前にリセットできるため、appium の障害に関する問題に対処する必要があります。

これが機能するかどうかを確認するために、Javaで一般的なプロセスの開始と終了をまだ調べています。これを理解したら、この投稿を更新して、この方法でテストすることに興味のある人を支援します.

4

4 に答える 4

2

コード内で端末コマンドを実行するだけでこれを機能させる方法を考え出しました

@Before
public void setUp() throws Exception {
    closeSimulatorAndInstruments(); // also closes any appium servers
    appium = Runtime.getRuntime().exec("/usr/local/bin/appium");
    Thread.sleep(1000); // wait for appium to start up, not sure how to check the status
    ... // start test
}

@After
public void tearDown() throws Exception {
    captureScreenshot(testName.getMethodName());
    driver.quit();
    appium.destroy(); // kills the appium server so it wont collide with the next run
}

これを実行しようとしている jenkins を実行している CI ボックスで問題が発生していますが、おそらく無関係です。appium を個別に実行したり、appium が停止したかどうかを確認したりする必要がなくなったため、ローカルではうまく機能しています。ただし、重要なエラーが含まれている可能性のある appium 出力を表示する必要がある場合は、これはお勧めできません。

于 2014-02-21T22:04:19.850 に答える
1

このためのライブラリを作成しました。

/**
 *@author Raghu Nair
 */
public class Appium {

private static volatile Appium instance;

public static Appium getInstance(String outFile, String errFile) {
    if (instance == null) {
        synchronized (Appium.class) {
            if (instance == null) {
                instance = new Appium(outFile, errFile);
            }
        }
    }
    return instance;
}
Process process;
final String outFile;
final String errFile;

private Appium(String outFile, String errFile) {
    this.outFile = outFile;
    this.errFile = errFile;
}

public void start() throws IOException {
    if (process != null) {
        stop();
    }

    String processName = System.getProperty("appium.bin");
    String processString = processName + " -lt 180000";
    ProcessBuilder builder = new ProcessBuilder("bash");
    process = builder.start();
    OutputStream outStream = System.out;
    if (outFile != null) {
        outStream = new FileOutputStream(outFile);
    }
    OutputStream errStream = System.err;
    if (errFile != null) {
        errStream = new FileOutputStream(errFile);
    }

    handleStream(process.getInputStream(), new PrintWriter(outStream));
    handleStream(process.getErrorStream(), new PrintWriter(errStream));
    try (PrintWriter writer = new PrintWriter(process.getOutputStream())) {
        //writer.println("kill -9 `ps -ef | grep appium | cut -d' ' -f2`");
        writer.println("export PATH=$PATH:/usr/bin/:/usr/local/bin/");
        writer.println(processString);
        writer.flush();
    }

}

private void handleStream(final InputStream processOut, final PrintWriter writer) {
    Thread outHandler;
    outHandler = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                BufferedReader stdout = new BufferedReader(
                        new InputStreamReader(processOut));
                String line;
                while ((line = stdout.readLine()) != null) {
                    writer.println(line);
                    writer.flush();
                }
            } catch (IOException ex) {
                ex.printStackTrace(System.err);
            }
        }
    });
    outHandler.start();
}

public void stop() {
    System.out.println("Stopping the process");
    if (process != null) {
        try {
            process.destroy();
            process.getErrorStream().close();
            process.getInputStream().close();
            process.getOutputStream().close();
        } catch (IOException ex) {
            ex.printStackTrace(System.err);
        }
    }
}

public static void main(String[] args) throws Exception {
    System.setProperty("appium.bin", "/Applications/Appium.app//Contents/Resources/node_modules/.bin/appium");
    Appium appium = Appium.getInstance("/Users/<user>/tmp/appium.out", "/Users/<user>/tmp/appium.err");
    appium.start();
    TimeUnit.SECONDS.sleep(30);
    appium.stop();
}
于 2015-02-25T23:32:08.977 に答える
0

解決策を少し改善できることがわかりました。

  1. 環境ごとにプロファイルを作成する ( appium ホームを定義する)
  2. Process 出力ストリームをファイルにリダイレクトできます。ファイル名はプロファイルで定義でき、Java ファイルにあります。
于 2015-02-18T20:06:33.210 に答える