美文网首页
java_day01_api_testng_02

java_day01_api_testng_02

作者: testerPM | 来源:发表于2019-12-04 18:57 被阅读0次

    Testng注解介绍:
    配置注解的作用:用于完成测试前的准备工作【用在方法上面】
    @BeforeSuite /@AfterSuite 标记的方法:在某个测试套件(suite)开始之前运行/在某个测试套件所有测试方法执行之后运行
    @BeforeTest/@AfterTest标记的方法:在某个测试(test)开始之前运行/在某个测试下的所有测试类中的测试方法执行之后运行
    @BeforeClass/@AfterClass标记的方法:在某个测试类(class)开始之前运行/在某个测试类中的所有测试方法执行之后运行
    @BeforeMethod/@AfterMethod标记的方法:在某个测试方法(method)之前运行/在某个测试方法执行之后运行

    代码演示注解使用:
    1 注解作用再方法上面:不能空着写,否则其实就是作用在同一个方法上

    package com.lemon.testng;
    
    import org.testng.annotations.Test;
    import org.testng.annotations.BeforeSuite;
    
    public class TestngDemo {
        
       @BeforeSuite
        
        
       //这里空白
       
        
        @Test
        public void test() {
            System.out.println("这是一个测试方法");
        }
        
        
        
    }
    

    比如上面代码, @BeforeSuite和@Test其实都是作用在test方法上的
    2 同一个方法上可以有多个注解

    package com.lemon.testng;
    
    import org.testng.annotations.Test;
    import org.testng.annotations.AfterSuite;
    import org.testng.annotations.BeforeSuite;
    
    public class TestngDemo {
            @Test
        @BeforeSuite
        @AfterSuite
        public void test() {
            System.out.println("这是一个测试方法");
        }
        
        
        
    }
    

    3 @BeforeSuite注解:用的最多 -----方法执行之前执行
    与之对应的就是:@AfterSuite----方法执行之后执行

    package com.lemon.testng;
    
    import org.testng.annotations.Test;
    import org.testng.annotations.AfterSuite;
    import org.testng.annotations.BeforeSuite;
    
    public class TestngDemo {
    
        @BeforeSuite
        public void init() {
            //做初始化的工作
            //如:1 文件的加载,统一的加载execl  2.解析properties文件
            System.out.println("方法执行之前我要做一些初始化");
        }
    
        @Test
        public void test() {
            System.out.println("这是一个测试方法");
        }
        
        
        @AfterSuite
        public void finish() {
            //资源释放
            //如:统一回写excel
            System.out.println("方法执行结束我要释放资源了");
        }
        
    }
    

    4 @BeforeTest/AfterTest

    package com.lemon.testng;
    import org.testng.annotations.Test;
    import org.testng.annotations.AfterSuite;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeSuite;
    import org.testng.annotations.BeforeTest;
    
    public class TestngDemo {
    
        @BeforeSuite
        public void init() {
            //做初始化的工作
            //如:1 文件的加载,统一的加载execl  2.解析properties文件
            System.out.println("方法执行之前我要做一些初始化");
        }
        @BeforeTest
        public void btest() {
         System.out.println("方法执行之前我要对模块初始化");
        }
        
        
        @Test
        public void test() {
            System.out.println("这是一个测试方法");
        }
        
        @AfterTest
        public void atest() {
            System.out.println("方法执行结束了--模块执行结束");
            
        }
        @AfterSuite
        public void finish() {
            //资源释放
            //如:统一回写excel
            System.out.println("方法执行结束我要释放资源了");
        }
        
    }
    

    5 @BeforeClass/AfterClass

    package com.lemon.testng;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeClass;
    import org.testng.annotations.Test;
    import org.testng.annotations.AfterSuite;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeSuite;
    import org.testng.annotations.BeforeTest;
    
    public class TestngDemo {
    
        @BeforeSuite
        public void init() {
            //做初始化的工作
            //如:1 文件的加载,统一的加载execl  2.解析properties文件
            System.out.println("方法执行之前我要做一些初始化");
        }
        @BeforeTest
        public void btest() {
         System.out.println("方法执行之前我要对模块初始化");
        }
        
        @BeforeClass
        public void ctest() {
            System.out.println("类初始化");
        }
        
        @Test
        public void test() {
            System.out.println("这是一个测试方法");
        }
        
        @AfterClass
        public void actest() {
            System.out.println("类执行完毕");
        }
        @AfterTest
        public void atest() {
            System.out.println("方法执行结束了--模块执行结束");
            
        }
        @AfterSuite
        public void finish() {
            //资源释放
            //如:统一回写excel
            System.out.println("方法执行结束我要释放资源了");
        }
        
    }
    

    6 @BeforeMethod/@AfterMethod---作用在有注解的方法上,没有注解的方法是不行的
    如果有多个注解方法,那么@BeforeMethod/@AfterMethod会被执行多次

    package com.lemon.testng;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeClass;
    import org.testng.annotations.Test;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.AfterSuite;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.BeforeSuite;
    import org.testng.annotations.BeforeTest;
    
    public class TestngDemo {
    
        @BeforeSuite
        public void init() {
            // 做初始化的工作
            // 如:1 文件的加载,统一的加载execl 2.解析properties文件
            System.out.println("方法执行之前我要做一些初始化");
        }
    
        @BeforeTest
        public void btest() {
            System.out.println("方法执行之前我要对模块初始化");
        }
    
        @BeforeClass
        public void ctest() {
            System.out.println("类初始化");
        }
    
        @BeforeMethod
        public void mtest() {
            System.out.println("方法初始化");
        }
    
        @Test
        public void test() {
            System.out.println("这是一个测试方法");
        }
    
        @AfterMethod
        public void amtest() {
            System.out.println("方法执行完毕");
        }
    
        @AfterClass
        public void actest() {
            System.out.println("类执行完毕");
        }
    
        @AfterTest
        public void atest() {
            System.out.println("方法执行结束了--模块执行结束");
    
        }
    
        @AfterSuite
        public void finish() {
            // 资源释放
            // 如:统一回写excel
            System.out.println("方法执行结束我要释放资源了");
        }
    
    }
    

    上述代码执行:

    [RemoteTestNG] detected TestNG version 6.9.9
    [TestNG] Running:
      C:\Users\TF\AppData\Local\Temp\testng-eclipse--1600931492\testng-customsuite.xml
    
    方法执行之前我要做一些初始化
    方法执行之前我要对模块初始化
    类初始化
    方法初始化
    这是一个测试方法
    方法执行完毕
    类执行完毕
    方法执行结束了--模块执行结束
    PASSED: test
    
    ===============================================
        Default test
        Tests run: 1, Failures: 0, Skips: 0
    ===============================================
    
    方法执行结束我要释放资源了
    
    ===============================================
    Default suite
    Total tests run: 1, Failures: 0, Skips: 0
    ===============================================
    
    [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@e580929: 405 ms
    [TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@5e025e70: 4834 ms
    [TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 1 ms
    [TestNG] Time taken by org.testng.reporters.EmailableReporter2@2d209079: 202 ms
    [TestNG] Time taken by org.testng.reporters.jq.Main@66d33a: 2028 ms
    [TestNG] Time taken by org.testng.reporters.XMLReporter@3cb5cdba: 205 ms
    

    注意:导包不要导错了
    如:import org.junit.BeforeClass;这个是不对的
    import org.testng.annotations.BeforeClass;这个才是对的
    必须是org.testng.annotations这个包下面的,如果导的是org.junit,Run as->会有Junit Test
    7 依赖测试:-----基本不这么用
    dependsOnMethods:测试方法依赖于某方法
    被依赖的方法必须加注解,否则不被testNG框架识别

    package com.lemon.testng;
    import org.testng.annotations.Test;
    public class TestngDependency {
        
        @Test
        public void test() {
            System.out.println("我要先执行,否则dependencyTest不能被执行");
        }
        @Test(dependsOnMethods="test")
        public void dependencyTest() {
            System.out.println("test被执行ok,我才能执行");
        }
        
        
    }
    

    8 忽略测试:------用的比较少
    当我们在测试的过程中,因为某些方面的原因,比如测试方法没有写完,或者有问题,我们暂时希望它不执行,我们就可以添加忽略设置跳过方法的执行
    @Test(enabled=false)

    package com.lemon.testng;
    import org.testng.annotations.Test;
    public class TestngDependency {
        
        @Test
        public void test() {
            System.out.println("我要先执行,否则dependencyTest不能被执行");
        }
        @Test(dependsOnMethods="test")
        public void dependencyTest() {
            System.out.println("test被执行ok,我才能执行");
        }
        
        
    }
    
    

    执行上述代码: aaa()方法没有被执行
    事实上只要不加注解,该方法也是不被执行的【所以 @Test(enabled=false)这个注解用的比较少】

    9 .参数化测试(数据驱动测试):------用的多,比较重要
    TestNG可以通过两种方式向测试方法传递参数:
    1.利用test.xml定义parameter
    2.利用DataProviders
    1)test.xml定义parameter
    局限性:通过parameters注入的参数必须定义在testng.xml中且值是固定的

    testngParameters.java文件:

    package com.lemon.testng;
    import org.testng.annotations.Parameters;
    import org.testng.annotations.Test;
    
    public class testngParameters {
    
        @Test
        //value={};注解接收参数的格式
        @Parameters(value= {"type","version"})
        public void test( String type ,String version) {
            System.out.println(type);
            System.out.println(version);
            
            
        }
        
        
    }
    

    testng.xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <suite name="项目名" parallel="false">
     <test name="功能模块">
       <classes>
         <class  name="com.lemon.testng.TestNgDemo"/>
         <class  name="com.lemon.testng.testngParameters"/>
        </classes>
    </test>
      <!-- <test name="功能模块2">
       <classes>
         <class  name="com.lemon.testng.TestNgDemo2"/>
        </classes>
     </test>-->
     <!-- 参数化 -->
     <parameter   name="type"  value="ie"></parameter>
     <parameter  name="version" value="3"></parameter>
    </suite>
    
    

    执行testngParameters.java不能右键Run as ->TestNG suit ,会执行失败【Parameter 'type' is required by @Test on method test but has not been marked @Optional or defined】,只能通过执行testng.xml运行testngParameters.java

    2 )利用DataProviders
    1. @Test(dataProvider="d")和 @DataProvider(name="d") 要保持一致
    一般都会取比较有意义的名字,或者和方法名一致,如这里是datas(),但是为了更好理解两个方法之间是怎么关联的,我这里取为d,和方法名区分开了
    2. 此注解的方法返回值必须是:Object[][]或者Iterator<Object[]>
    3.参数个数,类型必须匹配
    4 参数可接收集合,自定义类型

    TestngDataProvider.java文件:

    package com.lemon.testng;
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;
    
    public class TestngDataProvider {
        @Test(dataProvider="d")
        public void login(String  username ,String pwd) {
            System.out.println("测试登录接口");
            System.out.println( "打印登录信息"+username+"  "+pwd);
        }
        @DataProvider(name="d")
        public Object[][]  datas(){
            Object[][]  array= {{"13333333333","123456"},{"133333333332","234567"},{"13333333334","345678"}};
            Object[][] array2=new Object[3][2];//[接口执行3次][接口需要传2个参数]
             return array;
        }
    
        
    }
    
    

    上述代码执行结果:

    [RemoteTestNG] detected TestNG version 6.9.9
    [TestNG] Running:
      C:\Users\TF\AppData\Local\Temp\testng-eclipse--1917703028\testng-customsuite.xml
    
    测试登录接口
    打印登录信息13333333333  123456
    测试登录接口
    打印登录信息133333333332  234567
    测试登录接口
    打印登录信息13333333334  345678
    PASSED: login("13333333333", "123456")
    PASSED: login("133333333332", "234567")
    PASSED: login("13333333334", "345678")
    
    ===============================================
        Default test
        Tests run: 3, Failures: 0, Skips: 0
    ===============================================
    
    
    ===============================================
    Default suite
    Total tests run: 3, Failures: 0, Skips: 0
    ===============================================
    
    [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@e580929: 405 ms
    [TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@5e025e70: 4831 ms
    [TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms
    [TestNG] Time taken by org.testng.reporters.EmailableReporter2@2d209079: 204 ms
    [TestNG] Time taken by org.testng.reporters.jq.Main@66d33a: 2026 ms
    [TestNG] Time taken by org.testng.reporters.XMLReporter@3cb5cdba: 203 ms
    

    10 ITestContext----测试上下文,缓存,数据存储会用到------了解知识

    说明: 参数化和数据支持不能同时使用

    package com.lemon.testng;
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Parameters;
    import org.testng.annotations.Test;
    
    public class TestngDataProvider {
        @Test(dataProvider="d")
        @Parameters(value= {"type","version"})
        public void login(String  username ,String pwd ,String type,String version) {
            System.out.println("测试登录接口");
            System.out.println( "打印登录信息"+username+"  "+pwd);
        }
        @DataProvider(name="d")
        public Object[][]  datas(){
            Object[][]  array= {{"13333333333","123456"},{"133333333332","234567"},{"13333333334","345678"}};
            Object[][] array2=new Object[3][2];//[接口执行3次][接口需要传2个参数]
             return array;
        }
    
        
    }
    

    上面代码虽然没有出现编译错误,但是运行时会报错:

    [RemoteTestNG] detected TestNG version 6.9.9
    [TestNG] Running:
      C:\Users\TF\AppData\Local\Temp\testng-eclipse-411092288\testng-customsuite.xml
    
    FAILED: login
    org.testng.TestNGException: 
    The data provider is trying to pass 2 parameters but the method com.lemon.testng.TestngDataProvider#login takes 4 and TestNG is unable in inject a suitable object
        at org.testng.internal.Invoker.injectParameters(Invoker.java:1249)
        at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1118)
        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
        at org.testng.TestRunner.privateRun(TestRunner.java:774)
        at org.testng.TestRunner.run(TestRunner.java:624)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:359)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
        at org.testng.SuiteRunner.run(SuiteRunner.java:261)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
        at org.testng.TestNG.run(TestNG.java:1048)
        at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
        at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
        at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
    Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
        at org.testng.internal.Invoker.injectParameters(Invoker.java:1245)
        ... 17 more
    
    
    ===============================================
        Default test
        Tests run: 1, Failures: 1, Skips: 0
    ===============================================
    
    
    ===============================================
    Default suite
    Total tests run: 1, Failures: 1, Skips: 0
    ===============================================
    

    提示缺少2个参数,默认还是使用的时数据支持

    相关文章

      网友评论

          本文标题:java_day01_api_testng_02

          本文链接:https://www.haomeiwen.com/subject/hnylgctx.html