testng属性和用例管理

1.在pom.xml中增加testng的依赖,以导入testNG

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.10.2</version>
</dependency>

2.@Test属性

使用此注解的方法或者类将被TestNG识别并运行

 

@Test属性 描述 示例 结果
dependOnMethods 先执行依赖的方法,再执行本体
@Test(dependsOnMethods = "test2")
public void test1(){
    System.out.println("Case1:这是第一个测试方法");
}
@Test
public void test2(){
    System.out.println("Case1:这是第二个测试方法");
}
methods>
	<include name="test1"/>
	<include name="test2"/>
</methods>
先执行test2,再执行test1
Case1:这是第二个测试方法
Case1:这是第一个测试方法
alwaysRun 设置为true时,无论什么情况都会运行。会跳过执行失败的语句
@Test(dependsOnMethods = "test2",alwaysRun = true)
public void test1(){
    System.out.println("Case1:这是第一个测试方法");
}

@Test
public void test2(){
    System.out.println("Case2:这是第二个测试方法");
    Assert.assertEquals(true,false);
}

alwaysRun = false
Case1:这是第二个测试方法
...报错信息...
Total tests run: 2, Passes: 0, Failures: 1, Skips: 1

alwaysRun = true
Case1:这是第二个测试方法
...报错信息...
Case1:这是第一个测试方法
Total tests run: 2, Passes: 1, Failures: 1, Skips: 0

description 说明,就是个note,不会在结果中体现
@Test(description="给自己看的")
public void test2(){
    System.out.println("Case1:这是第二个测试方法");
}
执行结果不会体现,报表中可以看到
enabled  设置为false时失效
@Test(enabled = false)
public void test3(){
    System.out.println("Case1:第3个方法不会被执行");
}
<methods>
    <include name="test3"/>
    <!-- 即便xml中配置,test3依然不会被执行 -->
</methods>
timeout  如果单元测试花费的时间超过指定的毫秒数,那么testNG将会中止它并将其标记为失败。
@Test(timeOut = 5000)
public void f1(){
    try {
        Thread.sleep(6000);
    }catch (InterruptedException e){
        System.out.println("超时");
    }
        System.out.printf("这是%s的第一个测试方法在执行\n",getClass().getName());
}
com.singledog.testng.Case4 开始执行
超时
这是com.singledog.testng.Case4的第一个测试方法在执行
org.testng.internal.thread.ThreadTimeoutException: 
Method com.singledog.testng.Case4.f1() didn't finish 
within the time-out 5000
singledog.testng.Case4 结束执行

===============================================
Default Suite
Total tests run: 1, Passes: 0, Failures: 1, Skips: 0
===============================================
groups 将不同的用例分组,在xml中配置信息,而执行相应组的用例
public class Case5 {
    @Test(groups = "回归")
    public void testMain(){
        System.out.println("主页面");
    }
    @Test(groups = "回归")
    public void testSearch(){
        System.out.println("搜索功能");
    }
}

 

<?xml version="1.0" encoding="utf-8" ?>
<suite name="棋牌项目" parallel="false">
    <test name="模块1">
       <groups>
           <run>
               <include name="回归" />
           </run>
       </groups>
        <classes>
            <class name="com.singledog.testng.Case5" />
        </classes>
    </test>
</suite>

 

主页面
搜索功能

===============================================
棋牌项目
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================
priority  定义权重,数值越小,优先级越高
public class Case2 {
    @Test(priority = 5)
    public void f1(){
        System.out.printf("这是%s的第一个测试方法在执行\n",getClass().getName());
    }
    @Test(priority = 2)
    public void f2(){
        System.out.printf("这是%s的第二个测试方法在执行\n",getClass().getName());
    }
    @Test(priority = 3)
    public void f3(){
        System.out.printf("这是%s的第三个测试方法在执行\n",getClass().getName());
    }
    @Test(priority = 4)
    public void f4(){
        System.out.printf("这是%s的第四个测试方法在执行\n",getClass().getName());
    }
}
这是com.singledog.testng.Case2的第二个测试方法在执行
这是com.singledog.testng.Case2的第三个测试方法在执行
这是com.singledog.testng.Case2的第四个测试方法在执行
这是com.singledog.testng.Case2的第一个测试方法在执行

 

3. 使用xml文件进行用例管理

testng.xml用来管理执行测试用例,执行顺序从上到下
  • suite:根标签,最大的套件,代表项目。
  • 多个项目可以用多个xml文件进行管理
  • test:模块
  • classes、class:测试类
  • method:测试类中的@Test方法
<?xml version="1.0" encoding="utf-8" ?>
<suite name="棋牌项目" parallel="false">
    <parameter name="animal" value="hill" />
    <test name="模块1">
        <classes>
            <class name="com.singledog.testng.Case1">
                <methods>
                    <include name="test1"/>
                    <include name="test2"/>
                    <include name="test3"/>
                </methods>
            </class>
            <class name="com.singledog.testng.Case2">
        </classes>
    </test>
    <test name="模块2">
        <classes>
            <class name="com.singledog.testng.Case3">
            <class name="com.singledog.testng.Case4">
        </classes>
    </test>
</suite>

 

4. before和after注解

Suite和Test对于所有套件都有效果

  • @BeforeSuite:带注释的方法将在该套件中的所有测试运行之前运行
  • @AfterSuite:带注释的方法将在该套件中的所有测试运行之后运行
  • @BeforeTest:带注释的方法将在运行属于标记内的类的任何测试方法之前运行
  • @AfterTest:带注释的方法将在运行属于标记内的类的任何测试方法之后运行

class和method只对当前类起作用

  • @BeforeClass:带注释的方法将在调用当前类中的第一个测试方法之前运行
  • @AfterClass:带注释的方法将在调用当前类中的所有测试方法运行之后运行
  • @BeforeMethod:带注释的方法将在每个测试方法之前运行
  • @AfterMethod:带注释的方法将在每个测试方法之后运行

 

查看代码
   public class Case1 {
    @Test(dependsOnMethods = "test2")
    public void test1(){
        System.out.printf(
            "这是%s的第一个测试方法在执行\n",
            getClass().getName());
    }

    @Test(description="给自己看的")
    public void test2(){
        System.out.printf(
            "这是%s的第二个测试方法在执行\n",
            getClass().getName());
    }
    @Test(enabled = false)
    public void test3(){
        System.out.println(
            "Case1:第3个方法不会被执行");
    }
    @Test
    public void test4(){
        System.out.printf(
            "这是%s的第四个测试方法在执行\n",
            getClass().getName());
    }
    @BeforeClass
    public void bc(){
        System.out.printf(
            "%s 开始执行\n",
            getClass().getName());
    }
    @AfterClass
    public void ac(){
        System.out.printf(
            "%s 结束执行\n\n",
            getClass().getName());
    }
}
public class Case2 {
    @BeforeClass
    public void bc(){
        System.out.printf(
            "%s 开始执行\n",
            getClass().getName());
    }
    @AfterClass
    public void ac(){
        System.out.printf(
            "%s 结束执行\n\n",
            getClass().getName());
    }
    @Test
    public void f1(){
        System.out.printf(
            "这是%s的第一个测试方法在执行\n",
            getClass().getName());
    }
}
public class Case4 {
    @BeforeClass
    public void bc(){
        System.out.printf(
            "%s 开始执行\n",
            getClass().getName());
    }
    @AfterClass
    public void ac(){
        System.out.printf(
            "%s 结束执行\n\n",
            getClass().getName());
    }
    @Test
    public void f1(){
        System.out.printf(
            "这是%s的第一个测试方法在执行\n",
            getClass().getName());
    }
}
查看代码
 public class Case3 {
    @Test
    public void testMethod1(){
        System.out.printf("这是%s的第一个测试方法在执行\n",getClass().getName());
    }
    @Test
    public void testMethod2(){
        System.out.printf("这是%s的第二个测试方法在执行\n",getClass().getName());
    }
    @BeforeSuite
    public void f1(){
        System.out.println("before suite");
    }
    @AfterSuite
    public void f2(){
        System.out.println("after suite");
    }
    @BeforeClass
    public void f3(){
        System.out.println("before class Case3");
    }
    @AfterClass
    public void f4(){
        System.out.println("after class Case3\n");
    }
    @BeforeMethod
    public void f5(){
        System.out.println("before method");
    }
    @AfterMethod
    public void f6(){
        System.out.println("after method");
    }
    @BeforeTest
    public void f7(){
        System.out.println("before test");
    }
    @AfterTest
    public void f8(){
        System.out.println("after test");
    }
}

 

<!-- testng.xml -->
<?xml version="1.0" encoding="utf-8" ?>
<suite name="棋牌项目" parallel="false">before suite
    <test name="模块1">
        <classes>
            <class name="com.singledog.testng.Case1">
                <methods>
                    <include name="test1"/>
                    <include name="test2"/>
                    <exclude name="test4"/>
                </methods>com.singledog.testng.Case1 结束执行
            </class>
            <class name="com.singledog.testng.Case2"></class>
        </classes>
    </test>
    <test name="模块2">
        <classes>
            <class name="com.singledog.testng.Case3"></class>
            <class name="com.singledog.testng.Case4"></class>
        </classes>
    </test>
</suite>
before suite
com.singledog.testng.Case1 开始执行
这是com.singledog.testng.Case1的第二个测试方法在执行
这是com.singledog.testng.Case1的第一个测试方法在执行
com.singledog.testng.Case1 结束执行

com.singledog.testng.Case2 开始执行
这是com.singledog.testng.Case2的第一个测试方法在执行
com.singledog.testng.Case2 结束执行

before test
before class Case3
before method
这是com.singledog.testng.Case3的第一个测试方法在执行
after method
before method
这是com.singledog.testng.Case3的第二个测试方法在执行
after method
after class Case3

com.singledog.testng.Case4 开始执行
这是com.singledog.testng.Case4的第一个测试方法在执行
com.singledog.testng.Case4 结束执行

after test
after suite

===============================================
棋牌项目
Total tests run: 6, Passes: 6, Failures: 0, Skips: 0
===============================================

 

5. 传递参数

5.1 parameters注解

public class Case5 {
    @Test
    @Parameters({"animal","name"})
    public void test1(String animal, String name){
        System.out.println("Case5 ... test1 ...");
        System.out.printf("这是%s,它的名字是%s\n", 
                          animal, name);
    }
}

 

<?xml version="1.0" encoding="utf-8" ?>
<suite name="棋牌项目" parallel="false">
    <parameter name="animal" value="老虎" />
    <parameter name="name" value="楠楠" />
    <test name="模块1">
        <classes>
            <class name="com.singledog.testng.Case5" />
        </classes>
    </test>
</suite>
 
Case5 ... test1 ...
这是老虎,它的名字是楠楠

===============================================
棋牌项目
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
===============================================

5.2 DataProvider注解

public class Case5 {
    @Test(dataProvider = "datas")
    public void test1(String animal, String name){
        System.out.println("Case5 ... test1 ...");
        System.out.printf("这是%s,它的名字是%s\n",animal,name);
    }
    @DataProvider(name = "datas")
    public Object[][] datas(){
        Object[][] datas = {//将数组执行完
                {"猫","汤姆"},
                {"老鼠","杰瑞"},
        };
        return datas;
    }
}
Case5 ... test1 ...
这是猫,它的名字是汤姆
Case5 ... test1 ...
这是老鼠,它的名字是杰瑞

===============================================
Default Suite
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================

 

6. 使用TestNg断言

断言 描述 示例
assertTrue 判断是否为true。True就通过
@Test
public void testTrue(){
    Assert.assertTrue(1==2,"不是True");
}
/**
* java.lang.AssertionError: 不是True
* Expected :true
* Actual   :false
*/
assertFalse 判断是否为false。false就通过
@Test
public void testFalse(){
    Assert.assertFalse(false);//pass
}
assertNull 判断元是否为null
@Test
public void testNull(){
    Assert.assertNull(null);//pass
}
assertNotNull 判断是否不为null
@Test
public void testNotNull(){
    Assert.assertNotNull(null);
    //java.lang.AssertionError: expected object to not be null
}
assertSame 判断值是否相同,还判断类型是否相同;对于对象,就是判断两者的引用是否时同一个
@Test
public void testSame(){
    /* value */
    int a = 1;
    long b = 1L;
    /* object */
    UserInfo c = new UserInfo("张三","123");
    UserInfo d = new UserInfo("张三","123");
    UserInfo e = c;
    /* same */
    Assert.assertSame(a,b,"类型不一样,比对失败");
    //java.lang.AssertionError: 类型不一样,比对失败
    Assert.assertNotSame(a,b,"不同类型的值,比对失败");

    Assert.assertSame(c,d,"不同的引用对象,比对失败");
    //java.lang.AssertionError: 不同的引用对象
    Assert.assertNotSame(c,d,"不同的引用对象,比对失败");

    Assert.assertSame(c,e,"同一个引用对象,比对失败");  
    Assert.assertNotSame(c,e,"相同的应用对象,比对失败");
    //java.lang.AssertionError: 相同的应用对象,比对失败
}
assertNotSame 判断引用地址是否不相同
assertEquals 判断值是否相同,不判断类型。对于对象,就是判断两者的引用是否时同一个。
bug:对于不同类型的值判定,会失效。建议用notSame
Assert.assertEquals(1,1L,"类型不一样,比对失败");
Assert.assertNotEquals(1,1L);
    
@Test
public void testEquals(){
    /* value */
    int a = 1;
    long b = 1L;
    /* object */
    UserInfo c = new UserInfo("张三","123");
    UserInfo d = new UserInfo("张三","123");
    UserInfo e = c;
    
    Assert.assertEquals(a,b,"类型不一样,比对失败");
    Assert.assertNotEquals(a,2);
    Assert.assertEquals(c,d,"不同的引用对象,比对失败");
    //java.lang.AssertionError: 不同的引用对象,比对失败
    Assert.assertEquals(c,e,"相同的引用对象,比对失败");
    Assert.assertNotEquals(c,d);
    Assert.assertNotEquals(c,e,"相同的引用对象,比对失败");
    //java.lang.AssertionError: 相同的引用对象,比对失败
}
assertNotEquals 判断是否不相等
assertEqualsNoOrder 判断忽略顺序是否相等  
@Test
public void testEqualsNoOrder(){
    Object[] a = {1,2,3,4};
    Object[] b = {4,3,2,1};
    Assert.assertEqualsNoOrder(a,b);
    //pass
}

7. selenium+TestNg示例

package testcase;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.util.concurrent.TimeUnit;

public class Baidu {
    private WebDriver driver;
    @BeforeTest
    public void setUp(){
        String chromepath = System.getProperty("user.dir")+"/src/main/java/drivers/chromedriver";
        System.setProperty("webdriver.chrome.driver",chromepath);
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
    }
    @Test
    public void test(){
        driver.get("https://www.baidu.com");
        driver.findElement(By.xpath("//input[@class='s_ipt' and @id='kw']")).sendKeys("selenium");
        driver.findElement(By.xpath("//input[@id='su']")).click();
        System.out.println(driver.findElement(By.xpath("//span[@class='nums_text']")).getText());
    }
    @AfterTest
    public void tearDown(){
        driver.quit();
    }
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="testSuite1">
    <test name="UITest">
        <classes>
            <class name="testcase.Baidu" />
        </classes>

    </test>
</suite>

测试结果:

posted on 2018-06-18 15:15  singleSpace  阅读(1242)  评论(0)    收藏  举报