Можно ли наследовать тестовую аннотацию?

1

Я пытаюсь сделать авто-тест 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

[WARN] Найден абстрактный класс без присоединенного действительного экземпляра: class base.BasicTest

[WARN] Найден абстрактный класс без присоединенного действительного экземпляра: 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

java.lang.NullPointerException в базе.HomePageTest.verifyUserName(HomePageTest.java:57)

Теги:
testng
annotations

1 ответ

0

Java не наследует аннотации без @Inherited мета-аннотаций из интерфейсов, улокальный вопрос можно найти здесь

Поэтому, если вы хотите получить унаследованные аннотации, вы можете написать специальные аннотации, которые предоставляют функциональные возможности аннотаций @beforeXXX или @afterXXX, которые также имеют аннотацию @Inherited

Ещё вопросы

Сообщество Overcoder
Наверх
Меню