package testng;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
@Retention(RUNTIME) //希望该annotation存在于类文件中,可以利用反射来查询他的属性值
@Target({METHOD, TYPE, CONSTRUCTOR}) //该annotation可以用于:普通方法,类,构造方法
public @interface ScheduledTest {
/**
* 属性 - 如果指定了activeAfter,就取出他的值,并转换为Date对象,
* 然后与当前日期进行比较,如果当前日期在activeAfter之后,就返回true
* @return
*/
String activeAfter() default "";
}
package testng;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.testng.IMethodSelector;
import org.testng.IMethodSelectorContext;
import org.testng.ITestNGMethod;
public class ScheduledTestSelector implements IMethodSelector {
private Date parse(String dateString) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date d = null;
try {
d = formatter.parse(dateString);
} catch (ParseException e) {
System.err.println(dateString + " is not correct!");
throw new RuntimeException();
}
return d;
}
@SuppressWarnings("deprecation")
@Override
public boolean includeMethod(IMethodSelectorContext context, ITestNGMethod m, boolean isTestMethod) {
Method method = m.getMethod();
Annotation a = method.getAnnotation(ScheduledTest.class);
if(a != null) {
Date now = Calendar.getInstance().getTime();
ScheduledTest st = (ScheduledTest) a;
Date activeAfter = null;
String activeAfterString = st.activeAfter();
if(activeAfterString != null && !"".equals(activeAfterString)) {
activeAfter = parse(activeAfterString);
if(now.before(activeAfter)) {
return false;
}
}
}
return true;
}
@Override
public void setTestMethods(List<ITestNGMethod> testMethods) {
//do something
}
}
package testng;
import org.testng.annotations.Test;
public class ScheduledTest_Test {
@Test
@ScheduledTest
public void test1() {
System.out.println("test1");
}
@Test
@ScheduledTest(activeAfter = "2010-05-24 18:23")
public void test2() {
System.out.println("test2");
}
@Test
@ScheduledTest(activeAfter = "2014-05-24 18:23")
public void test3() {
System.out.println("test3");
}
@Test(expectedExceptions = RuntimeException.class)
@ScheduledTest(activeAfter = "2014")
public void test4() {
System.out.println("test4");
}
}