TestNg常用注解:enable、timeOut、exceptedException、groups、dependsOnGroups、dependsOnMeth

273 阅读5分钟

TestNg常用注解:enable、timeOut、exceptedException、groups、dependsOnGroups、dependsOnMethods、@Paramters、priority

@Test

忽略测试 enable

调整前

package com.newcrud.testngTest;
​
import org.testng.annotations.Test;
​
public class TestFour {
    @Test
    public void testB(){
        System.out.println("B");
    }
    @Test
    public void testA(){
        System.out.println("A");
    }
}

结果

A
B

调整后

package com.newcrud.testngTest;
​
import org.testng.annotations.Test;
​
public class TestFour {
    @Test(enabled = false)
    public void testB(){
        System.out.println("B");
    }
    @Test
    public void testA(){
        System.out.println("A");
    }
}

结果

A

超时测试 timeOut

package com.newcrud.testngTest;
​
import org.testng.annotations.Test;
​
public class TestFour {
    @Test(timeOut = 5000)
    public void testA() throws InterruptedException {
        Thread.sleep(4000);
        System.out.println("A");
    }
    @Test(timeOut = 5000)
    public void testB() throws InterruptedException {
        Thread.sleep(6000);
        System.out.println("B");
    }
}

结果,第一条执行通过,第二条执行失败

A
​
org.testng.internal.thread.ThreadTimeoutException: Method com.newcrud.testngTest.TestFour.testB() didn't finish within the time-out 5000

异常测试 exceptedException

我们先来写一个自己的Exception

package com.newcrud.learn;
​
public class MyException extends RuntimeException{
    public MyException(String s){
        super(s);
    }
}

测试类

package com.newcrud.testngTest;
​
import com.newcrud.learn.MyException;
import org.testng.annotations.Test;
​
import java.io.IOException;
​
public class TestFour {
    @Test(expectedExceptions = MyException.class)
    public void testA()  {
        System.out.println("A");
        throw new MyException("我的异常A");
    }
    @Test(expectedExceptions = RuntimeException.class)
    public void testB()  {
        System.out.println("B");
        throw new MyException("我的异常B,MyException继承了RuntimeException,属于RuntimeException");
    }
    @Test(expectedExceptions = IOException.class)
    public void testC()  {
        System.out.println("C");
        throw new MyException("我的异常C,RuntimeException和IOException都继承了Exception,所以MyException和IOException无从属关系");
    }
    @Test(expectedExceptions = ArrayIndexOutOfBoundsException.class)
    public void testD()  {
        System.out.println("D");
        throw new MyException("我的异常D,ArrayIndexOutOfBoundsException继承了IndexOutOfBoundsException,IndexOutOfBoundsException继承了RuntimeException,所以和MyException无从属关系");
    }
}

结果

A
B
C

com.newcrud.learn.MyException: 我的异常C,RuntimeException和IOException都继承了Exception,所以MyException和IOException无从属关系

	at com.newcrud.testngTest.TestFour.testC(TestFour.java:22)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104)
	at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)
	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851)
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
	at org.testng.TestRunner.privateRun(TestRunner.java:756)
	at org.testng.TestRunner.run(TestRunner.java:610)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:387)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
	at org.testng.SuiteRunner.run(SuiteRunner.java:289)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1218)
	at org.testng.TestNG.runSuites(TestNG.java:1133)
	at org.testng.TestNG.run(TestNG.java:1104)
	at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
	at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)

D

com.newcrud.learn.MyException: 我的异常D,ArrayIndexOutOfBoundsException继承了IndexOutOfBoundsException,IndexOutOfBoundsException继承了RuntimeException,所以和MyException无从属关系

	at com.newcrud.testngTest.TestFour.testD(TestFour.java:27)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104)
	at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)
	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851)
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
	at org.testng.TestRunner.privateRun(TestRunner.java:756)
	at org.testng.TestRunner.run(TestRunner.java:610)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:387)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
	at org.testng.SuiteRunner.run(SuiteRunner.java:289)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1218)
	at org.testng.TestNG.runSuites(TestNG.java:1133)
	at org.testng.TestNG.run(TestNG.java:1104)
	at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
	at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)

分组测试 groups

package com.newcrud.testngTest;

import org.testng.annotations.Test;

public class TestFour {
    @Test(groups = "ten")
    public void testF()  {
        System.out.println("F");
    }
    @Test(groups = "ten")
    public void testG()  {
        System.out.println("G");
    }
    @Test(groups = "eleven")
    public void testI()  {
        System.out.println("I");
    }
    @Test(groups = {"eleven","ten"})
    public void testK()  {
        System.out.println("K");
    }
}

groups真正的用途不在 定义,而在于依赖使用,下面的dependsOnGroups

依赖分组测试 dependsOnGroups

package com.newcrud.testngTest;
import org.testng.annotations.Test;

public class TestFour {
    @Test(dependsOnGroups = {"ten"})
    public void testA(){
        System.out.println("A");
    }

    @Test(dependsOnGroups = {"eleven"})
    public void testB(){
        System.out.println("B");
    }
    @Test(dependsOnGroups = {"eleven","ten"})
    public void testC(){
        System.out.println("C");
    }
    @Test(groups = "ten")
    public void testF()  {
        System.out.println("F");
    }
    @Test(groups = "ten")
    public void testG()  {
        System.out.println("G");
    }
    @Test(groups = "eleven")
    public void testI()  {
        System.out.println("I");
    }
    @Test(groups = {"eleven","ten"})
    public void testK()  {
        System.out.println("K");
    }
}

结果,可以看到并没有按照ABCD这样的顺序,而是因为在ABC由于有了dependsOnGroups的存在,导致了执行顺序反而在依赖的groups执行完之后才开始执行的

F
G
I
K
A
B
C

如果被依赖的groups未执行后者未全部执行或者执行失败或者全部失败会怎么样呢

被依赖的groups部分未执行

testC依赖了groups的ten,但是ten有两个方法,其中一个被enable=false不执行了

package com.newcrud.testngTest;
import org.testng.annotations.Test;

public class TestFour {

    @Test(dependsOnGroups = {"ten","eleven"})
    public void testC(){
        System.out.println("C");
    }
    @Test(groups = "ten",enabled = false)
    public void testF()  {
        System.out.println("F");
    }
    @Test(groups = "ten")
    public void testG()  {
        System.out.println("G");
    }
    @Test(groups = "eleven")
    public void testI()  {
        System.out.println("I");
    }
}

结果,正常执行,只有被enable=false的testF未执行,并不会影响testC的执行

G
I
C

被依赖的groups全部未执行

这次我们把groups为ten的全部忽略执行

package com.newcrud.testngTest;
import org.testng.annotations.Test;

public class TestFour {

    @Test(dependsOnGroups = {"ten","eleven"})
    public void testC(){
        System.out.println("C");
    }
    @Test(groups = "ten",enabled = false)
    public void testF()  {
        System.out.println("F");
    }
    @Test(groups = "ten",enabled = false)
    public void testG()  {
        System.out.println("G");
    }
    @Test(groups = "eleven")
    public void testI()  {
        System.out.println("I");
    }
}

结果,发现报错了,testI也没执行

org.testng.TestNGException: 
DependencyMap::Method "TestFour.testC()[pri:0, instance:com.newcrud.testngTest.TestFour@7c75222b]" depends on nonexistent group "ten"
	at org.testng.DependencyMap.getMethodsThatBelongTo(DependencyMap.java:43)
	at org.testng.TestRunner.createDynamicGraph(TestRunner.java:1054)
	at org.testng.TestRunner.privateRun(TestRunner.java:723)
	at org.testng.TestRunner.run(TestRunner.java:610)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:387)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
	at org.testng.SuiteRunner.run(SuiteRunner.java:289)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1218)
	at org.testng.TestNG.runSuites(TestNG.java:1133)
	at org.testng.TestNG.run(TestNG.java:1104)
	at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
	at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)

Test ignored.

被依赖的groups部分执行失败

package com.newcrud.testngTest;
import org.testng.annotations.Test;

public class TestFour {

    @Test(dependsOnGroups = {"ten","eleven"})
    public void testC(){
        System.out.println("C");
    }
    @Test(groups = "ten",timeOut = 5000)
    public void testF() throws InterruptedException {
        Thread.sleep(4000);
        System.out.println("F");
    }
    @Test(groups = "ten",timeOut = 5000)
    public void testG() throws InterruptedException {
        Thread.sleep(6000);
        System.out.println("G");
    }
    @Test(groups = "eleven")
    public void testI()  {
        System.out.println("I");
    }
}

结果,发现testC被忽略执行了。

F

org.testng.internal.thread.ThreadTimeoutException: Method com.newcrud.testngTest.TestFour.testG() didn't finish within the time-out 5000

	at java.lang.Throwable.toString(Throwable.java:481)
	at java.lang.Throwable.<init>(Throwable.java:312)
	at java.lang.Exception.<init>(Exception.java:102)
	at java.lang.RuntimeException.<init>(RuntimeException.java:96)
	at org.testng.internal.InvokeMethodRunnable$TestNGRuntimeException.<init>(InvokeMethodRunnable.java:80)
	at org.testng.internal.InvokeMethodRunnable.runOne(InvokeMethodRunnable.java:61)
	at org.testng.internal.InvokeMethodRunnable.run(InvokeMethodRunnable.java:44)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

I

Test ignored.

被依赖的groups全部执行失败

package com.newcrud.testngTest;
import org.testng.annotations.Test;

public class TestFour {

    @Test(dependsOnGroups = {"ten","eleven"})
    public void testC(){
        System.out.println("C");
    }
    @Test(groups = "ten",timeOut = 5000)
    public void testF() throws InterruptedException {
        Thread.sleep(6000);
        System.out.println("F");
    }
    @Test(groups = "ten",timeOut = 5000)
    public void testG() throws InterruptedException {
        Thread.sleep(6000);
        System.out.println("G");
    }
    @Test(groups = "eleven")
    public void testI()  {
        System.out.println("I");
    }
}

结果,和部分执行失败一样,也是对应的testC未执行

org.testng.internal.thread.ThreadTimeoutException: Method com.newcrud.testngTest.TestFour.testF() didn't finish within the time-out 5000

org.testng.internal.thread.ThreadTimeoutException: Method com.newcrud.testngTest.TestFour.testG() didn't finish within the time-out 5000

	at java.lang.Throwable.<init>(Throwable.java:265)
	at java.lang.Exception.<init>(Exception.java:66)
	at java.lang.InterruptedException.<init>(InterruptedException.java:67)
	at java.lang.Thread.sleep(Native Method)
	at com.newcrud.testngTest.TestFour.testG(TestFour.java:17)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104)
	at org.testng.internal.InvokeMethodRunnable.runOne(InvokeMethodRunnable.java:54)
	at org.testng.internal.InvokeMethodRunnable.run(InvokeMethodRunnable.java:44)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

I

Test ignored.

综上所述

被依赖的groups里的方法,只要不是全部忽略执行,并不影响依赖了改groups方法的执行。

但是

只要被忽略的groups里的方法,有一个执行失败了,依赖了该groups的方法就会被忽略执行

依赖方法测试 dependsOnMethods

和dependsOnGroups类似,只不过并不是依赖groups,而是依赖某一个具体的方法。

package com.newcrud.testngTest;
import org.testng.annotations.Test;

public class TestFour {
    @Test(dependsOnMethods = {"testC"})
    public void testA(){
        System.out.println("A");
    }

    @Test(dependsOnMethods = {"testC","testD"})
    public void testB(){
        System.out.println("B");
    }
    @Test
    public void testC(){
        System.out.println("C");
    }
    @Test
    public void testD(){
        System.out.println("D");
    }

}

执行结果,(优先级是高于dependsOnGroups的),这段代码就不演示了

C
D
A
B

那么,如果被依赖的方法失败了或者部分失败了或者未执行或者部分未执行怎么办

被依赖的方法部分未执行

package com.newcrud.testngTest;
import org.testng.annotations.Test;

public class TestFour {
    @Test(dependsOnMethods = {"testC"})
    public void testA(){
        System.out.println("A");
    }

    @Test(dependsOnMethods = {"testC","testD"})
    public void testB(){
        System.out.println("B");
    }
    @Test
    public void testC(){
        System.out.println("C");
    }
    @Test(enabled = false)
    public void testD(){
        System.out.println("D");
    }

}

结果:报错

org.testng.TestNGException: 
com.newcrud.testngTest.TestFour.testB() is depending on method public void com.newcrud.testngTest.TestFour.testD(), which is not annotated with @Test or not included.
	at org.testng.internal.MethodHelper.findDependedUponMethods(MethodHelper.java:109)
	at org.testng.internal.MethodHelper.topologicalSort(MethodHelper.java:208)
	at org.testng.internal.MethodHelper.sortMethods(MethodHelper.java:284)
	at org.testng.internal.MethodHelper.collectAndOrderMethods(MethodHelper.java:57)
	at org.testng.TestRunner.initMethods(TestRunner.java:474)
	at org.testng.TestRunner.init(TestRunner.java:252)
	at org.testng.TestRunner.init(TestRunner.java:222)
	at org.testng.TestRunner.<init>(TestRunner.java:163)
	at org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:585)
	at org.testng.SuiteRunner.init(SuiteRunner.java:189)
	at org.testng.SuiteRunner.<init>(SuiteRunner.java:136)
	at org.testng.TestNG.createSuiteRunner(TestNG.java:1375)
	at org.testng.TestNG.createSuiteRunners(TestNG.java:1355)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1209)
	at org.testng.TestNG.runSuites(TestNG.java:1133)
	at org.testng.TestNG.run(TestNG.java:1104)
	at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
	at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)

被依赖的方法全部未执行

package com.newcrud.testngTest;
import org.testng.annotations.Test;

public class TestFour {
    @Test(dependsOnMethods = {"testC"})
    public void testA(){
        System.out.println("A");
    }

    @Test
    public void testB(){
        System.out.println("B");
    }
    @Test(enabled = false)
    public void testC(){
        System.out.println("C");
    }
    @Test(enabled = false)
    public void testD(){
        System.out.println("D");
    }

}

结果

org.testng.TestNGException: 
com.newcrud.testngTest.TestFour.testA() is depending on method public void com.newcrud.testngTest.TestFour.testC(), which is not annotated with @Test or not included.
	at org.testng.internal.MethodHelper.findDependedUponMethods(MethodHelper.java:109)
	at org.testng.internal.MethodHelper.topologicalSort(MethodHelper.java:208)
	at org.testng.internal.MethodHelper.sortMethods(MethodHelper.java:284)
	at org.testng.internal.MethodHelper.collectAndOrderMethods(MethodHelper.java:57)
	at org.testng.TestRunner.initMethods(TestRunner.java:474)
	at org.testng.TestRunner.init(TestRunner.java:252)
	at org.testng.TestRunner.init(TestRunner.java:222)
	at org.testng.TestRunner.<init>(TestRunner.java:163)
	at org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:585)
	at org.testng.SuiteRunner.init(SuiteRunner.java:189)
	at org.testng.SuiteRunner.<init>(SuiteRunner.java:136)
	at org.testng.TestNG.createSuiteRunner(TestNG.java:1375)
	at org.testng.TestNG.createSuiteRunners(TestNG.java:1355)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1209)
	at org.testng.TestNG.runSuites(TestNG.java:1133)
	at org.testng.TestNG.run(TestNG.java:1104)
	at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
	at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)

被依赖的方法部分执行失败

package com.newcrud.testngTest;
import org.testng.annotations.Test;

public class TestFour {
    @Test(dependsOnMethods = {"testC"})
    public void testA(){
        System.out.println("A");
    }

    @Test(dependsOnMethods = {"testC","testD"})
    public void testB(){
        System.out.println("B");
    }
    @Test(timeOut = 5000)
    public void testC() throws InterruptedException {
        Thread.sleep(4000);
        System.out.println("C");
    }
    @Test(timeOut = 5000)
    public void testD() throws InterruptedException {
        Thread.sleep(6000);
        System.out.println("D");
    }

}

结果,testB被忽略执行了,原因是它依赖的D报错了

C

org.testng.internal.thread.ThreadTimeoutException: Method com.newcrud.testngTest.TestFour.testD() didn't finish within the time-out 5000

	at java.lang.Thread.interrupt(Thread.java:919)
	at org.testng.internal.InvokeMethodRunnable.runOne(InvokeMethodRunnable.java:64)
	at org.testng.internal.InvokeMethodRunnable.run(InvokeMethodRunnable.java:44)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

A

Test ignored.

被依赖的方法全部执行失败

package com.newcrud.testngTest;
import org.testng.annotations.Test;

public class TestFour {
    @Test
    public void testE(){
        System.out.println("E");
    }

    @Test(dependsOnMethods = {"testC","testD"})
    public void testB(){
        System.out.println("B");
    }
    @Test(timeOut = 5000)
    public void testC() throws InterruptedException {
        Thread.sleep(6000);
        System.out.println("C");
    }
    @Test(timeOut = 5000)
    public void testD() throws InterruptedException {
        Thread.sleep(6000);
        System.out.println("D");
    }

}

结果,testB被忽略执行了。

org.testng.internal.thread.ThreadTimeoutException: Method com.newcrud.testngTest.TestFour.testC() didn't finish within the time-out 5000

	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1157)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)


org.testng.internal.thread.ThreadTimeoutException: Method com.newcrud.testngTest.TestFour.testD() didn't finish within the time-out 5000

	at java.lang.Throwable.fillInStackTrace(Native Method)
	at java.lang.Throwable.fillInStackTrace(Throwable.java:784)
	at java.lang.Throwable.<init>(Throwable.java:266)
	at java.lang.Exception.<init>(Exception.java:66)
	at java.lang.InterruptedException.<init>(InterruptedException.java:67)
	at java.lang.Thread.sleep(Native Method)
	at com.newcrud.testngTest.TestFour.testD(TestFour.java:21)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104)
	at org.testng.internal.InvokeMethodRunnable.runOne(InvokeMethodRunnable.java:54)
	at org.testng.internal.InvokeMethodRunnable.run(InvokeMethodRunnable.java:44)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

E

Test ignored.

综上所述

被依赖的方法未执行,是会直接报错的,程序中断

但是

被依赖的方法报错,并不会中断程序,而是忽略执行了。

优先级 priority

调整前

执行顺序不等于书写的顺序,比如我先写的testB后写的testA,并不会先执行testB,而是按照字母的顺序来执行的,比如testB和testA,前面有相同的test,那就对比B和A的顺序,A在前,先执行testA

package com.newcrud.testngTest;

import org.testng.annotations.Test;

public class TestFour {
    @Test
    public void testB(){
        System.out.println("B");
    }
    @Test
    public void testA(){
        System.out.println("A");
    }
}

结果

A
B

调整后

数字越小,优先级越高

package com.newcrud.testngTest;

import org.testng.annotations.Test;

public class TestFour {
    @Test(priority = 1)
    public void testB(){
        System.out.println("B");
    }
    @Test(priority = 2)
    public void testA(){
        System.out.println("A");
    }
}

结果

B
A

参数化之 @Paramters

emmmm,其实个人感觉@Paramters并不如DataProvider好用,不过既然学习嘛,那我们就来看看@Paramters的使用方法吧

只有一个参数

第一步,在测试类上添加@Paramters

@Parameters注解里的内容不必和接口的参数名保持一致,它是按照顺序一一对应的

package com.newcrud.testngTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestFour {
    @Parameters({"name-A"})
    @Test
    public void testE(String name){
        System.out.println(name);
    }
}

第二步,在xml文件上为参数赋值

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
    <parameter name="name-A" value="zhangsan"></parameter>
    <test  name="testonly">
        <classes>
            <class name="com.newcrud.testngTest.TestFour"></class>
        </classes>
    </test>
</suite>

结果

执行xml文件

已经提取到了我们在xml配置的文件

zhangsan

有两个参数

第一步,在测试类上添加@Paramters

package com.newcrud.testngTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestFour {
    @Parameters({"name-A","id-A"})
    @Test
    public void testE(String name,Integer id){
        System.out.println(name);
        System.out.println(id);
    }
}

第二步,在xml文件上为参数赋值

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
    <parameter name="name-A" value="zhangsan"></parameter>
    <parameter name="id-A" value="99"></parameter>
    <test  name="testonly">
        <classes>
            <class name="com.newcrud.testngTest.TestFour"></class>
        </classes>
    </test>
</suite>

结果

执行xml文件

zhangsan
99

使用默认值

那如果说我担心忘记在xml上面配置parameter了,想要在测试类上加一个默认值怎么办

 package com.newcrud.testngTest;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestFour {
    @Parameters({"name-A","id-A"})
    @Test
    public void testE(@Optional("wing") String name, @Optional("77") Integer id){
        System.out.println(name);
        System.out.println(id);
    }
}

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
    <test  name="testonly">
        <classes>
            <class name="com.newcrud.testngTest.TestFour"></class>
        </classes>
    </test>
</suite>

结果

wing
77

发现,emmm,@Optional里必须得是String,所以int类型的参数,你在里面传成了"77",也是可以正常识别的。