2017-01-13 1 views
1

はしばらくして。たぶん愚かな質問ですが、私は大声で考えているので、とにかくそこに投げ捨てるつもりです。テスト

私は、(テストデータを含む)エクセルファイルへのパスを含む設定ファイルを導入し、テストのためにこのデータを抽出するための基本的なエクセルリーダーを実装したので、私の最初のテストの大部分は、このすべての設定によって占められています。例えば

  1. はExcellDataConfigクラスのオブジェクトを作成し、Excelファイルの場所を通過ReadPropertyFileクラス
  2. のインスタンスを作成する設定ファイルから
  3. は、テストケースを設定しましたこのテストのためのIDは、シートからのデータの読み出しを開始する場所のためのExcelファイルをスキャンします - シートがマーカーを含むExcel
  4. 私は私のテストのために、例えば、必要なすべての興味深いもののシートから場所のROL/COLの情報を取得ユーザー名/パスワード、または他のいくつかのデータ
  5. は、複数のユーザーがExcelシートとログを反復処理し、その後でとは、実際のテストを行うことをループのために設定のためにテストを実行した場合には、ブラウザ
  6. を開きます。

は、設定オプションがたくさんあるが、簡単な方法はありますか?

私は、ログインクラスが含まれており、それがこのような良いアイデアである場合、私はsomehome移動することがなく、必ずこのユーザーのログイン情報のものを考え、別TestBaseクラスを持っています。

私はちょうど、誰もが任意の高レベルの提案がない作品を複製行き詰まるしたくないですか?あなたが実際に説明してきた

+0

Excelを使用することは本当に必要ですか?私はテストデータをJavaプロパティ(単純なストレージ用)またはJsonフォーマット(複雑なデータ用)に保存します。それは非常に迅速にロードされ、私が知っている任意のIDEとうまく統合されます。ログインの場合:ほとんどの場合、ベースクラスのsetup/teardown-method(@Before、@Afterを使用)にログイン/ログアウトコードを入れると、派生クラスで自動的に使用されるので便利です。 –

+0

ありがとう@Würgspaß私はあなたのJSONファイルの提案を調べます。 – tarquin

+0

私はコード例を追加しましたので、あなたがそのアイデアを得ることを願っています... –

答えて

1

Seleniumテストクラスのベースクラスをどのように設計できるかは、コンパイル可能な(完全にはコーディングされていない)クイックダーティサンプルです。

基本クラスは、派生テストクラスの前後のテスト実行と呼ばれるログイン/ログアウトメソッドを定義します。

データ(javax.jsonに基づいて)JSONファイルから読み出され(値を使用して)データを(キーを使用)と入力し位置決め要素のために使用されます。コードを簡単に拡張して、他の要素や位置指定の処理(css、xpath)の処理をサポートすることができます。

この例は、パフォーマンスに最適化されていないことに注意してください。しかし、最初は十分に速く、ニーズに合わせて調整することができます(例えば、静的な状況での熱心なデータの読み込み)。

package myproject; 

import java.io.*; 
import java.util.*; 

import javax.json.Json; 
import javax.json.stream.JsonParser; 
import javax.json.stream.JsonParser.Event; 

import org.junit.*; 
import org.openqa.selenium.*; 
import org.openqa.selenium.support.ui.*; 

public class MyProjectBaseTest {  
    protected static WebDriver driver; 

    @Before 
    public void before() { 
     WebDriver driver = new FirefoxDriver(); 
     driver.get("http://myapp"); 
     login(); 
    } 

    @After 
    public void after() { 
     logout(); 
    } 

    private void login() { 
     Map<String, String> data = readData("/path/to/testdata/login.json"); 

     Set<String> keys = data.keySet(); 
     for (String key : keys) { 
      WebDriverWait wait = new WebDriverWait(driver, 20L); 
      wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(key))); 
      final WebElement we = driver.findElement(By.id(key)); 
      if ("input".equals(we.getTagName())) { 
       we.clear(); 
       we.sendKeys(data.get(key)); 
      } 
      //else if "button".equals(we.getTagName()) 
     } 
    } 

    private void logout() { 
     //logout code ... 
    } 

    private Map<String, String> readData(String filename) { 
     Map<String, String> data = new HashMap<String, String>(); 

     InputStream is = null; 
     String key = null;   
     try { 
      is = new FileInputStream(filename); 
      JsonParser parser = Json.createParser(is); 
      while (parser.hasNext()) { 
       Event e = parser.next(); 
       if (e == Event.KEY_NAME) { 
        key = parser.getString(); 
       } 
       if (e == Event.VALUE_STRING) { 
        data.put(key, parser.getString()); 
       } 
      } 
      parser.close(); 
     } 
     catch (IOException e) { 
      //error handling 
     } 
     finally { 
      //close is 
     } 

     return data; 
    } 

} 
1

すべてこの「セットアップ作業」には、かなり一般的なものであり、それはAAA patternが実際にどのように動作するかです:

unittestの方法で

をコードを配置してフォーマットするためのパターン

アドバンスフィクスチャ使用すると、あなたのケースに最も適したものを利用できますxUnit Setup pattern

私は完全に@Würgspaßさんのコメントに同意します。彼が何を記述しているかはObject Mapと呼ばれています。過去3年間に多大な成功を収めています。

あなたのシナリオで特定のフレームワークが使用されているとは思われません。だから、と組み合わせてCucumber JVMのような成熟したものを選ぶことをお勧めします。最後のものはContext injectionを提供するので、シナリオの実行中にコンテキスト/状態を共有できる常にクリーンなステップ定義オブジェクトを取得できます。そして、すべての重い設定を一度再利用して、すべてのテストの間に共有することができます。 I/O操作が高価であり、より複雑な場合に問題を引き起こす可能性があります。テストの並列実行

あなたのコードの設計に関しては、CallWrappersのように非常に便利なSelenium's Test design considerationsのいくつかを見つけることができます。

+0

いくつかの素晴らしいリンクと提案をお寄せいただきありがとうございます@ekostadinov私はあなたが提供した資料に基づいて改善する方法を見つけようとします。 – tarquin

+0

@ tarquin 'ありがとう'コメントを削除してください。 StackOverflowには良いと便利な回答を投票するという明確な方針がありますが、私は「私が受け入れた」とマークすることもできます。これはあなたの質問をきれいに保つのに役立ちます:) – ekostadinov

関連する問題