繁体   English   中英

JUnit4测试用例无法继续

[英]JUnit4 test case won't continue

我使用Selenium IDE创建了一个包含2个测试用例的测试套件。 我将该套件导出为Java / JUnit4 / WebDriver。

第一个测试用例允许用户登录站点,找到匹配项后进行成员搜索,访问成员的个人资料

第二个测试用例:在会员资料中,单击“捐赠”链接以添加承诺。

该测试套件可以在Selenium IDE中正常运行,但是当我执行该套件时,它会在Eclipse中挂起。 行为在Eclipse中,第一个测试用例运行良好,第二个用例打开一个新的浏览器,系统需要登录(输入用户名和密码)。

我想知道该怎么办,因此测试用例2继续进行,而无需用户登录。 感谢您的帮助和建议。

这是我的测试套件代码,分为3部分(由于该站点是内部站点,因此删除了uid和pd)

-test suite runner file: searchDonorAddPledge   
-test case1: searchDonorSuzy.class    
-test case2: DonorAddPledge.class

失败跟踪消息:

  1. org.openqa.selenium.StaleElementReferenceException:在高速缓存中找不到元素-自查找以来,页面可能已更改命令持续时间或超时:30.12秒

  2. 由以下原因引起:org.openqa.selenium.remote.ErrorHandler $ UnknownServerException:在缓存中找不到元素-自查找以来页面可能已更改构建信息:版本:'2.31.0',修订版:'1bd294d',时间:'2013-02-27 20:53:56'

运行文件:

import org.junit.runners.Suite;
import org.junit.runner.RunWith;

      @RunWith(Suite.class)
      @Suite.SuiteClasses
      (
        {
            SearchDonorSuzy.class,
            DonorAddPledge.class      
        }
      )

      public class searchDonorAddPledge { }

测试用例1的代码:

import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
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
      public void testSearchDonorSuzy() throws Exception {
        // set overall speed of the test case
        // ERROR: Caught exception [ERROR: Unsupported command [setSpeed | 4000 | ]]
        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.findElement(By.cssSelector("input[type=\"image\"]")).click();
        driver.findElement(By.linkText("Balagia, Suzy")).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;
        }
      }

}

testcase2代码:

import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
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 DonorAddPledge 
{
      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
      public void testDonorAddPledge() throws Exception 
      {
        driver.get(baseUrl + "/?nd=db_member&account_id=942&nowwritestate=i1110536420226242");

        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();
      }

      @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;
        }
      }

}

这两个测试用例都在其@Before方法中实例化了一个新的驱动程序。 这将启动一个带有新会话的新浏览器实例,因此它将丢失先前任何测试用例的已登录会话详细信息:

driver = new FirefoxDriver();

我建议研究两种替代策略:

  1. 每个类一次实例化驱动程序,然后将测试用例放入依赖于使用同一会话的同一类中。
  2. 重组您的测试用例,使它们彼此独立。

1.在多个测试用例中保持相同的会话

通过每个类仅实例化一次驱动程序,而不是针对每个测试用例单独实例化驱动程序,可以使代码执行效率更高。 您应该认为这主要是效率的节省; 我不建议使用它作为将测试用例链接在一起的方式,例如,使测试用例2依赖于成功运行的测试用例1。

2.使您的测试用例独立

总是很想按顺序构造测试用例,因此您要进行测试用例1(例如,包括登录),并且自然而然地导致测试用例2(它执行一些进一步的操作)。 但是我警告这会导致问题。 这会使您的整个测试套件变得更加脆弱-如果测试用例1中存在问题,则所有随后的测试用例都将失败。 它使测试的灵活性降低-您不能只运行测试用例3来进行单独的重新测试,也不能从套件中选择单个测试用例。

我强烈建议您研究第二种策略; 因此,例如,如果测试用例1仅在测试登录例程,则使其仅测试登录例程,然后再次注销。 而且,如果测试用例2仅测试了一些仅在登录后才能实现的功能-很好,请使其登录,以便可以获取其感兴趣的功能。测试用例1确实也可以登录的事实与测试用例2无关紧要,这也不是问题-实际上,您可以将其视为开始重构测试用例以将重复的代码提取到单独的方法调用中的机会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM