由於我們希望所有人都同意這是一般不好的做法,所以也有例外。 爲了說明顯而易見的問題,我們不是談論單元測試,而是集成測試(JUnit可能不是正確的工具,但我沒有找到更好的東西)
我也在做Selenium測試。我對第三方測試服務器進行集成測試,如果我在沒有sleep的情況下運行測試,那麼行爲是隨機的。
這是可能的解決方案之一,請注意,這只是通過運行測試一次:
public class SleepySuite extends Suite {
private final Logger log = LoggerFactory.getLogger(SleepySuite.class);
private final Integer defaultSleepSec = 0;
private final Integer sleepSec;
public SleepySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
super(klass, builder);
sleepSec = initSleep(klass);
}
private Integer initSleep(Class<?> klass) {
SleepSec ts = klass.getAnnotation(SleepSec.class);
Integer sleep = defaultSleepSec;
if (ts != null) {
sleep = ts.value();
log.debug("Configured with sleep time: {}s", sleep);
}
return sleep;
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface SleepSec {
public int value();
}
/**
* @see org.junit.runners.Suite#runChild(org.junit.runner.Runner, org.junit.runner.notification.RunNotifier)
*/
@Override
protected void runChild(Runner runner, RunNotifier notifier) {
super.runChild(runner, notifier);
//Simply wrapped Thread.sleep(long)
TestUtils.sleep(sleepSec);
}
}
您的套房〔實施例:
@RunWith(SleepySuite.class)
@Suite.SuiteClasses({
Some.class,
SomeOther.class
})
@SleepySuite.TimeoutSec(30)
public class YourSuite{
}
你是對的。耦合黑白測試用例是一種不好的做法。所以最後我將相關的測試方法轉移到私有方法中,從測試用例中將sleep()放入它們之間。 – 2012-02-03 02:22:59