所以我有一个测试用例,我想把它变成一个线程。我无法扩展Thread也无法实现runnable,因为TestCase已经有一个方法void run()。我得到的编译错误是Error(62,17): method run() in class com.util.SeleneseTestCase cannot override method run() in class junit.framework.TestCase with different return type, was class junit.framework.TestResult
。
我要做的是将Selenium测试用例扩展到压力测试。我目前无法使用selenium grid / pushtotest.com / amazon云(安装问题/安装时间/资源问题)。所以这对我来说更像是一个Java语言问题。
FYI: SeleniumTestCase是我想要多线程扩展以进行压力测试的。 SelniumTestCase扩展了TestCase(来自junit)。我正在扩展SeleniumTestCase并尝试使其实现Runnable。
答案 0 :(得分:6)
创建一个实现Runnable的内部类,并在com.util.SeleneseTestCase run()方法中从一个新的Thread调用它。像这样:
class YourTestCase extends SeleneseTestCase {
public class MyRunnable implements Runnable {
public void run() {
// Do your have work here
}
}
public void testMethodToExecuteInThread() {
MyRunnable r = new MyRunnable();
Thread t = new Thread(r);
t.start();
}
}
更新以在YourTestCase类之外使用
要从另一个类运行内部类,您需要将其设为公共,然后从外部类执行此操作:
YourTestCase testCase = new YourTestCase();
YourTestCase.MyRunnable r = testCase.new MyRunnable();
但是如果你不需要在测试用例中调用它,你最好使用普通类,使MyRunnable成为公共类,而不是在YourTestCase中。
希望它有所帮助。
答案 1 :(得分:4)
在这种情况下,您没有其他选项:您必须委托给另一个对象而不是继承。
答案 2 :(得分:1)
请记住,如果线程抛出任何异常,则测试不一定会失败。您可能希望使用Runnable
而不是Thread
和ExecutorService.submit(Callable<T>)
:
public class SeleneseTestCase extends SeleniumTestCase {
private class StressServer implements Callable<Void> {
public Void call() {
// do your work here
return null;
}
}
public void testUnderLoad() throws Exception {
ExecutorService executorService = Executors.newFixedThreadPool(
NUM_CONCURRENT_WORKERS);
List<Callable<Void>> stressers = new ArrayList<Callable<Void>>();
for (int i = 0; i < NUM_WORKERS; i++) }
stressers.add(new StressServer());
}
List<Future<Void>> futures =if ( executorService.invokeAll(
stressers, TIMEOUT_IN_SECS, TimeUnit.SECONDS);
for (Future<Void> future : futures) {
if (!future.isCancelled()) {
future.get(1, TimeUnit.MILLISECONDS); // may throw exception
}
}
executorService.shutdown();
}
}
请注意,如果您希望工作人员返回结果,您可以将StressServer
的类型更改为Callable<YourResultType>
答案 3 :(得分:0)
无论如何,扩展TestCase几乎肯定不是正确的OO模型。模型与“有一个”不是“是一个”。也就是说,创建一个扩展线程的新类,并在测试方法中使用该类的实例。