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,在IDE的Base URL中输入要录制的网站地址:http://www.zhongchou.com

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

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

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

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

     


    4.2.1 设置检测点

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

     


    4.2.2 回放录制的测试步骤

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

     


    4.2.3 添加等待命令

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

     


    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所示:

     


    图4.2.5导入保存的文件

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

     


    图4.2.6 程序运行结果

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

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

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

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

     


    图4.2.7 修改后的测试用例输出

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

  • 相关阅读:
    递归
    数据结构与算法-复杂度分析
    'latin-1' codec can't encode characters in position解决字符问题
    redis理解
    spring 嵌套事务问题
    Parameterized testing with any Python test framework
    分布式事务测试考虑点
    python orm / 表与model相互转换
    Python多线程、多进程
    JS运动
  • 原文地址:https://www.cnblogs.com/hua-an/p/5169468.html
Copyright © 2011-2022 走看看