1

私は、少なくとも週に 1 回更新される大規模な Web サイト (新機能の追加、コンテンツの変更など) に取り組んでいます。ただし、テストがあったとしても、本来あるべきほど徹底したものではありません。だから一週間前、私は自動化されたテストとセレンを調べ始めました。

正しくやりたいのなら、セレンideだけに頼らないでください。テストをプログラミングすると、より多くのオプションが提供されます。私はサードパーティの PHP バインディングにまったく慣れていなかったので、すぐにテストのプログラミングに Java を使用することにしました。

さて、私の質問は、テストを実行するシステムを巧みにセットアップする方法に関するものです。私の考えは次のとおりでした:

  • テストは完全に自律的になります/すべきです
  • それにもかかわらず、これらすべてのテストをループして次々と実行する何らかのメインアプリケーションが必要です
  • メイン アプリケーションは 24 時間年中無休で実行するか、少なくとも cronjob などで定期的に開始する必要があります
  • テストは、できるだけ多くのブラウザー (またはシミュレートされたクライアント??) で実行する必要があります。これまでのところ、それぞれの WebDriver を介して FF、IE、およびクロムを使用しています。
  • いくつかのフォルダーに名前を付けて、そのフォルダー内のすべてのテストを収集したいと思います。メインアプリケーションは、そのフォルダーにあるものをすべて取得して実行します。その後、誰もがテストを作成してそのフォルダーに入れるだけで、キューに追加されます
  • Selenium ide を使用してテストを作成し、それらをエクスポートして、すぐにメイン アプリケーションで動作させる方法があると便利です (つまり、変更を加えることなく正しく実行されます)。わかりました、私が言ったことは知っています、セレンideはお勧めできませんが、いくつかの簡単なテストの良いスタートだと思います. また、プログラミングの知識がなくても使用できます。今のところ、selenium ide で作成したテストを「Java / JUnit 4 / WebDriver」としてエクスポートし、少しコードを変更しています (WebDriver オブジェクトをパラメーターとして渡します)。

私の「メインアプリケーション」のコードは次のとおりです。

import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;

public class SeleniumTest {

    public static void main(String[] args) throws 
    ClassNotFoundException, InstantiationException,IllegalAccessException, 
    NoSuchMethodException, SecurityException, IllegalArgumentException, 
    InvocationTargetException {
        String[] drivers = {
                "org.openqa.selenium.firefox.FirefoxDriver",
                "org.openqa.selenium.ie.InternetExplorerDriver",
                "org.openqa.selenium.chrome.ChromeDriver"
        };
        Class params[] = {WebDriver.class};
        String testFolderName = "lookhere";

        while (true) {
            //get all .java files from some folder. those will be the tests to run
            File testFolder = new File(testFolderName);
            FilenameFilter filter = new FilenameFilter() {
                public boolean accept(File dir, String name) {
                    return name.endsWith(".java");
                }
            };
            String[] tests = testFolder.list(filter);
            if (tests == null) {
                System.exit(0);
            }

            for(int i=0; i<drivers.length; i++) {
                //loop through different drivers, instantiate them
                Class webDriverClass = Class.forName(drivers[i]);
                WebDriver driver = (WebDriver) webDriverClass.newInstance();
                driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

                for (int j=0; j<tests.length; j++) {
                    //loop through tests, instantiate them
                    String currentTestName = tests[j].replace(".java", "");
                    Class testClass = Class.forName(currentTestName);
                    Object test = testClass.newInstance();

                    Method methods[] = testClass.getDeclaredMethods();
                    Method fn;

                    //run every method that starts with "test" (usually just one)
                    //also run setUp, passing the driver object
                    for(int k=0; k<methods.length; k++) {
                        if (methods[k].getName().startsWith("test")) {
                            fn = testClass.getDeclaredMethod(methods[k].getName());
                            fn.invoke(test);
                        } else if(methods[k].getName().equals("setUp")) {
                            fn = testClass.getDeclaredMethod("setUp", params);
                            fn.invoke(test, driver);
                        }
                    }
                }

                driver.quit();
            }
        }
    }
}

ご覧のとおり、私は Java の専門家ではありません。したがって、(メイン メソッドのロング スロー宣言のような) 悪い形で先延ばしにしないでください。

さて、私の質問のために:

  1. 私が上で定式化した私の全体のコンセプトは大丈夫ですか?つまり、メイン アプリケーションですべてのテストを実行し、その場でテストを追加/削除できるキューを作成します。または、これに関するベストプラクティスの他の方法はありますか? 他にどのようなコンセプト/アーキテクチャを思いつきますか?
  2. Selenium ide でテストを作成し、それらをエクスポートして、変更を加えることなくすぐにメイン アプリケーションで動作させる方法はありますか?
  3. 私がコードを投稿したので、あなたはおそらく夢中になり、それを批判したいと思うでしょう;-)私はあらゆる種類の提案を受け入れます。
  4. Selenium を使用して、異なるバージョンの IE (または任意のブラウザー) を実行することは可能ですか? おそらく、私がインストールしたブラウザのバージョンを実行するだけです。1 つのブラウザの異なるバージョンをテストしたい場合は、リモート マシンを呼び出す必要があります。これは、セレン グリッドを意味しますか? 私は本当に今ちょうど推測しています:)
4

3 に答える 3

0

メイン メソッドの代わりにTestNGを使用してテストを調整します。前の回答の状態のようにパラメーター化が可能です。セレン GRID 2 を使用すると、テストを並行して実行し、多くの異なるブラウザー/OS バージョンの組み合わせで実行できます。

また、 PageObjects とPageFactoryを使用してテスト ケースをモデル化することも検討します。これは、テストをカプセル化して堅牢にするのにさらに役立ちます。

于 2012-08-10T18:14:52.913 に答える
-1
  1. あなたのコンセプトは大丈夫ですが、それをどのように実装するかはかなりずれています。

  2. あなたの基準の 1 つは、絶え間なく変化する Web ページでした。このため、Selenium IDE は役に立ちません。テスト ケースを頻繁に更新します。

  3. テスト ケースのコーディング方法に関する誤った想定。

  4. テスト ケースは通常のマシンで実行されるため、さまざまなバージョンのブラウザー タイプに対して実行する簡単な方法はありません。バージョンごとに異なるマシンが必要になります。

したがって、これに対する私の解決策は

  1. 以前に回答したように、Testng はテスト ケースの実装を推進します。グループ化とセットアップ/破棄の方法が可能です。
  2. 前に回答したように、使用する各要素の関数を使用して、各 Web ページのクラスを作成します。また、フローを整理してヘルパー クラスを作成します。これにより、メンテナンス時間が大幅に短縮されます。すべてのテストケースではなく、いくつかのクラスで更新するだけで済みます。

  3. スケジュールと概要については、Jenkins からテストを実行します。これにより、さまざまなタイプの OS、ブラウザーなどにジョブをセットアップできます。Jenkins は、スレーブでのテスト ケースの実行をサポートしています。したがって、各スレーブは、テストするブラウザの種類ごとに異なるバージョンを持つことができます。

  4. 非常に高度な場合は、VMWare または KVM を使用してスレーブとして使用する仮想マシンを動的に作成します。これにより、テスト実行を開始するたびに、必要な正確なタイプのサーバーをセットアップできます。OS セットアップのタイプごとにイメージを作成し、Jenkins でジョブを開始するときにオプションを使用して、どのイメージから仮想マシンを作成するかを決定します。

于 2015-05-06T06:59:44.993 に答える