0

我在论坛上发布了一个问题,询问如何使测试套件(带有 2 个测试用例)持续运行而不会中断。 链接到以前的帖子

一个有用的回复建议

  • 每个类实例化一次驱动程序,并将测试用例放入依赖于使用同一会话的同一类中。

  • 用户还建议使测试用例彼此独立。

    我有 2 个测试用例(为了保持相同的登录会话,我将 2 个测试用例合并为一个类)

  • case1:认证会话登录网站,然后搜索会员并访问会员资料

  • 案例2:在会员资料中,进入捐助者资料页面,然后添加一个认捐,然后通过访问特定的活动页面搜索认捐金额。

    我的问题是:如何使测试用例相互独立,例如当登录会话失败时,套件仍然可以执行 testcase2。我的想法是我需要在每个测试类中创建单独的驱动程序实例(代表每个测试用例),这样当case1失败时,case2可以继续运行。请告诉我正确的方法来完成这项工作。

    这是我的测试套件代码

    驱动程序执行测试类

导入 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 声明为静态,然后使用 @BeforeClass 实例化它并登录到您的应用程序。您应该在每个测试类中独立于其他类执行此操作。因此,每个测试用例都默认登录。然后,您可以让每个测试方法 (@Test) 假定您已登录。

不过,这可能不会真正给您想要的分离。如果服务器因为有人更改了您的密码而拒绝让您登录,那么您的所有测试都将失败。

不过,这不是你最大的问题。你最大的问题是你在你的 UI 上浇混凝土,至少在比喻上是这样。您的开发人员可能会选择在某些时候将提交按钮更改为锚点,使用 jquery-ui 的按钮为每个按钮设置外观,然后仅在通过一些基本验证时才使用 javascript 调用表单提交(这很常见)。如果发生这种情况,您的系统行为将不会改变,并且 UI 看起来几乎相同,但您的测试将失败。应该是很多测试。出于这个原因,以及许多其他原因,专业的 Java 开发人员很少进入硒的 10 英尺范围内。它违反了大多数测试原则。(注意:Java 开发者太多了,甚至很少见使用工具可能意味着有成千上万的人在这样做)。我不会使用 selenium,而是使用 jbehave 来查看 BDD,并通过您的 api 而不是 GUI 进行测试。

顺便说一句:你不应该使用 import xxx.* - 这是允许的,但被认为是不好的做法。

于 2013-06-09T01:39:58.967 回答