zoukankan      html  css  js  c++  java
  • 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_project1TestNGsrc	estNG.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_project1TestNGsrccomkdzwypractice	estNG.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_project1TestNGsrccomkdzwypractice estNG.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_project1TestNGsrccomkdzwypractice	estNG_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:UsersAdministratorAppDataLocalTemp	estng-eclipse--1524391659	estng-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:UsersAdministratorAppDataLocalTemp	estng-eclipse--1841688552	estng-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:UsersAdministratorAppDataLocalTemp estng-eclipse-797151435 estng-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_project1TestNGsrccomkdzwypractice estNG_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:UsersAdministratorAppDataLocalTemp	estng-eclipse-1286085733	estng-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_WORKSPACElibjunit-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_project1TestNGsrccomkdzwypractice estNG_4.xml

    testAdd

  • 相关阅读:
    MongoDb学习(五)--Gridfs--上传下载
    MongoDb学习(四)--Repository----语法关键字
    MongoDb学习(四)--Repository
    MongoDB插入数据,除去Class key
    MongoDb学习三(spring-data-mongodb)
    MongoDb二
    java连接mongodb数据库
    MongoDb笔记
    java字符统计+字符串压缩
    安卓蓝牙操作+蓝牙工具类
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/9224080.html
Copyright © 2011-2022 走看看