zoukankan      html  css  js  c++  java
  • 第四章 TestNG测试用例分步解析(上)

    ------Web自动化测试之Webdriver+TestNG--从零到熟练(系列)

          经过前三章我们对自动化相关内容的学习,我们了解了什么是自动化测试,测试环境的搭建和WebDriver API的介绍,定位方法及检测点儿设置等相关知识点。从本章开始,我们讲探讨测试用例的编写,以及其相关的知识点。

    4.1 第一个测试用例

         虽然我们在第二章在搭建测试环境的时候,写了一个简单的测试用例检测环境,不过那不算是一个完整的测试用例。下面我们以登录众筹网为例,开始我们测试用例的编写之旅!

       首先我们先写一下这个测试用例的手工测试步骤:

    (1)用浏览器打开众筹网首页www.zhongchou.com

    (2)单击右上角的登录按钮,弹出登录浮层。

    (3)输入用户名和密码,单击登录按钮,进行登录。

    (4)检测是否登录成功,并打开了首页。

    (5)退出登录。

       这是我们手工测试的步骤,如果要转化成自动化测试用例,需要转化成我们需要的脚本语言编写的程序。

    4.2 Selenium IDE录制测试用例

       如我们前面讲到的,可以利用Selenium IDE来录制测试步骤,然后添加上检测点,就可以形成一个测试用例。转化成我们需要的脚本语言格式,如java,然后保存文件,放到我们的开发环境下就可以调试运行了。

    具体的录制方法如下:

    (1)打开火狐浏览器,打开Selenium IDE,在IDEBase URL中输入要录制的网站地址:http://www.zhongchou.com

    (2)IDE默认是处于录制状态的,如果没有,单击红色按钮,录制。在火狐浏览器的地址栏中输入http://www.zhongchou.com,打开百度首页。

    (3)单击右上角的登录按钮,弹出登录浮层。

    (4)在弹出的浮层中输入 用户名:183****8905,密码:a****00,然后单击登录按钮。

    (5)在打开的首页中,右击右上角的昵称,如图4.2.1所示,选择assert判断项,设置检测点。然后退出登录。

     

    第四章 <wbr>TestNG测试用例分步解析(上)
    4.2.1 设置检测点

    (6)单击Selenium IDE的回放按钮,检测录制的测试步骤,如图4.2.2所示,不过此时检测点会报错,原因是执行太快,页面没有刷新出来。

     

    第四章 <wbr>TestNG测试用例分步解析(上)
    4.2.2 回放录制的测试步骤

    (7)为了解决这个问题,我们在检测点前添加一个等待。等待我们要检测的内容出现后,再去执行判断。如图:4.2.3所示,回放验证成功。

     

    第四章 <wbr>TestNG测试用例分步解析(上)
    4.2.3 添加等待命令

    (8)现在说明我们录制的测试用例没有问题,导出录制的测试用例为java/Junit/WebDriver格式的,保存为login.java.如图4.2.4所示:

     

    第四章 <wbr>TestNG测试用例分步解析(上)
    4.2.4 导出录制的测试用例

    (9)检查导出的代码,Selenium IDE帮我们导出的代码如下:

     

    #login.java

    package com.example.tests;

     

    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 Login {

      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 = "http://www.zhongchou.com/";

        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

      }

     

      @Test

      public void testLogin() throws Exception {

        driver.get(baseUrl + "/");

        driver.findElement(By.id("headerLogin")).click();

        driver.findElement(By.name("username")).clear();

        driver.findElement(By.name("username")).sendKeys("18311338905");

        driver.findElement(By.name("user_pwd")).clear();

        driver.findElement(By.name("user_pwd")).sendKeys("a000000");

        driver.findElement(By.cssSelector("a.zc")).click();

        for (int second = 0;; second++) {

               if (second >= 60) fail("timeout");

               try { if ("潜龙9527".equals(driver.findElement(By.cssSelector("div.siteLgInner")).getText())) break; } catch (Exception e) {}

               Thread.sleep(1000);

        }

     

        assertEquals("潜龙9527", driver.findElement(By.cssSelector("div.siteLgInner")).getText());

        driver.findElement(By.cssSelector("div.siteLgInner")).click();

    driver.findElement(By.linkText("退出")).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 boolean isAlertPresent() {

        try {

          driver.switchTo().alert();

          return true;

        } catch (NoAlertPresentException e) {

          return false;

        }

      }

     

      private String closeAlertAndGetItsText() {

        try {

          Alert alert = driver.switchTo().alert();

          String alertText = alert.getText();

          if (acceptNextAlert) {

            alert.accept();

          } else {

            alert.dismiss();

          }

          return alertText;

        } finally {

          acceptNextAlert = true;

        }

      }

    }

     

    代码讲解:

    Ø 最前面是引用Webdriver相关的一些儿函数或方法。

    Ø 创建一个测试类Login类里是具体的测试方法testLogin()

    Ø 函数中是一步步的具体操作。

    Ø 函数setUp()tearDown,是测试用例执行前和执行后要做的操作。

    Ø 函数isElementPresent(),isAlertPresent()closeAlertAndGetItsText()selenium IDE自己产生的,对测试用例没有任何用处,可以忽略。

    (10)      将代码导入到开发环境中。打开Eclipse,新建java工程如:Test。将刚刚保存的login.java文件导入到这个工程中,如图4.2.5所示:

     

    第四章 <wbr>TestNG测试用例分步解析(上)
    4.2.5导入保存的文件

    (11)      运行验证刚刚导入的代码,右击这个文件,“Run as-->”TestNG test”,查看运行结果。程序没有任何输出,经分析,我们得出原因:因为我们导出的是WebDriver格式的,TestNG不识别,如果我们直接导出TestNG格式的,又没有WebDriver相关的引用。所以,我们就修改一下代码,将“@Before@After”修改成@BeforeTest@AfterTest”即可运行。但运行过程中会报错,如图4.2.6所示:

     

    第四章 <wbr>TestNG测试用例分步解析(上)
    4.2.6 程序运行结果

    这个错误原因是:我们退出时,先需要将鼠标移到昵称,会拉出下拉菜单,然后单击退出菜单进行退出。而Selenium IDE是录制不到鼠标over到昵称上的操作的,所以找不到退出按钮。而mouseover()操作需要导入另外的包,所以我们采出以下操作来完成退出:

    //退出链接:http://www.zhongchou.com/usernew-loginout

    driver.get(baseUrl + "usernew-loginout");

    (12)      再次执行测试用例,则会打开火狐浏览器,登录到众筹网,然后检测登录是否成功,而后退出。此是测试用例会有如图4.2.7所示的输出结果:

     

    第四章 <wbr>TestNG测试用例分步解析(上)
    4.2.7 修改后的测试用例输出

    12)至此,利用Selenium IDE来录制测试用例,并且在开发环境下运行通过。可是我们发现这样录制测试用例还是存在问题的,转化后会有很多用不到的代码存在,而且不符合模块化编程的规范,有些功能还实现不了。所以我们还是喜欢自己编写测试用例,录制转化只能当作参考。

  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/eagleking0318/p/6520817.html
Copyright © 2011-2022 走看看