Re: Timed Tests and Thread Safety
"s_soloff" <[email protected]> Sat, 25 May 2013 01:29:01 -0000
| Newsgroups | gmane.comp.java.junit.user |
|---|---|
| Message-ID | <[email protected]> |
--- In [email protected], Kevin Cooney <kcooney@...> wrote: > Note the Timeout rule will call @Before and @After methods in the > same thread as the test. The test class is created before rules are > applied, so if your test class initializes fields at declaration > time, that execution would happen in a different thread than the > test. > > I also believe that @After methods would not be called for tests > methods that timeout in classes that use the Timeout rule. @Kevin: I feel like a fool. I actually "discovered" rules during this exercise and spent some time changing legacy @Test(timeout = ...) tests to use a fixture-level Timeout @Rule. However, I just assumed that the threading behavior between the two was the same. :( Based on your information, I ran some more tests to nail down on which thread the various parts of the fixture are executed using both models. The results are summarized below (from JUnit 4.8.2). @Test with timeout element: A1. ctor run on main thread A2. @BeforeClass, @Before, @After, @AfterClass run on main thread A3. @Test run on worker thread A4. @After, @AfterClass run on main thread if test times out Timeout @Rule: B1. ctor run on main thread B2. @BeforeClass, @AfterClass run on main thread B3. @Before, @Test, @After run on worker thread B4. @After NOT run if test times out B5. @AfterClass run on main thread if test times out Given these results, using Timeout @Rules satisfies my concerns about thread safety and gives me even more motivation to use them over @Test(timeout = ...). Thanks! (Note sure if item [B4] is intentional, but I can live with it for now.) --- In [email protected], David Saff <saff@...> wrote: > The biggest payoff would probably be to make sure that the > documentation we have makes it easy to avoid any unexpected > behavior. Can you suggest an edit to that effect? @David: Your suggestion for updating the documentation is probably the best solution based on the preferred behavior of the Timeout @Rule. Below is my cut at a second paragraph I'd add to the Javadocs for the @Test annotation's timeout element. Please edit as you see fit. THREAD SAFETY WARNING. Test methods with a timeout parameter are run in a thread other than the thread which runs the fixture's @Before and @After methods. This may yield different behavior for code that is not thread safe when compared to the same test method without a timeout parameter. Consider using the org.junit.rules.Timeout rule instead, which ensures a test method is run on the same thread as the fixture's @Before and @After methods. Thanks again for all the feedback, Steve ------------------------------------ Yahoo! Groups Links <*> To visit your group on the web, go to: http://groups.yahoo.com/group/junit/ <*> Your email settings: Individual Email | Traditional <*> To change settings online go to: http://groups.yahoo.com/group/junit/join (Yahoo! ID required) <*> To change settings via email: [email protected] [email protected] <*> To unsubscribe from this group, send an email to: [email protected] <*> Your use of Yahoo! Groups is subject to: http://docs.yahoo.com/info/terms/