Я пытаюсь сделать авто-тест testng + selenium, но теперь я застрял.
У меня есть интерфейс, базовый класс и тестовый класс. Когда я запускаю testng, он не работает, потому что методы @beforeXXX и @afterXXX не вызываются, а NPE - thow. Консоль также не содержит мой выходной txt, просто сообщение об ошибке.
Можете ли вы помочь мне исправить это, изменив мой testng.xml или добавив некоторый вспомогательный класс?
Это мой интерфейс
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();
}
Это мой базовый класс
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();
}
И это мой тестовый класс
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());
}
}
Testng.xml настраивается следующим образом:
<suite name="suite">
<test name="test" verbose="5">
<packages>
<package name="base">
<exclude name="LoginPageTest" />
</package>
</packages>
</test>
</suite>
и вывод consolo:
[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 included or excluded
[PackageUtils] ... Including class BasicTest
[PackageUtils] Found class HomePageTest, seeing it if it included or excluded
[PackageUtils] ... Including class HomePageTest
[PackageUtils] Found class LoginPageTest, seeing it if it included or excluded
[PackageUtils] ... Including class LoginPageTest
[PackageUtils] Found class PrepareTestNG, seeing it if it 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
[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
Java не наследует аннотации без @Inherited мета-аннотаций из интерфейсов, улокальный вопрос можно найти здесь
Поэтому, если вы хотите получить унаследованные аннотации, вы можете написать специальные аннотации, которые предоставляют функциональные возможности аннотаций @beforeXXX или @afterXXX, которые также имеют аннотацию @Inherited