I'm trying to make an auto-test by testng + selenium, but now I'm stuck.
I have a interface and a base class and a test class. When I run testng it does not work because the @beforeXXX and @afterXXX methods is not invoked and the NPE is thow. The console also doesn't contain my output txt, just a lot of error message.
Can you help me to fix this by modify my testng.xml or add some helper class?
This is my interface
public interface PrepareTestNG {
@BeforeSuite
public abstract void beforeSuit();
@AfterSuite
public abstract void afterSuit();
@BeforeTest
public abstract void beforeTest();
@AfterTest
public abstract void afterTest();
@BeforeGroups
public abstract void beforeGroups();
@AfterGroups
public abstract void afterGroups();
@BeforeClass
public abstract void beforeClass();
@AfterClass
public abstract void afterClass();
@BeforeMethod
public abstract void beforeMethod();
@AfterMethod
public abstract void afterMethod();
}
This is my base class
public abstract class BasicTest implements PrepareTestNG {
protected WebDriver driver;
public void beforeSuit() {
System.out.println(">> suit ");
}
public void afterSuit() {
System.out.println("<< suit");
}
public final void beforeTest() {
driver = new HtmlUnitDriver(true);
System.out.println(">> test");
}
public final void afterTest() {
if (driver != null) {
driver.quit();
}
driver = null;
System.out.println("<< test");
}
@Test
public abstract void verifyUserName();
}
And this is my test class
public class HomePageTest extends BasicTest {
private Home homePage;
@Test
public void verifyTitle() {
Assert.assertEquals("商城首页", homePage.getTitle());
Assert.assertEquals(Url.HOME_PAGE, homePage.getUrl());
}
@Override
public void beforeGroups() {
System.out.println(">> group");
}
@Override
public void afterGroups() {
System.out.println("<< group");
}
@Override
public void beforeClass() {
driver.get(Url.HOME_PAGE);
homePage = new Home(driver);
System.out.println(">> class");
}
@Override
public void afterClass() {
homePage = null;
System.out.println("<< class");
}
@Override
public void beforeMethod() {
System.out.println(">> method");
}
@Override
public void afterMethod() {
System.out.println("<< method");
}
@Override
public void verifyUserName() {
Assert.assertEquals("nobody", homePage.getUserName());
}
}
The testng.xml is configed like this:
<suite name="suite">
<test name="test" verbose="5">
<packages>
<package name="base">
<exclude name="LoginPageTest" />
</package>
</packages>
</test>
</suite>
and the consolo output is:
[PackageUtils] Looking for test classes in the directory: G:\MyEclipse 2015 CI\PcMall\target\test-classes\base
[PackageUtils] Found class BasicTest, seeing it if it's included or excluded
[PackageUtils] ... Including class BasicTest
[PackageUtils] Found class HomePageTest, seeing it if it's included or excluded
[PackageUtils] ... Including class HomePageTest
[PackageUtils] Found class LoginPageTest, seeing it if it's included or excluded
[PackageUtils] ... Including class LoginPageTest
[PackageUtils] Found class PrepareTestNG, seeing it if it's included or excluded
[PackageUtils] ... Including class PrepareTestNG
[TestRunner] Running the tests in 'test' with parallel mode:false
[RunInfo] Adding method selector: org.testng.internal.XmlMethodSelector@97e111 priority: 10
[WARN] Found an abstract class with no valid instance attached: class base.BasicTest
[WARN] Found an abstract class with no valid instance attached: interface base.PrepareTestNG
[TestClass] Creating TestClass for [ClassImpl class=base.HomePageTest]
[TestClass] Adding method HomePageTest.verifyTitle()[pri:0, instance:null] on TestClass class base.HomePageTest
[TestClass] Adding method BasicTest.verifyUserName()[pri:0, instance:null] on TestClass class base.HomePageTest
[TestClass] Creating TestClass for [ClassImpl class=base.LoginPageTest]
[TestClass] Adding method LoginPageTest.verifyTitle()[pri:0, instance:null] on TestClass class base.LoginPageTest
[TestClass] Adding method BasicTest.verifyUserName()[pri:0, instance:null] on TestClass class base.LoginPageTest
[XmlMethodSelector] Including method base.verifyTitle()
[XmlMethodSelector] Including method base.verifyUserName()
[TestNG] Running:
G:\MyEclipse 2015 CI\PcMall\testng.xml
[SuiteRunner] Created 1 TestRunners
[TestRunner] Running test test on 2 classes, included groups:[] excluded groups:[]
===== Test class
base.HomePageTest
@Test HomePageTest.verifyTitle()[pri:0, instance:base.HomePageTest@dc4414]
@Test BasicTest.verifyUserName()[pri:0, instance:base.HomePageTest@dc4414]
======
===== Test class
base.LoginPageTest
@Test LoginPageTest.verifyTitle()[pri:0, instance:base.LoginPageTest@1e07d3e]
@Test BasicTest.verifyUserName()[pri:0, instance:base.LoginPageTest@1e07d3e]
======
[Invoker 21296251] Invoking base.BasicTest.verifyUserName
[Invoker 21296251] Invoking base.HomePageTest.verifyTitle
[Invoker 21296251] Invoking base.BasicTest.verifyUserName
[Invoker 21296251] Invoking base.LoginPageTest.verifyTitle
===== Invoked methods
BasicTest.verifyUserName()[pri:0, instance:base.HomePageTest@dc4414] 14435348
HomePageTest.verifyTitle()[pri:0, instance:base.HomePageTest@dc4414] 14435348
BasicTest.verifyUserName()[pri:0, instance:base.LoginPageTest@1e07d3e] 31489342
LoginPageTest.verifyTitle()[pri:0, instance:base.LoginPageTest@1e07d3e] 31489342
=====
Creating G:\MyEclipse 2015 CI\PcMall\test-output\suite\test.html
Creating G:\MyEclipse 2015 CI\PcMall\test-output\suite\test.xml
PASSED: verifyUserName
FAILED: verifyUserName