zoukankan      html  css  js  c++  java
  • selenium2中的TestNg注解和数据驱动的简介及使用

    TestNg常用注解介绍,先来张图:

    先看一下,以上各个注释的运行次序:

    @Test

    表示的意义:
       1.表示示该方法是一个测试方法,在运行时,会自动的运行有@Test注脚的方法。
    示例:

       image

    @BeforeMethod/@ AfterMethod

    表示的意义:
       1.beforemethod这个注脚是指加了该注脚的方法在每个测试方法运行之前会自动的被调用运行
       2.aftermethod该注脚的方法在每一个测试方法运行之后会自动的被调用运行

    示例:

       image

    @BeforeClass/@AfterClass

    表示的意义:
       1.@BeforeClass与@AfterClass,这两个注脚的方法,也就是在每个类运行之前与之后会自动的被调用
    用处:
       1.在自动化脚本运行时,一个类里面的所有测试方法设计的是在同一个浏览器里面运行,那么就是说在这个类对象产生之前,就要把浏览器给启动起来,这时候@BeforeClass可以启动浏览器,@AfterClass就可以关闭浏览器了

    @BeforeSuite/@AfterSuite /@BeforeTest/@AfterTest  

    用处:
    这四个注解是分别用在Suite与Test上的,Suite与Test是定义在XML中的,后面我们再详细介绍及代码示例。


    TestNg的数据驱动

    什么是数据驱动:
       1.数据驱动是指在一个脚本固定的情况下,用数据来控制该脚本是否运行,以及运行的次数,还有每次运行时对应的参数.
    数据驱动的应用场景:
       1.比如我们在测试登录时,要测试用不同的帐户登录,难道我们需要针对每一个帐户去写一个脚本吗?这样显然是不明智的,于是,testng为我们提供了这样一个注脚,让我们只需要提供出数据,就可以控制脚本运行的次数及相应的参数.

    TestNg数据驱动的实现

    实现方式:
       1.用注解@DataProvider.

    示例:

       image

    注意点:
      1.@DataProvider注脚的方法的返回值是Object对象的二维数组
      2.@DataProvider可以指定名称如@DataProvider(name="testData"),这样在测试方法中@Test(dataProvider="testData"),如果没有跟(name="testData"),则测试方法中的dataProvider的值就应该为@DataProvider注脚的方法名


    TestNg用XML运行

    以class为基本点

    <?xml version="1.0" encoding="UTF-8"?>
    <suite name="Suite" verbose="1" parallel="false" thread-count="1">
        <test name="Test1">
            <classes>
                <class name="com.demo.Test2" />
            </classes>
        </test>
    </suite>

    以method为基本点

    <?xml version="1.0" encoding="UTF-8"?>
    <suite name="Suite" verbose="1" parallel="false" thread-count="1">
        <test name="Test1" preserve-order="true">
            <classes>
                <class name="com.demo.Test2">
                    <methods>
                        <include name="test2" />
                        <include name="test1" />
                   </methods>
               </class>
            </classes>
        </test>
    </suite>

    以package为基本点

    <?xml version="1.0" encoding="UTF-8"?>
    <suite name="Suite" verbose="1" parallel="false" thread-count="1">
        <test name="Test1">
            <packages>
                <package name="com.demo" />
            </packages>
        </test>
    </suite>

    此外TestNg也可以用命令行运行,具体可参考:

    http://www.cnblogs.com/zhangfei/archive/2012/11/26/2788946.html

    亲自试过的,没有任何问题。结果会打印到cmd的窗口中,且在目录下会生成test-output文件夹,如下所示:

    TestNg用例管理

    遵循的原则是用例独立少依赖

    具体代码如下:

    testNg.java文件代码如下:

     1 package com.selenium.test;
     2 
     3 import org.openqa.selenium.By;
     4 import org.openqa.selenium.WebDriver;
     5 import org.openqa.selenium.firefox.FirefoxDriver;
     6 import org.testng.annotations.AfterClass;
     7 import org.testng.annotations.AfterMethod;
     8 import org.testng.annotations.BeforeClass;
     9 import org.testng.annotations.BeforeMethod;
    10 import org.testng.annotations.DataProvider;
    11 import org.testng.annotations.Test;
    12 
    13 public class testNg {
    14     public static WebDriver Driver;
    15 
    16     @BeforeClass
    17     public void beforeClass() {
    18         System.out.println("beforeClass: open the browser.");
    19     }
    20 
    21     @AfterClass
    22     public void afterClass() {
    23         System.out.println("afterClass: close the browser.");
    24         Driver.quit();
    25     }
    26 
    27     @BeforeMethod
    28     public void setUp() {
    29         System.out.println("setUp");
    30         startFireFox("http://baidu.com");
    31     }
    32 
    33     @AfterMethod
    34     public void tearDown() {
    35         System.out.println("tearDown");
    36         Driver.close();
    37     }
    38 
    39     @Test(dataProvider = "user")
    40     public void testBaidu(String text) {
    41         System.out.println(text);
    42         Driver.findElement(By.id("kw")).sendKeys(text);
    43     }
    44 
    45     // 由于user没有指定name,所以直接使用方法名user
    46     @Test(dataProvider = "user")
    47     public void testUser(String text) {
    48         System.out.println(text);
    49     }
    50 
    51     // 由于score指定name=scoreForUser,所以使用scoreForUser
    52     @Test(dataProvider = "scoreForUser")
    53     public void testScore(String text) {
    54         System.out.println(text);
    55     }
    56 
    57     // 虽然score指定name=scoreForUser, 但也可以直接使用方法名score
    58     @Test(dataProvider = "score")
    59     public void testScoreAgain(String text) {
    60         System.out.println(text);
    61     }
    62 
    63     @DataProvider
    64     public Object[][] user() {
    65         return new Object[][] { { "zhangsan" }, { "lisi" } };
    66     }
    67 
    68     // 这种方式是给DataProvider重命名为sourceForUser
    69     @DataProvider(name = "scoreForUser")
    70     public Object[][] score() {
    71         return new Object[][] { { "90" }, { "100" } };
    72     }
    73 
    74     public static void startFireFox(String url) {
    75         Driver = new FirefoxDriver();
    76         Driver.manage().window().maximize();
    77         Driver.navigate().to(url);
    78     }
    79 
    80     // public static void closeFireFox() {
    81     // Driver.close();
    82     // Driver.quit();
    83     // }
    84 }

    testPackage.xml具体代码如下:

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <suite name="Suite" verbose="1" parallel="false" thread-count="1">
    3     <test name="Test1">
    4         <packages>
    5             <package name="com.selenium.test" />
    6         </packages>
    7     </test>
    8 </suite>

    testClass.xml具体代码如下:

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <suite name="Suite" verbose="1" parallel="false" thread-count="1">
    3     <test name="Test1">
    4         <classes>
    5             <class name="com.selenium.test.testNg" />
    6         </classes>
    7     </test>
    8 </suite>

    testMethod.xml具体代码如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <suite name="Suite" verbose="1" parallel="false" thread-count="1">
     3     <test name="Test1">
     4         <classes>
     5             <class name="com.selenium.test.testNg" />
     6                 <methods>
     7                     <include name="testBaidu" />
     8                 </methods>
     9         </classes>
    10     </test>
    11 </suite>

     

    最后打个广告,不要介意哦~

    最近我在Dataguru学了《软件自动化测试Selenium2》网络课程,挺不错的,你可以来看看!要是想报名,可以用我的优惠码 G863,立减你50%的固定学费!

    链接:http://www.dataguru.cn/invite.php?invitecode=G863

  • 相关阅读:
    C#执行cmd命令
    mongodb 高级查询详解(2)
    mongodb-管道操作:常规查询
    python-pymongo高级查询
    traceback异常打印
    Sanic基础和测试
    Python网络爬虫实战:根据天猫胸罩销售数据分析中国女性胸部大小分布
    POST提交数据的四种方式
    pymongo基础:入门
    python中__name__的意义
  • 原文地址:https://www.cnblogs.com/yajing-zh/p/4925155.html
Copyright © 2011-2022 走看看