简体   繁体   English

testng注释可以继承吗?

[英]can a testng annotation be inherited?

I'm trying to make an auto-test by testng + selenium, but now I'm stuck. 我正在尝试通过testng +硒进行自动测试,但现在我陷入了困境。

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. 当我运行testng时,它不起作用,因为未调用@beforeXXX和@afterXXX方法,并且启动了NPE。 The console also doesn't contain my output txt, just a lot of error message. 控制台也没有包含我的输出txt,只是很多错误消息。

Can you help me to fix this by modify my testng.xml or add some helper class? 您可以通过修改testng.xml或添加一些帮助器类来帮助我解决此问题吗?

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: testng.xml的配置如下:

<suite name="suite">
    <test name="test" verbose="5">
        <packages>
            <package name="base">
                <exclude name="LoginPageTest" />
            </package>
        </packages>
    </test>
</suite>

and the consolo output is: 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] Found an abstract class with no valid instance attached: class base.BasicTest [WARN]找到一个没有附加有效实例的抽象类:class base.BasicTest

[WARN] Found an abstract class with no valid instance attached: interface base.PrepareTestNG [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 at base.HomePageTest.verifyUserName(HomePageTest.java:57) base.HomePageTest.verifyUserName(HomePageTest.java:57)上的java.lang.NullPointerException

Java does not inherit Annotations without the @Inherited meta-annotation from interfaces, a pertinent question can be found here 如果没有接口的@Inherited元注释,Java不会继承注释,可以在此处找到相关的问题

So if you wanted to get inherited annotations you could write custom annotations that grant the functionality of the @beforeXXX or @afterXXX annotations that also have the @Inherited annotation 因此,如果您想获取继承的注释,则可以编写自定义注释,以授予同时具有@Inherited注释的@beforeXXX或@afterXXX注释的功能。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM