2012-12-17 98 views
2

我目前正在测试一个Java接口,它可以使用Java调用R调用。因此我需要一个连接,它也封装了一个进程。
现在我需要知道,JUnit如何处理这些单元测试。我使用JUnit4,它的@Before@After注释在每个测试中初始化一个新连接(内部是一个进程)。
随着我“怎么JUnit的过程”的意思是:JUnit如何处理单元测试?

  • 每测试在它自己的线程中执行? (这可能会导致问题)
  • 是那些按顺序执行的测试?
  • 他们有一个特定的顺序(不是那么重要,但会很高兴地知道)

我担心的是,这些测试可能会导致这将不存在,如果使用得当(如记录)的问题一个真实的环境。

+1

这可能有些用处:http://garygregory.wordpress.com/2011/09/25/understaning-junit-method-order-execution/ –

+0

+1 for @ Before/AfterClass因为这是。我也在寻找(前段时间),但在这种情况下,我希望每个测试都能初始化它自己的资源。 – Zhedar

回答

2

测试按顺序执行。你不应该依赖这个事实,因为这表明你不是写一个纯粹的单元测试,而是创建了一个反模式(就测试而言)。每个测试都必须是其自己独立的一部分工作,并且除AfterBefore初始化外没有任何外部依赖关系。我相信每个测试都是在自己的线程中执行的,再次回到您的测试套件,而不是纯粹的单元测试。

我担心的是,如果在真实环境中正确使用(如文档所述),那些测试可能会导致不存在 的问题。

单元测试验证一个小片的功能的,通常一个可能的逻辑支路。如果你想测试系统集成,你将需要做所谓的集成测试。此外,如果你正在寻找做多线程测试,我强烈建议:Multi-threaded TC

+0

我只在这些测试中测试单个函数。但是,如果它们并行执行,我从这个过程中得到的答案可能会混淆。这就是为什么我想确保它能像我想要的那样工作。 – Zhedar

+0

@Zhedar是的,前后都会否认任何初始化出血。 – Woot4Moo

+0

这是否意味着在最后的@ @ After之前不会有一个新的'@ Before'调用(所以一个新的测试准备好)?这会让事情变得更容易。 – Zhedar

1

我相信,除非另有规定,否则JUnit可以自由使用尽可能多的线程来运行你的单元测试。您可以将其限制为单个线程。顺序对于在什么时候运行哪些测试是任意的。从理论上讲,如果从不同的线程运行,你的测试应该是线程安全的,以避免出现不确定性问题。

+0

你有一些关于限制它只使用一个线程的来源吗?时间并不是关键因素,所以这可能是一个选择。 – Zhedar

1
  • 是在它自己的线程中执行的每个测试吗? (这可能会导致问题) - 所有测试的一个线程
  • 是那些按顺序执行的测试? -
  • 他们有一个特定的顺序(不是那么重要,但会很高兴地知道) - 没有,这主要是不可能事先知道这个类中@测试方法处理的顺序。但是使用@规则,你可以读取它们序列中当前测试的编号

  • 当然,我们正在讨论一个类中的不同测试。

+1

超时会打破“所有测试的一个线程”行为,尽管它们使它们保持顺序。 – ptyx

+0

@ptyx谢谢你,我会看看它。 – Gangnus

1

对于每个测试类:

  1. 呼叫@BeforeClass和/或@ClassRule注释。
  2. 对于每个测试(@Test):
    1. 创建该类的一个实例
    2. 呼叫@Before和/或注释@rule
    3. 呼叫测试方法
    4. 呼叫@After和/或@rule注释
  3. 调用@AfterClass或@ClassRule注释。

通常情况下,一切工作都来自同一个线程 - 但不要依赖于某些规则(超时)将分叉线程 - 您可以决定并行运行测试。