0

フォーラムに質問を投稿して、テスト スイート (2 つのテストケースを含む) を中断することなく一貫して実行する方法を尋ねました。 前の投稿へのリンク

有益な返信が示唆した

  • クラスごとに 1 回ドライバーをインスタンス化し、同じセッションの使用に依存する同じクラスにテストケースを配置します。

  • ユーザーは、テストケースを互いに独立させることも提案しました。

    2 つのテスト ケースがあります (同じログイン セッションを維持するために、2 つのテスト ケースを 1 つのクラスに結合しました)

  • case1: サイトにログインして認証セッションを行い、メンバーを検索してメンバー プロファイルにアクセスする

  • ケース 2: メンバー プロファイルで、寄付者のプロファイル ページにアクセスし、プレッジを追加してから、特定のキャンペーン ページにアクセスしてプレッジ金額を検索します。

    私の質問は、テストケースを互いに独立させる方法です。たとえば、ログインセッションが失敗した場合でも、スイートはテストケース2を実行できます。私の考えでは、各テスト クラス (各テスト ケースを表す) で個別のドライバー インスタンスを作成する必要があるため、case1 が失敗した場合でも、case2 を実行し続けることができます。この作業を行うための適切な方法を教えてください。

    これがテストスイートの私のコードです

    テストクラスを実行するドライバー

import org.junit.runner.RunWith; org.junit.runners.Suite をインポートします。

@RunWith(Suite.class)
@Suite.SuiteClasses
  (
    {
        SearchDonorSuzy.class

    }
  )

public class searchDonorAddPledge 
{

}

テスト ケース コードには、認証、メンバーの検索、ドナー プロファイルへのアクセス、誓約の追加、誓約金額の検索が含まれます。

import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class SearchDonorSuzy 
{
      private WebDriver driver;
      private String baseUrl;
      private boolean acceptNextAlert = true;
      private StringBuffer verificationErrors = new StringBuffer();

      @Before
      public void setUp() throws Exception {
        driver = new FirefoxDriver();
        baseUrl = "https://jlaustin.tcheetah.com/";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
      }
         /*
          *test case 1: login + search member
          */
      @Test
      public void testSearchDonorSuzy() throws Exception {

        driver.get(baseUrl + "/?html=openid");
        driver.findElement(By.cssSelector("input[type=\"submit\"]")).click();
        driver.findElement(By.id("edit-name")).clear();
        driver.findElement(By.id("edit-name")).sendKeys("username");
        driver.findElement(By.id("edit-pass")).clear();
        driver.findElement(By.id("edit-pass")).sendKeys("password");
        driver.findElement(By.id("edit-submit")).click();
        driver.findElement(By.id("cmp_admin")).click();
        driver.findElement(By.id("quicksearch_anchor")).click();
        driver.findElement(By.cssSelector("img[alt=\"Member\"]")).click();
        driver.findElement(By.id("search_name")).clear();
        driver.findElement(By.id("search_name")).sendKeys("suzy");
        driver.manage().timeouts().implicitlyWait(6, TimeUnit.SECONDS);
        driver.findElement(By.cssSelector("input.btn")).click();
        driver.findElement(By.linkText("Balagia, Suzy")).click();
        /*
         * test case 2: access donor's profile and add a pledge
         */

        driver.findElement(By.xpath("(//a[contains(text(),'Donor')])[2]")).click();
        driver.findElement(By.linkText("Campaign Manager")).click();
        new Select(driver.findElement(By.id("campaign_id"))).selectByVisibleText("A Christmas Affair 2012");
        driver.findElement(By.xpath("//a[contains(text(),'Add\n            pledge')]")).click();
        driver.findElement(By.id("pledge_amount")).clear();
        driver.findElement(By.id("pledge_amount")).sendKeys("100.00");
        driver.findElement(By.id("pledge_notes")).clear();
        driver.findElement(By.id("pledge_notes")).sendKeys("test pledge");
        driver.findElement(By.cssSelector("input[type=\"image\"]")).click();
        /*
         * search donation amount in donation campaign page
         */
        driver.findElement(By.linkText("Donor")).click();
        driver.findElement(By.linkText("A Christmas Affair 2013")).click();
        new Select(driver.findElement(By.name("campaign_id"))).selectByVisibleText("A Christmas Affair 2012");
        driver.findElement(By.linkText("Donors")).click();
        driver.findElement(By.id("search_name")).clear();
        driver.findElement(By.id("search_name")).sendKeys("suzy");
        driver.findElement(By.cssSelector("input[type=\"image\"]")).click();
      }

      @After
      public void tearDown() throws Exception {
        //driver.quit();
        String verificationErrorString = verificationErrors.toString();
        if (!"".equals(verificationErrorString)) {
          fail(verificationErrorString);
        }
      }

      private boolean isElementPresent(By by) {
        try {
          driver.findElement(by);
          return true;
        } catch (NoSuchElementException e) {
          return false;
        }
      }

      private String closeAlertAndGetItsText() 
      {
        try 
        {
          Alert alert = driver.switchTo().alert();
          if (acceptNextAlert) 
          {
            alert.accept();
          } 
          else 
          {
            alert.dismiss();
          }
          return alert.getText();
        } 
        finally 
        {
          acceptNextAlert = true;
        }
      }

}
4

1 に答える 1

0

Webdriver を static として宣言し、@BeforeClass を使用してインスタンス化し、アプリにログオンする必要があります。これは、他のテスト クラスとは関係なく、各テスト クラスで行う必要があります。そのため、各テスト ケースには既定でログオンが指定されています。次に、各テスト メソッド (@Test) でログオンしていると見なすことができます。

ただし、これでは、実際には必要な分離が得られない可能性があります。誰かがパスワードを変更したためにサーバーがログオンを拒否した場合、すべてのテストが失敗します。

ただし、これはあなたの最大の問題ではありません。あなたの最大の問題は、少なくとも比喩的に言えば、UI 全体にコンクリートを注いでいることです。開発者は、ある時点で、送信ボタンをアンカーに変更し、jquery-ui のボタンを使用してそれぞれのボタンをスキンし、基本的な検証に合格した場合にのみ JavaScript を使用してフォーム送信を呼び出すことを選択する場合があります (これは非常に一般的です)。これが発生した場合、システムの動作は変更されず、UI はほとんど同じように見えますが、テストは失敗します。おそらく多くのテスト。このため、および他の多くの理由で、プロの Java 開発者がセレンから 10 フィート以内に近づくことはめったにありません。テストの原則のほとんどに違反しています。(注: 非常に多くの Java 開発者がいますツールを使用するということは、何万人もの人々がまさにそれを行っていることを意味する可能性があります)。セレンを使用するのではなく、jbehave を使用して BDD を調べ、GUI ではなく API を使用してテストします。

ところで: import xxx.* は使用しないでください。使用は許可されていますが、悪い習慣と見なされています。

于 2013-06-09T01:39:58.967 に答える