测试方法用 @Test 进行注释,将类或方法标记为测试的一部分。
@Test()
public void aFastTest() {
System.out.println("Fast test");
}
import org.testng.annotations.Test;
public class TestExample {
@Test(description = "测试用例1")
public void testCase1(){
System.out.println("Test Case 1");
}
@Test(priority = 2)
public void testCase2(){
System.out.println("Test Case 2");
}
@Test(priority = 1)
public void testCase3(){
System.out.println("Test Case 3");
}
@Test
public void testCase4(){
System.out.println("Test Case 4");
throw new RuntimeException("Test Case 4 Failed");
}
@Test(groups = {"myGroup"})
public void testCase5(){
System.out.println("Test Case 5");
throw new RuntimeException("Test Case 5 Failed");
}
@Test(enabled = false)
public void testCase6(){
System.out.println("Test Case 6");
}
@Test(dependsOnMethods = {"testCase4"},dependsOnGroups = {"myGroup"}, alwaysRun = true)
public void testCase7(){
System.out.println("Test Case 7");
}
}
①description代表测试用例描述,控制台会打印输出该描述。
②priority代表优先级,数字越小,优先级越高,默认值为0。testCase2的priority值为2,会最后一个执行;testCase3的priority值为1,会倒数第二个执行。如果级别一样,则执行顺序默认按方法名排序。
③enabled的默认值为true,代表不启用。当enabled的值为false时,表示禁用,因此testCase6并未执行。
④testCase4和testCase5都抛出了运行时异常,因此执行失败。
⑤dependsOnMethods代表依赖一个或多个方法,dependsOnGroups代表依赖一个或多个分组。一旦被依赖的测试用例执行失败,则TestNG将跳过该测试用例。
但没有跳过testCase7,原因是testCase7加了alwaysRun方法,并将值设为true,代表始终执行,在默认情况下,该值为false。建议尽量不要使用dependsOnMethods和dependsOnGroups,因为违背了测试用例需要解耦的原则。
@Test的属性expectedExceptions
在TestNG中,@Test
注解的expectedExceptions
属性用于指定测试方法预期抛出的异常类型。如果测试方法执行时抛出了与expectedExceptions
属性指定的异常类型相同的异常,那么测试会被认为是成功的;如果抛出了其他类型的异常或者没有抛出任何异常,那么测试会失败。
使用expectedExceptions
属性的基本语法如下:
@Test(expectedExceptions = ExceptionClass.class)
public void testMethod() {
// 测试逻辑,预期会抛出 ExceptionClass 类型的异常
}
其中,ExceptionClass.class
应该替换为你预期测试方法会抛出的异常的具体类型。
以下是一个简单的例子:
import org.testng.annotations.Test;
public class MyTestClass {
@Test(expectedExceptions = NullPointerException.class)
public void testThrowException() {
String str = null;
int length = str.length(); // 这行会抛出 NullPointerException
}
@Test
public void testNoExceptionThrown() {
String str = "hello";
int length = str.length(); // 这行不会抛出异常
}
}
在上面的例子中,testThrowException
方法预期会抛出一个NullPointerException
,因为尝试获取一个null字符串的长度。如果这个方法真的抛出了NullPointerException
,那么测试就会通过。相反,testNoExceptionThrown
方法不会抛出任何异常,所以它不需要(也不应该)使用expectedExceptions
属性。
请注意,expectedExceptions
属性只能指定一个预期的异常类型。如果你预期测试方法可能会抛出多种类型的异常,那么你需要使用更复杂的异常处理逻辑,而不是依赖expectedExceptions
属性。
此外,TestNG还提供了expectedExceptionsMessage
属性,用于检查抛出的异常是否具有特定的消息。这两个属性可以组合使用,以便更精确地控制测试的预期行为。
@Test(expectedExceptions = NullPointerException.class, expectedExceptionsMessage = "Cannot invoke \"String.length()\" because \"str\" is null")
public void testThrowExceptionWithMessage() {
String str = null;
int length = str.length(); // 这行会抛出带有特定消息的 NullPointerException
}
在这个例子中,测试不仅预期会抛出NullPointerException
,还预期异常消息中包含特定的文本。
@Test的属性invocationCount
在TestNG中,@Test
注解的invocationCount
属性用于指定测试方法的调用次数。这允许你重复执行相同的测试方法多次,以确保测试的可靠性和稳定性。
invocationCount
属性的值是一个整数,表示测试方法应该被调用的次数。每次调用都会作为单独的测试实例来执行,并且测试结果会分别记录。
下面是一个使用invocationCount
属性的示例:
import org.testng.annotations.Test;
public class invocationCountTest {
@Test(invocationCount = 5,invocationTimeOut = 1000)
public void testMethod() {
// 测试逻辑
// 这个方法会被调用5次
System.out.println("testMethod");
}
}
在上面的例子中,testMethod
方法会被调用5次。每次调用都是独立的,并且测试结果会分别记录。如果其中任何一次调用失败,那么整个测试会被认为是失败的。
使用invocationCount
属性可以帮助你发现那些可能在某些情况下通过,但在其他情况下失败的间歇性问题。通过重复执行测试,你可以增加捕捉到这些问题的机会。
需要注意的是,使用invocationCount
属性会增加测试的执行时间,因为测试方法会被多次调用。因此,你应该谨慎使用这个属性,避免不必要的重复执行。
invocationTimeOut为超时时间。
invocationTimeOut属性用于设置测试方法每次调用的超时时间。这个属性指定了一个最大的毫秒数,用于限制测试方法单次调用的执行时间。如果测试方法在一次调用中的执行时间超过了这个设定的超时时间,那么TestNG会抛出异常,并标记该次调用为失败。
此外,invocationCount
属性通常与其他TestNG属性(如dependsOnMethods
、priority
等)结合使用,以实现更复杂的测试执行策略。通过合理地组合这些属性,你可以构建出灵活且强大的测试套件。
@Test timeout属性
在TestNG中,@Test
注解的timeout
属性用于设置测试方法的超时时间。这个属性指定了一个最大的毫秒数,用于限制测试方法的执行时间。如果测试方法的执行时间超过了这个设定的超时时间,TestNG会抛出异常,并标记该测试方法为失败。
timeout
属性的使用对于确保测试方法不会无限期地运行或者在执行过程中卡住是非常有用的。它可以帮助你识别那些可能由于各种原因(如外部资源不可用、无限循环等)导致执行时间过长的测试方法。
下面是一个使用timeout
属性的示例:
import org.testng.annotations.Test;
public class MyTestClass {
@Test(timeout = 3000) // 设置超时时间为3000毫秒(即3秒)
public void testMethod() {
// 测试逻辑
// 如果这个方法执行时间超过3秒,TestNG会抛出异常并标记测试为失败
}
}
在上面的例子中,testMethod
方法的执行时间被限制为3秒。如果这个方法在3秒内没有完成执行,TestNG会中断测试并标记它为失败。
需要注意的是,timeout
属性是设置单个测试方法的超时时间,而不是整个测试套件或测试类的超时时间。如果你需要为整个测试套件或测试类设置超时时间,你可能需要编写自定义的逻辑或使用其他测试框架提供的功能。
此外,timeout
属性的值应该根据测试方法的实际执行时间来合理设置。如果设置得太短,可能会导致一些正常但需要较长时间的测试方法被误判为失败。如果设置得太长,则可能无法有效地检测出那些执行时间过长的测试方法。因此,在设置timeout
属性时,你需要根据测试方法的实际需求和预期执行时间来做出权衡。
class级别的注解
@Test不仅可以注解在测试方法上,还可以注解在类上。
@Test
public class Test1 {
public void test1() {
}
public void test2() {
}
}
类级别的@Test注解使这个类的所有公开方法称为测试方法,即使测试方法没有用@Test注解。如果想添加具体的属性,仍然可以使用@Test来注注解测试方法。
@Test
public class Test1 {
public void test1() {
}
@Test(groups = "g1")
public void test2() {
}
}