可以继承testng注释吗?

时间:2015-03-24 14:13:23

标签: java annotations testng

我正在尝试通过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'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]找到一个没有附加有效实例的抽象类: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

base.HomePageTest.verifyUserName(HomePageTest.java:57)中的java.lang.NullPointerException

1 个答案:

答案 0 :(得分:0)

如果没有来自接口的@Inherited元注释,Java不会继承注释,可以找到相关的问题here

因此,如果您想获得继承注释,您可以编写自定义注释,授予@beforeXXX或@afterXXX注释的功能,这些注释也具有@Inherited注释

相关问题