TestNG学习笔记新的

1、参考官方文档https://www.yiibai.com/html/testng/2013/0915300.html

 

package com.cib.testng;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;

public class TestngAnnotation {
    // test case 1
    @Test
    public void testCase1() {
        System.out.println("in test case 1");
    }

    // test case 2
    @Test
    public void testCase2() {
        System.out.println("in test case 2");
    }

    @BeforeMethod
    public void beforeMethod() {
        System.out.println("in beforeMethod");
    }

    @AfterMethod
    public void afterMethod() {
        System.out.println("in afterMethod");
    }

    @BeforeClass
    public void beforeClass() {
        System.out.println("in beforeClass");
    }

    @AfterClass
    public void afterClass() {
        System.out.println("in afterClass");
    }

    @BeforeTest
    public void beforeTest() {
        System.out.println("in beforeTest");
    }

    @AfterTest
    public void afterTest() {
        System.out.println("in afterTest");
    }

    @BeforeSuite
    public void beforeSuite() {
        System.out.println("in beforeSuite");
    }

    @AfterSuite
    public void afterSuite() {
        System.out.println("in afterSuite");
    }

}

 

testNG.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
  <test name="test1">
    <classes>
       <class name="com.cib.testng.TestngAnnotation"/>
    </classes>
  </test>
</suite>

 

程序运行的结果是:

[TestNG] Running:
  D:\work_project1\TestNG\src\testNG.xml

in beforeSuite
in beforeTest
in beforeClass
in beforeMethod
in test case 1
in afterMethod
in beforeMethod
in test case 2
in afterMethod
in afterClass
in afterTest
in afterSuite

===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================

 

见上面的输出,TestNG是执行过程如下:

  • 首先所有beforeSuite()方法只执行一次。

  • 最后,afterSuite的()方法只执行一次。

  • 即使方法 beforeTest(), beforeClass(), afterClass() 和afterTest() 方法只执行一次。

  • beforeMethod()方法执行每个测试用例,但在此之前执行的测试用例。

  • afterMethod()方法执行每个测试用例,但测试用例执行后。

  • In between beforeMethod() and afterMethod() each test case executes

TestNG-分组groups

TestNG可以执行复杂的测试方法分组。您不仅可以声明方法属于组,而且还可以指定包含其他组的组。然后可以在testng.xml配置一组特定的组,或同时排除另一组。

package com.kdzwy.practice;
import org.testng.annotations.Test;
/**
 * 
 * <p>
 * Title: TestngGroups
 * </p>
 * 
 * <p>
 * 对应配置文件testng-groups.xml 
 * Description:使用groups进行分组测试,include和exclude的原则是保留最小集合,
 * </p>
 * 
 * <p>
 * Company:
 * </p>
 * 
 * @author : Dragon
 * 
 * @date : 2014年10月13日
 */
public class TestngGroups {
    @Test(groups = { "functest", "checkintest" })
    public void testMethod1() {
        System.err.println("groups = { functest, checkintest }");
    }

    @Test(groups = { "functest", "checkintest" })
    public void testMethod2() {
        System.err.println("groups = { functest, checkintest }");
    }

    @Test(groups = { "functest" })
    public void testMethod3() {
        System.err.println("groups = { functest }");
    }

    @Test(groups = { "checkintest" })
    public void testMethod4() {
        System.err.println("groups = { checkintest }");
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="framework_testng">
    <test verbose="2" name="TestGroups">
        <groups>
            <run>
                <include name="functest" />
            </run>
        </groups>

        <classes>
            <class name="com.kdzwy.practice.TestngGroups" />
        </classes>
    </test>
</suite>

 

运行结果为:

[TestNG] Running:
  D:\work_project1\TestNG\src\com\kdzwy\practice\testNG.xml

groups = { functest, checkintest }
groups = { functest, checkintest }
groups = { functest }
PASSED: testMethod1
PASSED: testMethod2
PASSED: testMethod3

排除组

testng.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="framework_testng">
    <test verbose="2" name="TestGroups">
        <groups>
            <run>
                <include name="functest" />
                <exclude name="checkintest" />
            </run>
        </groups>

        <classes>
            <class name="com.kdzwy.practice.TestngGroups" />
        </classes>
    </test>
</suite>

[TestNG] Running:
D:\work_project1\TestNG\src\com\kdzwy\practice\testNG.xml

groups = { functest }
PASSED: testMethod3

===============================================
TestGroups
Tests run: 1, Failures: 0, Skips: 0
===============================================


===============================================
framework_testng
Total tests run: 1, Failures: 0, Skips: 0

群组

当我们的测试用例累积了很多以后,我们可能不需要测试之前的分组,只要测试刚刚写好的分组,这时候testng提供了一种新的配置方式,来实现这一功能,让测试人员只修改配置文件就完成测试

package com.kdzwy.practice;
import org.testng.annotations.Test;
/**
 * 
 * <p>
 * Title: TestngGroupsOfGroups
 * </p>
 * 
 * <p>
 * 参考配置文件:testng-groupsOfGroups.xml
 * Description:使用<define>标签将测试方法在组内再次进行分组并以name属性进行区分,
 * <run>通过define标签的name进行调用,以后修改测试直接修改run调用的名称即可
 * 
 * 注:<b>多个group测试时,xml文件dom顺序必须是'<groups>'标签必须在'<test>'标签内, 否则会 有空指针异常
 * </p>
 * 
 * <p>
 * Company:
 * </p>
 * 
 * @author : Dragon
 * 
 * @date : 2014年10月13日
 */
public class TestngGroupsOfGroups {

    @Test(groups = { "windows.xp" })
    public void testMethod5() {
        System.err.println("(groups = { windows.xp })");
    }

    @Test(groups = { "windows.7" })
    public void testMethod6() {
        System.err.println("(groups = { windows.7 })");
    }

    @Test(groups = { "windows.8" })
    public void testMethod7() {
        System.err.println("(groups = { windows.8 })");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="framework_testng">
    <test verbose="2" name="TestGroupsOfGroups">
        <groups>
            <define name="windows.xp">
                <include name="windows.xp" />
            </define>
            <define name="windows.7">
                <include name="windows.7" />
            </define>
            <define name="all">
                <include name="windows.*" />
            </define>
            <run>
                <include name="all" />
                <exclude name="windows.7" />
            </run>
        </groups>
        <classes>
            <class name="com.kdzwy.practice.TestngGroupsOfGroups" />
        </classes>
    </test>
</suite>

 

运行结果

[TestNG] Running:
  D:\work_project1\TestNG\src\com\kdzwy\practice\testNG_2.xml

(groups = { windows.xp })
(groups = { windows.8 })
PASSED: testMethod5
PASSED: testMethod7

===============================================
    TestGroupsOfGroups
    Tests run: 2, Failures: 0, Skips: 0
===============================================


===============================================
framework_testng
Total tests run: 2, Failures: 0, Skips: 0
===============================================

 TestNG依赖测试

在TestNG的测试中,一个测试方法的执行往往需要依赖其他测试方法的先期或延后执行,这种测试方法的执行先后顺序就被称为测试方法之间的依赖关系。

1. 一个被依赖的测试方法

测试方法之间的依赖关系往往是在测试类中定义的,如下所示:

package com.kdzwy.practice;

import org.testng.annotations.Test;

public class TestDenpency {
    @Test
    public void serverStartedOk() {
        System.err.println("serverStartedOk()");
    }//被依赖的测试方法
     
    @Test(dependsOnMethods = { "serverStartedOk" })
    public void method1() {
        System.err.println("method1()");
    }

}

 

程序的运行结果为:

[TestNG] Running:
  C:\Users\Administrator\AppData\Local\Temp\testng-eclipse--1524391659\testng-customsuite.xml

serverStartedOk()
method1()
PASSED: serverStartedOk
PASSED: method1

 

2.多个被依赖的测试方法

 

一个测试方法可能依赖一个测试方法,也可能依赖多个测试方法。对于多个被依赖的测试方法,可以通过方法名直接给出,也可以通过组名给出被依赖的测试方法。

1) 在测试类中通过方法名给出被依赖的测试方法,示例如下:

package com.kdzwy.practice;

import org.testng.annotations.Test;

public class TestDenpency {
    @Test
    public void serverStartedOk() {
        System.err.println("serverStartedOk()");
    }//被依赖的测试方法
     
    @Test
    public void serverStartedOk2() {
        System.err.println("serverStartedOk2()");
    }//被依赖的测试方法
     
    
    @Test(dependsOnMethods = { "serverStartedOk","serverStartedOk2" })
    public void method1() {
        System.err.println("method1()");
    }

}

 

运行的结果为

[TestNG] Running:
  C:\Users\Administrator\AppData\Local\Temp\testng-eclipse--1841688552\testng-customsuite.xml

serverStartedOk()
serverStartedOk2()
method1()
PASSED: serverStartedOk
PASSED: serverStartedOk2
PASSED: method1

 

2) 在测试类中通过组名给出被依赖的测试方法,示例如下:

package com.kdzwy.practice;

import org.testng.annotations.Test;

public class TestDenpency {
    @Test(groups={"init"})
    public void serverStartedOk() {
        System.err.println("serverStartedOk()");
    }//被依赖的测试方法
     
    @Test(groups={"init"})
    public void serverStartedOk2() {
        System.err.println("serverStartedOk2()");
    }//被依赖的测试方法
     
    
    @Test(dependsOnGroups={"init"})
    public void method1() {
        System.err.println("method1()");
    }

}

 

运行的结果为:

[TestNG] Running:
C:\Users\Administrator\AppData\Local\Temp\testng-eclipse-797151435\testng-customsuite.xml

serverStartedOk()
serverStartedOk2()
method1()

3) 在testng.xml配置文件中通过组名给出被依赖的测试方法,示例如下:

<test name="My Test">  
  <groups>  
    <dependencies>  
      <group name="c" depends-on="a  b" />  
      <group name="d" depends-on="c" />  
    </dependencies>  
  </groups>  
</test>  

 

3.硬依赖(hard dependencies)与软依赖(soft dependencies)
顺利的情况下,被依赖的测试方法成功执行后,再执行当前测试方法。但是问题是被依赖的测试方法如果执行失败了呢?是否还要继续执行当前测试方法呢?

根据被依赖的测试方法执行失败时,是否执行当前测试方法,将依赖分为硬依赖和软依赖。对于硬依赖,被依赖的测试方法执行失败,则当前测试方法不执行,只是被标记为SKIP。对于软依赖,被依赖的测试方法执行失败,则当前测试方法继续执行。

不特别声明,默认是硬依赖,如上述示例都是硬依赖。

对于软依赖,在测试类中声明测试方法时,需要为@Test设置alwaysRun=true属性,示例如下:

TestNG参数化测试

package com.kdzwy.practice;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class ParameterizedTest1 {
    @Test
    @Parameters("myName")
    public void parameterTest(String myName) {
        System.out.println("Parameterized value is : " + myName);
    }
}

 

在xml配置文件中传递参数

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
    <test name="test1">
    <parameter name="myName" value="manisha"/> 
    <classes>
        <class name="com.kdzwy.practice.ParameterizedTest1" />
        </classes>
    </test>
</suite>

 

程序运行的结果是

[TestNG] Running:
D:\work_project1\TestNG\src\com\kdzwy\practice\testNG_3.xml

Parameterized value is : manisha

TestNG 对testng.xml 的参数的类型指定的值会自动尝试转换。下面是支持的类型:

  • String

  • int/Integer

  • boolean/Boolean

  • byte/Byte

  • char/Character

  • double/Double

  • float/Float

  • long/Long

  • short/Short

传递参数与数据提供者

质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

package com.kdzwy.practice;
public class PrimeNumberChecker {
    public Boolean validate(final Integer primeNumber) {
        for (int i = 2; i < (primeNumber / 2); i++) {
            if (primeNumber % i == 0) {
                return false;
             }
        }
        return true;
    }
}

 

创建测试案例类

  • 创建一个Java测试类 ParamTestWithDataProvider1.java.

  • 定义方法primeNumbers(),其定义为DataProvider 使用注释。此方法返回的对象数组的数组。

  • 测试方法testPrimeNumberChecker()添加到测试类中。此方法需要一个整数和布尔值作为输入参数。这个方法验证,如果传递的参数是一个素数。

  • 添加注释 @Test(dataProvider = "test1") 到此方法。dataProvider的属性被映射到"test1".

package com.kdzwy.practice;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParamTestWithDataProvider1 {
    private PrimeNumberChecker primeNumberChecker;

    @BeforeMethod
    public void initialize() {
        primeNumberChecker = new PrimeNumberChecker();
    }

    @DataProvider(name = "test1")
    public static Object[][] primeNumbers() {
        return new Object[][] { { 2, true }, { 6, false }, { 19, true },
            { 22, false }, { 23, true } };
    }

    // This test will run 4 times since we have 5 parameters defined
    @Test(dataProvider = "test1")
    public void testPrimeNumberChecker(Integer inputNumber,
        Boolean expectedResult) {
    System.out.println(inputNumber + " " + expectedResult);
    Assert.assertEquals(expectedResult,
            primeNumberChecker.validate(inputNumber));
    }
}

 

程序的运行结果为:

[TestNG] Running:
  C:\Users\Administrator\AppData\Local\Temp\testng-eclipse-1286085733\testng-customsuite.xml

2 true
6 false
19 true
22 false
23 true
PASSED: testPrimeNumberChecker(2, true)
PASSED: testPrimeNumberChecker(6, false)
PASSED: testPrimeNumberChecker(19, true)
PASSED: testPrimeNumberChecker(22, false)
PASSED: testPrimeNumberChecker(23, true)

 

实例 2

在这里,@DataProvider 传递对象作为参数。

创建Java类

创建一个Java类 Bean.java, 对象带有 get/set 方法, 在 C:\ > TestNG_WORKSPACE.

public class Bean {
    private String val;
    private int i;
    public Bean(String val, int i){
        this.val=val;
        this.i=i;
    }
    public String getVal() {
    return val;
    }
    public void setVal(String val) {
    this.val = val;
    }
    public int getI() {
    return i;
    }
    public void setI(int i) {
    this.i = i;
    }
}

 

创建测试案例类

  • 创建一个Java测试类 ParamTestWithDataProvider2.java.

  • 定义方法primeNumbers(),其定义为DataProvider使用注释。此方法返回的对象数组的数组。

  • 添加测试类中测试方法TestMethod()。此方法需要对象的bean作为参数。

  • 添加注释 @Test(dataProvider = "test1") 到此方法.  dataProvider 属性被映射到 "test1".

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParamTestWithDataProvider2 {
    @DataProvider(name = "test1")
    public static Object[][] primeNumbers() {
        return new Object[][] { { new Bean("hi I am the bean", 111) } };
    }

    @Test(dataProvider = "test1")
    public void testMethod(Bean myBean) {
        System.out.println(myBean.getVal() + " " + myBean.getI());
    }
}

 

hi I am the bean 111

===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================

TestNG运行JUnit测试

创建JUnit测试用例类

创建一个Java类,这是一个JUnit测试类, TestJunit.java

package com.kdzwy.practice;
import org.junit.Test;

import static org.testng.AssertJUnit.assertEquals;


public class TestJunit {
    @Test
    public void testAdd() {
        System.out.println("testAdd ");
        String str= "Junit testing using TestNG";
        assertEquals("Junit testing using TestNG",str);
    }
}

 

要执行JUnit测试用例定义属性 junit="true" 如上面的xml文件中. JUnit测试用例类TestJunit定义在类名。

JUnit 4中,TestNG将使用 org.junit.runner.JUnitCore 运行测试。

在这里,我已经放在了 junit-4.11.jar 在 C:\TestNG_WORKSPACE\lib\junit-4.11.jar下面.

验证输出。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Converted JUnit suite" >
    <test name="JUnitTests" junit="true">
        <classes>
            <class name="com.kdzwy.practice.TestJunit" />
        </classes>
    </test>
</suite>

 

程序运行的结果是:

[TestNG] Running:
D:\work_project1\TestNG\src\com\kdzwy\practice\testNG_4.xml

testAdd

 

posted on 2018-06-25 14:14  luzhouxiaoshuai  阅读(182)  评论(0编辑  收藏  举报

导航