如何在单线程旁边运行多线程testng

时间:2013-07-30 18:27:09

标签: java multithreading testng single-threaded

我正在使用testng运行一系列测试,并在parallel="classes"级别运行它们。问题是我希望3-4个类总是在同一个线程上运行(单线程)。所有其他类都可以在任何线程上运行,我不在乎。 有没有办法做到这一点?

Example: A B and C need to be ran one-at-a-time. All other classes will be denoted by numbers. 
 Threads running at one time:    
    A 3 7 2 - A would run while 3 other classes run
    C 8 4 1 - B would run once A is done, (other threads dont matter)
    B 5 9 6 - C would run once B is done.

有关更多信息,我有3-4个类不能并行运行,因为他们做了什么,我基本上只想让它们一次运行一个,并且想要保证这些类中只有一个是永远的马上跑。我可以在任何给定的时间以任何顺序运行我的所有其他类,没有任何问题。

我知道我可以与组级别并行设置,但是我必须将随机无意义的组​​添加到我的所有其他类中,以便它们在此期间运行。也许有一种方法可以将一个线程组单个并与另一个组并行?

我目前正在运行4个主题并且有大约50个类。

有什么想法吗?

- 根据评论添加了要求/想法 -

我尝试这样做的主要原因是我正在测试服务器API。一些调用在服务器端需要很长时间,所以当我等待响应时,我也可以发送一些其他调用,因此多线程。我将所有测试转换为多线程运行,以便在整个测试套件中节省非常大的时间。它工作得很好,但是这四个类不能同时在服务器上抛出,否则会导致测试失败。 注意:我知道一种方法是“修复这些类以便它们可以并行工作”并且我已经尝试过,并且如果可能的话将会继续,但这是一个不同的长篇故事,让我们现在假设不是可能的。

因此,几乎所有的时间都是如此。解决方案本质上是通过睡眠我不感兴趣的所有其他线程来运行单线程,因为这会破坏整个目的。

2 个答案:

答案 0 :(得分:1)

您可以将它们全部绑定到同一个cpu。这意味着它们无法在当时运行。

问题是,只有一个计时器运行时很少。相反,你应该在这些线程之间使用锁定,这样他们就可以在已知的点上以一种你可以推理的方式移交执行。

答案 1 :(得分:1)

经过多次努力尝试找到解决方法之后,我更清楚地阅读了TestNG规范并找到了解决方案。它其实很简单。 <suite>具有并行级别,<test>也是如此 这让我想到了以下

<suite name="testSuite" parallel="tests" thread-count="4">
   <test name="foo" parallel="classes" thread-count="3">
     .. (classes you want to include)
   </test>
   <test name="bar">  <!-- this runs single threaded because there is no parallel tag>
     .. (classes you want to run single threaded)
   </test>
</suite>