如何从另一个线程立即使TestNG测试失败?

时间:2013-12-13 15:32:24

标签: java multithreading testing testng

我想在Java测试框架中的不同线程中监视外部日志文件: 如果在其中一个受监视的日志文件中找到指定的模式,我的测试(在主线程中运行)应立即失败。

我试图中断我的测试运行的线程,但是我必须在每个测试步骤之后检查Thread.isInterrupted()

有没有正确的方法呢?

1 个答案:

答案 0 :(得分:3)

基本上,您不能以您想要的方式远程测试。关于打断线程的想法几乎是正确的做法,除非我避免中断,而是将事件发布到a LinkedBlockingQueue which you poll at the end of the test to see if it is empty or not

如果您想避免在每个测试方法中执行此操作,可以在使用@AfterMethod注释的方法中添加检查。

这样的事情:

public class YourTest {

 private LinkedBlockingQueue<String> errors;

 @BeforeMethod
 public void setUp() {
   errors = new LinkedBlockingQueue<>();
 }

 private void checkLogsForErrors(){
   // This is the method run in a separate thread.
   for (String line: iterateOverLogEntries()) {
     if (isError(line)) errors.add(line);
   }
 }

 @AfterMethod
 public void tearDown() {
   try {
     String error = errors.poll(100, TimeUnit.MILLISECONDS);
     fail("Found error: " + error);
   } catch (InterruptedException e){
     // No errors, great!
   }
 }

}

编辑:哦,对,立即。为什么不在一个单独的线程中运行测试代码本身并让原始线程只是等待来自日志观察器的错误信号,或者来自测试的成功信号?