java_day01_api_testng_02

2019-12-04  本文已影响0人  testerPM

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个参数,默认还是使用的时数据支持

上一篇 下一篇

猜你喜欢

热点阅读