My setup:
- A TestBase class containing a @BeforeClass method
- Several Test classes extending from TestBase class and also containing a @BeforeClass method
- testNG 6.8.8
Why this setup?:
- I need the @BeforeClass in the TestBase class to provide setup that all testclasses will need and I don't want to repeat in every Test class. For example thread-id-dependent login credentials.
- TestBase class also instantiates the Selenium WebDriver
- I need the @BeforeClass in the Test classes to initialize everything that all @Test methods will need to use but that only needs to (or must) be built/invoked once for all tests. This includes calls to said WebDriver instance (that's why a "normal" constructor doesn't work here)
Here's what happens:
When I run the tests via a testNG xml file and there is an exception within the @BeforeClass method of one of the Test classes, then all subsequent Test classes are skipped by TestNG.
Why does this happen? How to prevent it?
When I change the annotation in the TestBase class to @BeforeSuite for example, then all tests are run, even if there is an exception in on of the @BeforeClass methods.
Example:
When you run the xml file, complete RunAllTestClasses02 class is skipped.
testNG xml file:
<?xml version="1.0" encoding="UTF-8"?>
<suite name = "MiscSuite">
<test name = "MiscTest">
<classes >
<class name="drkthng.misc.RunAllTestClasses01" />
<class name="drkthng.misc.RunAllTestClasses02" />
</classes>
</test>
</suite>
TestBase class with a @BeforeClass method:
public abstract class RunAllTestClassesBase {
@BeforeClass
public void beforeClass() {
// do something that all Test classes will need
}
}
Test class that throws Exception within @BeforeClass method:
public class RunAllTestClasses01 extends RunAllTestClassesBase {
@BeforeClass
public void beforeClass() {
Assert.assertTrue(false);
}
@Test
public void Test01() {
Assert.assertTrue(true);
}
}
@BeforeClass
and it fails, hence the execution is stopped. To over come this, you could annotate your tests withalwaysRun
, that by the docs :alwaysRun If set to true, this test method will always be run even if it depends on a method that failed.
I have not tested this myself, let me know how it works out for you. – Erki M.